Javaweb关于servlet

发布于:2024-11-27 ⋅ 阅读:(69) ⋅ 点赞:(0)

servlet

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:

  1. 实现Servlet接口

    public class FirstServlet implements Servlet{
     
    	public FirstServlet() {
    		System.out.println("FirstServlet 构造器。。。。");
    	}
    	
    	@Override
    	public void destroy() {
    		System.out.println("destory.....删除方法");
    		
    	}
     
    	@Override
    	public ServletConfig getServletConfig() {
    		return null;
    	}
     
    	@Override
    	public String getServletInfo() {
    		return null;
    	}
     
    	@Override
    	public void init(ServletConfig arg0) throws ServletException {
    		System.out.println("FirstServlet init......初始化方法init");
    		
    	}
     
    	@Override
    	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    	}
    }
    
  2. 继承GenericServlet类

    public class SecondServlet extends GenericServlet{
    	public SecondServlet() {
    	}
    	@Override
    	public void init() throws ServletException {
    		System.out.println("SecondServlet init ....");
    	}
    	@Override
    	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    	}
    }
    
  3. 继承HttpServlet类

public class ThreeServlet extends HttpServlet{
    
    public ThreeServlet() {
        System.out.println("Threeservlet constructor..");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("ThreeServlet init...");
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    @Override
    public void destroy() {
        System.out.println("ThreeServlet destory...");
        System.out.println("");
    }
}

在web.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生命周期

  1. Servlet 初始化后调用 init () 方法。
  2. Servlet 调用 service() 方法来处理客户端的请求。
  3. Servlet 销毁前调用 destroy() 方法。
  4. 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

部署:

<!--    配置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 = "";

    @Override
    public void init(ServletConfig config) throws ServletException {
        bm = config.getServletContext().getInitParameter("charencoding");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected 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");
        }
    }
}