1. 引言
Servlet是一种小型的Java程序,它扩展了Web服务器的功能。(作用:收集数据,处理请求,跳转页面)
2. 创建
详见代码
3. 路径
<url-pattern>/demo</url-pattern>
注意:1.url-pattern中的路径前面必须加/或*
2.优先级:精确匹配优先级最高,模糊匹配次之。模糊匹配中*.xxx优先级最低。
A. 精确匹配路径前加 /
配置:<url-pattern>/demo</url-pattern>
Url:http://localhost:8080/day10ee/demo
B. 模糊匹配 * (通配符)
配置:<url-pattern>/demo/*</url-pattern>
Url:http://localhost:8080/day10ee/demo/(后面任意)
配置:<url-pattern>/*</url-pattern>
同<url-pattern>/</url-pattern>
Url:http://localhost:8080/day10ee/demo/(后面任意)
配置:<url-pattern>*.html</url-pattern>(伪静态)
Url:http://localhost:8080/day10ee/(任意).html
配置:<url-pattern>/demo/*.html</url-pattern> //错误:语法错误
4. Servlet访问过程
例如:Url:http://localhost:8080/day10ee/index.html
1. 根据localhost在host文件中找到本地回环地址(127.0.0.1)
2. 根据8080找到tomcat
3. 在webapps找到day10ee项目
4. 在项目的web.xml中找有没有匹配/index.html的url-pattern
如果找到了,则根据映射找到Servlet的Class
如果没找到呢?
没找到则找服务器中的缺省Servlet(默认Servlet),缺省Servlet会在静态资源中查找资源,如找到则将资源返回给浏览器,如没找到,则将404页面返回给浏览器。
5. Servlet生命周期(对象从创建到销毁的过程)
生命周期方法
public void init(ServletConfig config)
public void service(ServletRequest arg0, ServletResponse arg1)
public void destroy()
当第一次访问Servlet时,创建对象并初始化,之后每次访问只执行service(),
当服务器关闭时,调用destroy();
注:Servlet对象是单例的。
/**
* 如果需要给Servlet进行初始化,使用无参的init()
*/
@Override
public void init() throws ServletException {}
#提前加载Servlet
因为第一次访问Servlet时,才创建对象,所有第一次加载Servlet较慢,为了提高效率,可以在访问之前创建对象(在服务器启动时创建对象)
在当前Servlet的配置中添加配置
<load-on-startup>1</load-on-startup> //数字越大优先级越低。
6. Servlet线程安全问题
因为Servlet是单例的,多个线程访问该Servlet时,如果使用了共享数据,且多条语句操作该数据,那么+可能产生安全问题,为解决此问题,建议使用同步代码块,将涉及安全问题的语句包起来。
7. ServletConfig
ServletConfig:当前servlet的配置对象,在其他Servlet中不能得到该Servlet的配置信息。
#获取ServletConfig对象
// 得到当前Servlet的配置对象
ServletConfig config = this.getServletConfig();
#常用方法
//根据参数名得到参数值
config.getInitParameter("path");
//得到所有参数名
config.getInitParameterNames();
//得到当前Servlet的名字
config.getServletName();
//得到ServletContext对象的方法
config.getServletContext();
8. ServletContext
理解:Servlet上下文对象。它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
#创建对象
A. //获取ServletContext对象
ServletContext context = this.getServletContext();
B. //获取全局配置信息
//根据参数名得到参数值
context.getInitParameter("path");
//得到所有参数名
context.getInitParameterNames();
C. //获取当前应用名称
String path = context.getContextPath();
D. //作为域对象使用
//域对象可以保存数据和读取数据,可以在不同的动态资源中共享数据.
//保存数据
//context.setAttribute(arg0, arg1)
//读取数据
//context.getAttribute(arg0)
//删除数据
//context.removeAttribute(arg0)
共享数据方式1
//使用?传值(仿get提交)
//缺点:不能传递实体
res.sendRedirect("day10web/context1?name=lisi");
共享数据方式2
//使用域对象
保存
Student stu = new Student("list",21);
context.setAttribute("student", stu);
res.sendRedirect("/day10web/context1");
获取
ServletContext context = this.getServletContext();
Object obj = context.getAttribute("student");
if(obj!=null){
Student stu = (Student)obj;
System.out.println("name="+stu.getName()+
",age="+stu.getAge());
}
E. 转发
//处理转发 只要是当前web应用程序内,可以转发到Servlet或html
RequestDispatcher dis = context.getRequestDispatcher("/context1");
dis.forward(req, res);
//简写如下
//context.getRequestDispatcher("/context1").forward(req, res);
转发和重定向的区别:
转发:
A) 地址栏内容不改变
B) 转发时会将请求和响应数据转到新的资源中。
C) 只能转发到当前web应用程序中。(地址不需要加项目名)
重定向:
A) 地址栏内容改变
B) 重定向时请求为新的请求
C) 能重定向到当前web中或其他web中,或互联网中的资源。(地址需要加项目名)
8. 常用域对象(作用域不同)
ServletContext
HttpServletRequest//转发时使用,使用方法同ServletContext
HttpSession
PageContext
/**
* JspWriter 和 PrintWriter区别:
* PrintWriter相当于一个字节输出流对象
* 而JspWriter是带有缓冲区的PrintWriter
*
*/