Java

Servlet

2018-12-18  本文已影响5人  强某某

Servlet

Servlet是一个接口,常用方法是service

package com.tjsmc.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Hello implements Servlet{

    public void destroy() {
    }
    public ServletConfig getServletConfig() {
        return null;
    }
    public String getServletInfo() {
        return null;
    }

    public void init(ServletConfig arg0) throws ServletException {
    }
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("测试");
    }
}
在webcontent下面的web-inf文件夹下面的web.xml文件中配置servlet和路由

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>HelloServlet</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 <!--  向tomcat说明,项目里面有哪些servlet,不注册的话无效 -->
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.tjsmc.servlet.Hello</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

HttpServlet

HttpServlet是Servlet的实现类,可选择实现对应的方法,但是一般此类中不重写service方法
因为该类的service自身也是判断请求方式,然后调用doget或者dopost,所以一般直接写doGet或doPost

package com.tjsmc.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Hello2 extends HttpServlet{

    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        super.service(arg0, arg1);
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

Servlet的生命周期

public class Hello implements Servlet{

    /**
     * 默认情况下:创建类的实例时候调用
     * 初次访问servlet才会创建实例
     * init方法只会执行一次
     */
    public void init(ServletConfig arg0) throws ServletException {
        System.out.println("init");
    }
    
    /**
     * 客户端请求到达就执行
     * 可多次执行
     * 一次请求对应一次service执行
     */
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        System.out.println("service");
        
    }
    /**
     * servlet销毁的时候,执行该方法
     * 1. 项目从tomcat中移除
     * 2. tomcat中shutdown.bat执行正常关闭时候执行
     */
    public void destroy() {
        System.out.println("destroy");
    }
}

Servlet的提前初始化

<!--  向tomcat说明,项目里面有哪些servlet -->
  <servlet>
    <servlet-name>Hello</servlet-name>
    <servlet-class>com.tjsmc.servlet.Hello</servlet-class>
    <!--默认情况下,servlet的init初始化在第一次访问到达时候执行
    如果想提前初始化(在项目部署到tomcat中就进行初始化),则通过下面的标签,而且值是一个数字
     数字越小,创建时机越早,一般不写负数,从2开始即可,1被tomcat内部占用 -->
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

ServletConfig

servlet的配置,通过这个对象可以获取servlet在配置时候的一些信息

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletConfig 可以获取servlet的配置信息
        
        //1. 获取servlet的配置对象
        ServletConfig config= getServletConfig();
        //2.获取servlet的名称:是servlet-name的文本内容
        String servletName = config.getServletName();
        //3.获取初始化参数
        String initParameter = config.getInitParameter("name");
//      System.out.println("初始化:"+initParameter);
        //4.获取所有初始化参数的名称的枚举集合
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {
            String string = (String) initParameterNames.nextElement();
            String pars = config.getInitParameter(string);
            System.out.println(pars);
        }
    }
<servlet>
    <servlet-name>Hello2</servlet-name>
    <servlet-class>com.tjsmc.servlet.Hello2</servlet-class>
    
    <!-- 添加初始化参数 -->
    <init-param>
        <param-name>name</param-name>
        <param-value>qiang</param-value>
    </init-param>
  </servlet>

路径匹配


  1. 全路径匹配
  1. 前半段匹配(以*结束)
  1. 以扩展名匹配(此时不需要/)

ServletContext(上下文)

public class Hello3 extends HttpServlet {
       
   /**
    * 一个web程序只有一个上下文对象ServletContext 
    * 也就是说不论哪个servlet获取的ServletContext都是同一个
    * ServletContext作用:
    *   1. 获取全局配置参数
    *   2. 获取web应用的资源(因为项目发布到tomcat中之后资源文件路径用相对路径不对,绝对路径又不合适)
    *   3. 存储数据(servlet间共享数据,域对象)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取上下文对象
        ServletContext servletContext = getServletContext();
        //2.获取全局配置的参数
        String initParameter = servletContext.getInitParameter("name");
        //3.获取给定的文件在服务器上面的绝对路径,该方法如果不添加参数,则是项目根目录
        String realPath = servletContext.getRealPath("props/stus.properties");
        //D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
        Properties properties=new Properties();
//      properties.load(new FileInputStream(realPath));
//      String name = (String) properties.get("name");
        //3.获取资源方式二
//      InputStream resourceAsStream = servletContext.getResourceAsStream("props/stus.properties");
//      properties.load(resourceAsStream);
//      String name = (String) properties.get("name");
        //3.利用classloader获取资源方式三
        /**
         * classloader的路径是:
         * D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\WEB-INF\classes
         * 
         * 但是真实需要的是:
         * D:\DevelopSoft\Tomcat\apache-tomcat-7.0.52\wtpwebapps\HelloServlet\stus.properties
         * 所以需要回两级目录
         */
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("../../props/stus.properties");
        properties.load(resourceAsStream);
        String name = (String) properties.get("name");
        System.out.println(name);
        
