Servlet
创建
- 新建一个类,继承Servlet接口
public class TestServlet2 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
-
配置
-
方法一:在webapp/WEB-INF/web.xml中添加配置
<servlet> <servlet-name>test</servlet-name> <servlet-class>TestServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
-
方法二:3.0注解配置
//在类上使用WebServlet注解 @WebServlet("/demo1") public class TestServlet2 implements Servlet{ ... }
-
原理
- 浏览器根据网址找到具体的主机,根据后缀找到虚拟路径还有资源名称
- tomcat检索web.xml中找到和资源名称相同的url-pattern获得对应servlet-name
- tomcat根据servlet-name找到对应servlet-class
- tomcat将全类名对应的字节码文件加载进内存(反射)
Class.forName()
- 创建对象
cls.newInstance())
- 调用类中的service方法
生命周期方法
init
-
初始化方法
-
在Servlet被创建时执行,只会执行一次
-
默认情况下,第一次访问时Servlet被创建
-
可以在web.xml中指定Servlet的创建时机
-
<load-on-startup>0</load-on-startup> <!--非0时服务器启动时创建-->
-
-
只执行一次,说明Servlet在内存中是单例的
- 所以多用户同时访问时可能会产生多线程安全问题
- 解决:尽量不要在Servlet中定义成员变量,且不要修改成员变量的值
service
- 提供服务的方法
- 每一次Servlet被访问时执行,可以执行多次
- tomcat服务器创建request和response对象后会传递service方法,然后调用service方法
- 响应时,服务器从response对象中拿出想要消息数据给浏览器
destroy
-
销毁方法
-
在Servlet被销毁时执行(即服务器正常关闭时),执行一次
- 只有服务器正常关闭之前才会执行
Request & Response
@WebServlet("/demo2")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{
}
}
Request:获取请求消息
-
-
获取请求头
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ Enumeration<String> headerNames = request.getHeaderNames();//获取请求体数据 while(headerNames.hasMoreElements()){ String name = headerNames.nextElement(); String value = request.getHeader(name); } }
-
获取请求体数据:用BufferReader
-
获取前端参数
-
request.getParameter("Key"); request.getParameterValues("Key");
-
-
请求转发
-
request.getRequestDispatcher("/demo2").forward(request,response);
-
Response:设置响应消息
-
重定向
-
response.sendRedirect("/demo3");
-
-
转发与重定向的区别
-
转发是一次请求,重定向是两次
-
转发不改变url,重定向会
-
请求转发在服务器完成,重定向在客户端完成
-
转发的url必须是当前web工程的内部地址,重定向可以是任意地址
-
-
设置响应头
-
//void setHeader(String name, String value) response.setHeader("name","value");
-
用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在
-
-
设置响应行
-
response.setStatus(响应状态码);
-
-
设置响应体
-
PrintWriter writer = response.getWriter(); writer.write("页面输出内容");
-