一. 什么是servlet
- servlet是在服务器上运行的小程序。一个servlet就是一个java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的servlet程序。
- jsp的前身就是servlet
二. Tomcat容器等级
Tomcat容器分为四个等级:
1)Container 容器,集装箱
2)Engine 引擎容器
3)Host 主机()
4)Servlet容器(tomcat最低级别的容器)里面包含了一个或多个Context
—— Context (上下文,背景,环境) 一个context对应一个web项目
—— Wrapper 容器里的封装部分。
三. 第一个Servlet
创建一个Servlet需要经过以下步骤:
1)新建一个Java类,继承“javax.servlet.http.HttpServlet”;
2)实现“doGet()”方法或“doPost()”方法处理不同请求
package servlet;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
//继承HttpServlet
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理get请求");
response.setContentType("text/html;charset=utf-8"); //设置解析类型及编码
PrintWriter out = response.getWriter(); //获取输出流
out.println("<em>收到你的get...</em><br>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("处理post请求");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); //获取输出流
out.println("<em>收到你的post...</em><br>");
}
}
3)在应用配置文件“web.xml”中注册新建的Servlet;
<servlet>
<servlet-name>HelloServlet</servlet-name> //servlet名字
<servlet-class>servlet.HelloServlet</servlet-class> //servlet类(详细到包)
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name> //servlet名字
<url-pattern>/servlet/HelloServlet</url-pattern> //该类文件的相对路径
</servlet-mapping>
这样,在jsp页面中通过get或post请求该servlet,servlet做出响应
<body>
<h1>第一个servlet</h1>
<hr>
<a href="servlet/HelloServlet">get方式请求servlet</a>
<form action="servlet/HelloServlet" method="post">
<input type="submit" value="post方式请求servlet">
</form>
</body>
使用myeclipse在src中新建servlet文件,可以自动继承HttpServlet,并在web.xml中完成注册
对于以上代码,存在这样的执行流程:
1、提交超链接请求后,服务器会在web.xml中的<servlet-mapping>
寻找对应的url(url-pattern)地址,然后得到这个servlet的名称。
2、得到名称后,在servlet中寻找名称相同的标签,然后得到处理类(servlet-class文件)
3、进入servlet处理类,根据请求方式(get或者post)执行doGet或者doPost)方法
四. Servlet的生命周期
Servlet装载的三种情况:
1、自动装载:某些Servlet如果需要在Servlet容器启动时就加载,需要在web.xml下它的<Servlet>
标签里中,添加优先级代码:
<Servlet>
<load-on-startup>1<load-on-startup>
</Servlet>
数字越小表示该servlet的优先级越高,会先于其他自动装载的优先级较低的先装载
2、Servlet容器启动后,客户首次向某个Servlet发送请求时,Tomcat容器会加载它
3、当Servlet类文件被更新后,也会重新自动加载
Servlet是长期驻留在内存里的。某个Servlet一旦被加载,就会长期存在于服务器的内存里,直到服务器关闭
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。
当服务器关闭时,会调用Servlet的destroy()方法Servlet销毁
五. 获取Jsp内置对象
六. Servlet路径跳转
例如,图中这种目录结构
1、JSP跳转到Servlet
1)相对路径 <a href="servlet/HelloServlet"></a>
*注意:如果写成”/servlet/TestServlet”会报错,因为第一个’/’表示的是【服务器根目录:http://localhost:8080/】
2)绝对路径,通过内置成员变量path实现,<a href="<%=path%>/servlet/TestServlet"></a>
。
*注意:这里的path得到的是项目根目录,如【http://localhost:8080/ServletDemo】
2、Servlet跳转JSP
1)请求重定向:response.sendRedirect(request.getContextPath()+"/index.jsp");
这里通过request.getContextPath()方法获得项目根目录,或者通过”../index.jsp”取得上层路径得到
2)服务器内部转发:request.getRequestDispatcher("../index.jsp").forward(req,resp);
3、web.xml中的<url-pattern>
<url-pattern>/servlet/RegServlet</url-pattern>
这里必须以/
开头,斜线表示项目的根目录