servlet_2">servlet
servlet_4">1.servlet概述
Server+Applet,是一种服务器端的Java应用程序,只有当一个服务器端的程序使用了Servlet API的时候,这个服务端的程序才能称之为Servlet。
Servlet:
- 本身不做任何业务处理
- 只是接收请求并决定调用哪个JavaBean去处理请求
- 确定用哪个页面来显示处理返回的数据
Servlet 任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
2.JSP与Servlet
联系:
- JSP文件在容器中会转换成Servlet执行。
- JSP是对Servlet的一种高级封装,本质还是Servlet。
区别:
3.Servlet API
主要Servlet API介绍:
- javax.servlet.Servlet接口
- 所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
- javax.servlet.GenericServlet类
- 是Servlet的通用版本,是一种与协议无关的Servlet
- javax.servlet.http.HttpServlet类
- 在GenericServlet基础上扩展的基于Http协议的Servlet
如何创建Servlet:
-
实现Servlet接口
public class FirstServlet implements Servlet{public FirstServlet() {System.out.println("FirstServlet 构造器。。。。");}@Overridepublic void destroy() {System.out.println("destory.....删除方法");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic String getServletInfo() {return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {System.out.println("FirstServlet init......初始化方法init");}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {} }
-
继承GenericServlet类
public class SecondServlet extends GenericServlet{public SecondServlet() {}@Overridepublic void init() throws ServletException {System.out.println("SecondServlet init ....");}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {} }
-
继承HttpServlet类
public class ThreeServlet extends HttpServlet{public ThreeServlet() {System.out.println("Threeservlet constructor..");}@Overridepublic void init() throws ServletException {System.out.println("ThreeServlet init...");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}@Overridepublic void destroy() {System.out.println("ThreeServlet destory...");System.out.println("");}
}
在web.xml中配置:
xml"><servlet><servlet-name>first</servlet-name><servlet-class>servlet.FirstServlet</servlet-class></servlet><servlet-mapping><servlet-name>first</servlet-name><url-pattern>/first.do</url-pattern></servlet-mapping>
<!--第二种方法的配置信息-->
<servlet><servlet-name>Second</servlet-name><servlet-class>servlet.SecondServlet</servlet-class></servlet><servlet-mapping><servlet-name>Second</servlet-name><url-pattern>/second.do</url-pattern></servlet-mapping>
4.Servlet生命周期
- Servlet 初始化后调用 init () 方法。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 销毁前调用 destroy() 方法。
- Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
生命周期 | 谁来做 | 何时做 |
---|---|---|
实例化 | Servlet 容器 | 当Servlet容器启动或者容器检测到客户端请求时 |
初始化 | Servlet 容器 | 实例化后,容器调用Servlet的init()初始化对象 |
处理请求 | Servlet 容器 | 得到客户端请求并做出处理时 |
销毁 | Servlet 容器 | 当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候 |
init():
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
public void init() throws ServletException {// 初始化代码...
}
service():
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException{
}
doGet() :
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 method的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}
doPost():
POST 请求来自于一个特别指定了 method为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {// Servlet 代码
}
destroy():
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
public void destroy() {// 终止化代码...}
5.部署运行Servlet
部署:
xml"><!-- 配置Servlet--><servlet><servlet-name>UserLoginServlet</servlet-name><servlet-class>com.hz.servlet.UserLoginServlet</servlet-class><!-- 配置参数编码 --><init-param><param-name>charset</param-name><param-value>utf-8</param-value></init-param><!-- 启动tomcat就加载Servlet--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>UserLoginServlet</servlet-name><url-pattern>/userLoginServlet</url-pattern></servlet-mapping>
或
@WebServlet(name = "UserLoginServlet", value = "/userLoginServlet",initParams = {@WebInitParam(name = "charencoding",value = "utf-8")})
<!-- java中获取 -->
private String bm = "";
@Override
public void init(ServletConfig config) throws ServletException {bm = config.getServletContext().getInitParameter("charencoding");
}
<!-- 注意:<servlet-mapping>与<servlet>中的<servlet-name>必须一致-->
<!-- @WebServlet("/userLoginServlet")//注解等同于在web.xml中配置 -->
<!-- 配置公共参数 --><context-param><param-name>charencoding</param-name><param-value>utf-8</param-value></context-param>
在servlet中获得内置对象:
//servlet获取pageContext
PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this,request,response,null,true,8192,true);
//获得out对象
PrintWriter out = response.getWriter();
out.print("<h1>这是out对象</h1>");
//获得session对象
HttpSession session = request.getSession();
//获得application对象
ServletContext application = this.getServletContext();
运行:
@WebServlet(name = "UserLoginServlet", value = "/userLoginServlet")
public class UserLoginServlet extends HttpServlet {private String bm = "";@Overridepublic void init(ServletConfig config) throws ServletException {bm = config.getServletContext().getInitParameter("charencoding");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.编码request.setCharacterEncoding(bm);//2.获取用户值String uname = request.getParameter("uname");String upwd = request.getParameter("upwd");String remember = request.getParameter("remember");//3.调用方法UserDao userDao = new UserDaoImpl();User user = userDao.loginUser(uname,upwd);HttpSession session = request.getSession();//4.跳转页面if (user !=null){session.setAttribute("user",user);session.setMaxInactiveInterval(60);if (remember != null){String sName = URLEncoder.encode(uname,"utf-8");Cookie cookie = new Cookie("uname",sName);Cookie cookie1 = new Cookie("upwd",upwd);cookie.setMaxAge(60);cookie1.setMaxAge(60);cookie.setPath("/");cookie1.setPath("/");response.addCookie(cookie);response.addCookie(cookie1);}response.sendRedirect("/indexServlet");}else {response.sendRedirect("/login.jsp");}}
}