Servlet
java编写的,服务器端执行,用来扩展服务器功能,web组件
- Servlet继承关系
Servlet接口:定义了servlet规范,定义了servlet的生命周期方法,实现Servlet接口的类都叫Servlet
GenericServlet类:是Servlet接口的实现类,实现了Servlet接口中的大部分方法,只有service方法没有实现
HttpServlet类:GenericServlet的子类,针对http协议的Servlet,重写了父类的service方法,针对http协议定义了特定的处理方法,根据客户端的请求,调用不同的处理方法doGet(),doPost() - 状态码
200--------ok
400~499----------页面错误状态码
500~599----------服务器内部错误
404---------资源未找到
405---------发送请求方式与处理方式不一致
500---------代码错误 - 乱码
get请求乱码
String str = request.getParameter(“name”);
new String(str.getBytes(“ISO-8859-1”),“UTF-8”);
post请求乱码
request.setCharacterEncoding(“utf-8”); - 请求转发和重定向
请求转发属于服务器端的行为,重定向属于客户端的行为
请求转发url地址不变,重定向url地址改变
请求转发可以通过request传递数据,重定向不能用request传递数据
请求转发不能跨应用,重定向能跨应用 - servlet生命周期
服务器管理servlet的生命周期
如果没有配置loadOnStartup,则在服务器接收到客户端对该servlet的第一次请求时,创建servlet对象
创建完servlet对象(构造方法)后,紧接着执行init()方法
执行完init()方法后,执行service()方法,处理请求
默认情况下,servlet在服务器关闭时销毁,当该servlet对象长时间没有被调用,也会被回收
如果需要在servlet对象销毁前执行一些代码,则把这些代码写在destroy()方法中
如果配置了loadOnStartup,则在服务器开启时创建该servlet对象,紧接着执行init()方法
当接收到对该servlet的请求时,调用service()方法进行处理
@WebServlet(urlPatterns= {"/demo3"},loadOnStartup=0)
public class DemoServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
public DemoServlet3() {
System.out.println("创建对象DemoServlet3");
}
@Override
public void init() throws ServletException {
System.out.println("DemoServlet3-init");
}
}
- ServletConfig对象
作用:用来获取在web.xml中给每一个servlet局部配置的数据
6.1 在web.xml中配置
//web.xml中
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.java.servlet.DemoServlet2</servlet-class>
<init-param>
<param-name>fileName</param-name>
<param-value>dbcp.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
public class DemoServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
private String fileName;
@Override
public void init() throws ServletException {
//1.获取ServletConfig对象
ServletConfig sc = this.getServletConfig();
//2.获取属性值方法
fileName = sc.getInitParameter("fileName");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(fileName);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.2 在servlet注解中配置
@WebServlet(urlPatterns= {"/demo4"},
initParams= {
@WebInitParam(name="name1", value="zhou1"),
@WebInitParam(name="name2", value="zhou2"),
})
public class DemoServlet4 extends HttpServlet {
private static final long serialVersionUID = 1L;
private String name1;
private String name2;
@Override
public void init() throws ServletException {
ServletConfig sc = this.getServletConfig();
name1 = sc.getInitParameter("name1");
name2 = sc.getInitParameter("name2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(name1+","+name2);;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- ServletContext对象
ServletContext表示web应用对象
有且只有一个
生命周期:web应用发布到服务器上,由服务器创建该对象;服务器关闭或者从服务器上移除web应用,对象销毁
7.1 配置web应用的初始化参数,在整个web应用的组件都可以访问
//web.xml
<context-param>
<param-name>name</param-name>
<param-value>demo.txt</param-value>
</context-param>
@WebServlet("/demo5")
public class DemoServlet5 extends HttpServlet {
private static final long serialVersionUID = 1L;
private String name;
@Override
public void init() throws ServletException {
//1.获取ServletContext对象
ServletContext sc = this.getServletContext();
//2.获取初始化参数
name = sc.getInitParameter("name");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.2 使用ServletContext对象完成数据共享
数据存储
sc.setAttribute(“str”, “ServletContext对象学习”);
获取数据
sc.getAttribute(“str”);
8. servlet工作模式
单例、多线程
当有多个用户同时请求同一个servlet时,只创建一个servlet对象,通过给每个用户创建一个线程,来调用各自的service方法运行。