        //4.存储数据和取出数据
        //获取get请求来的参数
        String username = request.getParameter("username");
        Object loginnum =servletContext.getAttribute("loginnum");
        int total=0;
        if (loginnum!=null) {
            total=(Integer) loginnum;
        }
        servletContext.setAttribute("loginnum", ++total);
        //返回给客户端
        response.getWriter().write(username+"..."+total);
    }

}
资源路径.png
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
  <p>
      请输入内容并提交
  </p>
  <!-- 注意此处不需要/Hello3 直接Hello3即可 -->
  <form action="Hello3" method="get">
    <input type="text" name="username" value="请输入用户名">
    <input type="submit" value="提交">
  </form>
</body>
</html>
 <!--  全局参数 -->
 <context-param>
    <param-name>name</param-name>
    <param-value>全局参数</param-value>
 </context-param>
全局参数.png

HttpServletRequest和HttpServletResponse

HttpServletRequest客户端提交数据的封装,HttpServletResponse是响应对象

public class Hello4 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取单个提交的参数
        String username = request.getParameter("username");
        // 获取所有参数得到一个枚举集合
        Enumeration<String> parameterNames = request.getParameterNames();
        // 获取所有参数的map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        /**
         * GET请求方式中文乱码问题 tomcat收到数据,getParameter默认使用ISO-8859-1编码
         * 所以先利用username.getBytes("ISO-8859-1")通过ISO-8859-1解码 然后通过new
         * String编码为UTF-8
         * 
         * 解决方案二: 在tomcat中配置get请求过来的数据永远使用UTF-8编码即可
         * tomcat文件夹下面的conf文件夹内部的server.xml中的64行
         *  <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" * redirectPort="8443" URIEncoding="UTF-8"/>
         */
        username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
        /**
         * 响应也有中文乱码问题
         */
        // 以字符流的方式写,默认是ISO-8859-1会中文乱码
        // 1.首先设置响应体的编码格式
        // response.setCharacterEncoding("UTF-8");
        // 2. 设置浏览器使用的解码格式
        // response.setHeader("Content-Type", "text/html;charset=UTF-8");
        // response.getWriter().write("呵呵");
        // 以字节流的方式写也可能有会中文乱码
        /**
         * 默认使用的是utf-8的编码
         */
        //方式一:
        //response.setContentType( "text/html;charset=UTF-8");
        //方式二
         response.setHeader("Content-Type", "text/html;charset=UTF-8");
         //起始因为默认是utf-8的编码所以getBytes("utf-8")可以直接写getBytes()
        response.getOutputStream().write("呵呵呵".getBytes("utf-8"));
        
        // 设置状态码
        // response.setStatus(200);
        // 设置消息头
        // response.setHeader(arg0, arg1);
        // 设置响应类型
        // response.setContentType(arg0);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // post请求中文乱码问题,通过下面代码设置编码即可解决
        // 设置请求体内容编码格式
        resp.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");

        resp.getWriter().write(username);
    }
}

下载文件的案例

代码实现下载:
public class down extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filename = request.getParameter("filename");
        /**
         * 这句代码:
         * 表示是使用下载的方式操作文件,而不是浏览器默认行为
         * 比如说浏览器默认打开图片,xml,而不是下载
         */
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        InputStream is = getServletContext().getResourceAsStream("download/" + filename);
        OutputStream os = response.getOutputStream();
        int len = 0;
        byte[] bys = new byte[1024];
        while ((len = is.read(bys)) != -1) {
            os.write(bys, 0, len);
        }
        os.close();
        is.close();
    }
}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <p>使用tomcat默认servlet实现下载</p>
     <!-- 不需要java代码配合,但是浏览器是按照默认行为操作的 -->
    <a href="download/a.zip">下面</a>

    <p>编码实现下载</p>
    <a href="down?filename=a.zip">下面</a>
    <a href="down?filename=a.png">下面</a>
</body>
</html>
download.png
上一篇 下一篇

猜你喜欢

热点阅读