写一个普通类,继承HttpServlet类
重写doxx方法
在web.xml中配置servlet
<servlet>
<servlet-name>LoginServlet</servlet-name> servlt的别名
<servlet-class>dx.servlet.LoginServlet</servlet-class> servlet的全限定类名字符串
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name> 指定servlt的别名
<url-pattern>/hello</url-pattern> 分配一个url供用户调用
</servlet-mapping>
映射路径的配置规则:1.精准匹配 2.模糊匹配
现象:输入网址知识/的话,会默认打开index.jsp
作用:通过设置缺省的路径,可实现输入域名即可访问入口界面(首页)的效果
原理:查看tomcat的conf目录的web.xml文件,代码如下
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这个功能的实现,是由一个名为DefaultServlet的servlet在起作用
缺省servlet会默认查找配置文件中的欢迎页面列表,如果找到就显示,找不到显示404
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
方法一
方法二
在自己项目的web.xml文件中添加这段配置信息即可,修改仅针对当前项目
<welcome-file-list>
<welcome-file>hello.html</welcome-file>
</welcome-file-list>
注意:如果自己配置的servlet的url也是/,那么会覆盖缺省servlet的配置
注意:
servlet的对象默认是用户第一次访问的时候创建的,我们希望对象随着tomcat的启动而创建
实现自动加载:
<load-on-startup>1</load-on-startup>
注意:
servlet是单例多线程的,体现了设计模式的单例模式
配置初始化参数
<servlet>
<servlet-name>app4</servlet-name>
<servlet-class>com.bjpowernode.servlet.App4Servlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app4</servlet-name>
<url-pattern>/app4</url-pattern>
</servlet-mapping>
获取初始化参数
// 1. 获取servlet-name属性
String name = config.getServletName();
// 2. 获取servlet的初始化参数
String debug = config.getInitParameter("debug");
String listings = config.getInitParameter("listings");
// 3.获取所有的初始化参数
Enumeration<String> names = config.getInitParameterNames();
while (names.hasMoreElements()){
String key = names.nextElement();
String value = config.getInitParameter(key);
}
ServletContext:servlet的上下文对象,servlet的运行环境
创建: tomcat在web容器启动的时候创建,只会创建一个
获取:
在init方法中,通过servletConfig对象的getServletContext()获取
在doxx方法中,通过Request对象的getServletContext()获取
ServletContext context = req.getServletContext();
域相关的方法:
获取初始化参数相关:
getInitParameter(String name): 根据初始化参数名称获取值
<!-- web.xml中配置全局初始化参数 -->
<context-param>
<param-name>user</param-name>
<param-value>root</param-value>
</context-param>
// 获取全局初始化参数
String user = context.getInitParameter("user");
getInitParameterNames(): 获取所有的初始化参数名称集合
其他
web项目中,使用流读取资源的时候需要绝对路径,相对路往往找不到资源
// 1.获取servletContext对象
ServletContext context = req.getServletContext();
// 2.创建输入流读取资源文件
//方式一
String path = context.getRealPath("/upload/db.properties");//这里的参数是一个相对路径
FileInputStream fis = new FileInputStream(path);
//方式二
InputStream fis = context.getResourceAsStream("/upload/db.properties");
// 3.创建Properties对象加载文件内容
Properties properties = new Properties();
properties.load(fis);
// 4.获取文件内容
String user = properties.getProperty("user");
String pass = properties.getProperty("pass");
配置文件一般保存在resources目录下,最终会被编译在classes目录下面,所以classes目录下的配置文件一般可以使用如下路径:/WEB-INF/classes/db2.properties
如果读取classes目录下的文件,可以使用当前类的类加载器读取:
InputStream is = MyServlet.class.getClassLoader().getResourceAsStream("db2.properties");
转发的两种实现方式
context.getRequestDispatcher("/app11").forward(req,resp);
req.getRequestDispatcher("/app1.html").forward(req,resp);
举例
// 1.获取servletContext对象
ServletContext context = req.getServletContext();
// 2.使用转发访问app1.html
context.getRequestDispatcher("/app1.html").forward(req,resp);
// 3.使用转发访问servlet
context.getRequestDispatcher("/app11").forward(req,resp);
// 4.使用转发访问baidu
//java.lang.IllegalArgumentException: 路径[https://www.baidu.com]不以“/”字符开头
// 转发的资源只能是项目内的资源
context.getRequestDispatcher("https://www.baidu.com").forward(req,resp);
// 5.使用请求实现转发操作
req.getRequestDispatcher("/app1.html").forward(req,resp);
转发和重定向的区别:
转发的资源只能是项目内部的(静态和动态资源)
重定向的资源可以是内部的,可以是外部的
转发只请求一次,转发访问新资源使用的是原有的请求和响应,所以只请求了一次
重定向请求了两次,重定向访问新资源使用新的请求和响应,所以请求了两次
转发访问资源不会导致地址栏中的url发生改变
重定向访问资源会导致地址栏中的url发生改变