Servlet 是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”模型来访问这个驻留在服务器内存里的Servlet程序。
Tomcat 容器层次
request.getContextPath()获取上下文对象
编写Servlet
- 继承HttpServlet
- 重写doGet()或者doPost()方法
- 在web.xml中注册Servlet 或者 注解
Servlet(Interface):三个方法init(),service(),destroy()
GenericServlet(Abstract Class):与协议无关的Servlet
HttpServlet(Abstract Class):实现了Http协议的Servlet
自定义Servlet:一般重写(覆盖)doGet与doPost方法
【实例】
index.jsp
<body>
<a href="servlet/HelloServlet">Get方式请求Servlet</a>
<form action="servlet/HelloServlet" method="post">
<input type="submit" value="Post方式请求Servlet"/>
</form>
</body>
HelloServlet
//使用注解则不需要配置xml
@WebServlet(name = "HelloServlet",urlPatterns = "/servlet/HelloServlet")
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理Get()请求...");
PrintWriter out=response.getWriter();
out.println("<b>hello</b>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("处理Post()请求...");
PrintWriter out=response.getWriter();
out.println("<b>hello</b>");
}
}
web.xml(使用注解则不需要此部分)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
生命周期
servlet生命周期阶段包括初始化、加载、实例化、服务和销毁。
- 初始化阶段,调用init()方法
- 响应客户端请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法
- 终止阶段,调用destroy()方法
Servlet 生命周期
在下列时刻Servlet容器装在Servlet:
- Servlet容器启动时自动装在某些Servlet,实现它需要在web.xml中
<servlet></servlet>
之间添加一下代码:<loadon-startup></loadon-startup>
,数字越小表示优先级别越高。 - Servlet容器启动后,客户首次向Servlet发送请求
- Servlet类文件被更新后,重新装载Servlet
- Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。
servlet 与 jsp九大内置对象
jsp对象 | servlet获得 |
---|---|
out | resp.getWriter() |
request | service方法中的req参数 |
response | service方法中的resp参数 |
session | req.getSession() |
application | getServletContext() |
exception | Throwable |
page | this |
pageContext | pageContext |
Config | getServletConfig |
Servlet的路径跳转
JSP跳转到Servlet(JSP内)
1.相对路径
如href="servlet/TestServlet"
如果写成href="/servlet/TestServlet"
会报错,因为第一个/
表示的是服务器根目录
2.绝对路径
通过内置成员变量path实现,如href="<%=path%>/servlet/TestServlet"
path
得到的是项目根目录,如http://localhost:8080/ServletDemo
Servlet跳转JSP(Servlet内)
1.请求重定向
response.sendRedirect(request.getContextPath()+"/xxx.jsp")
request.getContextPath()
获得项目根目录,或者通过../xxx.jsp
取得上层路径得到
2.服务器内部转发:
request.getRequestDispatcher("../xxx.jsp").forward(req,resp);
request.getRequestDispatcher("/test.jsp").forward(request, response); //斜线表示项目的根目录
小结:Servlet都可以通过../xxx.jsp获取路径
web.xml的路径(web.xml内)
web.xml的<url-pattern>
必须以/
开头,/
表示项目的根目录
Model2
Model2