• Java Servlet 回顾


    一、转发请求RequestDispatcher

    使用request域对象把数据带给转发资源,与重定向的区别:客户端只发出一次请求,服务器端调用多个资源,客户端浏览器地址栏没改变;转发是一次请求,使用的是同一个response和request;

    ?

    ServletContext.getRequestDispatcher(String);
    ServletContext.getNamedDispatcher(String);
    ServletRequest.getRequestDispatcher(String);

    有两种方式:

    resp.setContentType("text/html;charset=UTF-8");
    resp.addHeader("refresh", "3;url='/W/index.html'");
    resp.getWriter().write("恭喜登录成功,如果没有中转,请点击超链接<a href='/W/index.html'>AAAA</a>");

    上面的代码在接收到请求后会显示一个登录成功的跳转提示,3s后会自动跳转到index.html页面;

    String message = "<meta http-equiv='refresh' content='3;url=/W/index.html'><a href='/W/index.html'>AAAA</a>";
    this.getServletContext().setAttribute("message", message);
    this.getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);// 将消息(message)带到message.jsp页面进行显示;

    编写URL技巧: 先写'/', 给服务器用的就不用写web应用程序名称;给浏览器用的就加上web应用程序名称

    '/'代表当前web应用,写资源路径的时候先写'/'代表当前web应用;

    InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");// 得到资源绝对路径;

    二、程序编码
    程序response响应对象以什么码表输出,就一定要控制浏览器以什么码表打开;可以使用html中的meta技术模拟http响应头,来控制浏览器的行为;

    out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());

    也可以通过response响应对象来直接设置编码;

    response.setCharacterEncoding("UTF-8");
    // 设置response使用的码表,控制response以什么码表向浏览器写出数据;
    response.setHeader("Content-type", "text/html;charset=UTF-8");
    // 指定浏览器以什么码表打开数据;

    更简洁的写法

    response.setContentType("text/html;charset=UTF-8");

    获取request请求参数,在知道请求参数的编码方式的前提下,可以对请求参数进行编码转换:

    request.setCharacterEncoding("UTF-8"); // 只对Post方式有效
    // get方式处理乱码
    String value = request.getParameter("username");
    String out = new String(value.getBytes("iso8859-1"), "UTF-8");
    System.out.println(out);

    解决中文乱码大概有以下几种方式: 
    1、decode()方法 

    java.net.URLDecoder.decode(s)  

    2、设置字符集的方式 

    request.setCharacterEncoding("utf-8");  

    3、在页面上定义charset的字符集 

    <%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

    4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8 

    <filter>  
       <filter-name>encodingFilter</filter-name>  
          <filter-class>com.demo.filter.CoreFilter</filter-class>  
        <init-param>  
           <param-name>encoding</param-name>  
           <param-value>utf-8</param-value>  
        </init-param>  
       </filter>  
          
       <filter-mapping>  
          <filter-name>encodingFilter</filter-name>  
              <url-pattern>/*</url-pattern>  
       </filter-mapping>  

    5、在form表单里定义编码 

    accept-charset="utf-8" onsubmit="document.charset='utf-8';"  

    6、更改ContentTypes的值 
      改变eclipse里ContentTypes的值为utf-8 
    7、改变tomcat字符集 
      通过改变server.xml文件里的字符集来接收中文 

    <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000" 
        redirectPort="8443"   
        URIEncoding="UTF-8"/>  

    三、设置session

    Response.setDateHeader("expires", System.currentTimeMillis() + 1000*3600);// 设置session有效时间10分钟;
    Response.getWriter().write(data);
    Response.setHeader("refresh", "3"); 

    四、压缩文件,告诉浏览器返回的是压缩文件

            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            GZIPOutputStream gout;
            try {
                gout = new GZIPOutputStream(bout);
                gout.write("dd".getBytes());
                gout.close();
            } catch (IOException e) {
            }
            byte[] gzip = bout.toByteArray();
            response.setHeader("Content-Encoding", "gzip");
            response.setHeader("Length", gzip.length + "");
            response.getOutputStream().write(gzip);

    五、重定向

    response.setStatus(302);//重定向
    response.setHeader("Location", "/first/MyJsp.jsp");
    // response.sendRedirect("/first/MyJsp.jsp");
    * 浏览器会向服务器发送两次请求,浏览器地址栏会发生变化,用户登录的时候/显示购物车时通常会用到重定向

    ServletConfig

    ServletConfig为具体的某一个servlet的配置信息;
    实际开发中,有一些东西不适合在servlet程序中写死,这类数据可以通过配置方式配给servlet,例如:servlet采用哪个码表,接连哪个数据库,加载哪个配置文件;

    String value = this.getServletConfig().getInitParameter("name");
    <servlet>
      <init-param>
        <param-name>name</param-name>
        <param-value>XXXXX</param-value>
      </init-param>
    </servlet>

    ServletContext

    ServletContext:这是一个容器,容器的作用范围为整个应用程序;
    一个web应用中的的所有servlet共享同一个ServletContext对象

    String value = this.getServletContext().getInitParameter("datacontext");
    <context-param>
      <param-name>datacontext</param-name>
      <param-value>xxdata</param-value>
    </context-param>

    如果读取资源文件的对象不是servlet的话,就只能通过类装载器读取文件,但资源文件不宜太大,类装载器只加载一次;

    class userinfo {
      static {
        InputStream in = userinfo.class.getClassLoader().getResourceAsStream("db.properties");
        String path = userinfo.class.getClassLoader().getResource("db.properties").getPath();
        // 通过类装载的方式得到文件的位置,再通过传统方式去读取资源文件。
      }
    }

    Servlet配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
     
        <servlet>
            <servlet-name>FIle</servlet-name>
            <servlet-class>com.test.FileServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>FIle</servlet-name>
            <url-pattern>/file</url-pattern>
        </servlet-mapping>
    
    </web-app>

    Cookie & Session 

    request.getCookies();//获取所有cookie;
    response.addCookie(cookie);//添加cookie
    
    // Session是通过cookie的方式传给浏览器;
    HttpSession hs = request.getSession();
    // 浏览器禁用了cookie的处理方法
    String url1 = response.encodeURL("/CooSee/servlet/SeesionDemo1");
    String url2 = response.encodeURL("/CooSee/servlet/SeesionDemo2");
    out.print("<a href='" + url1 + "'>购买</a></br>");
    out.print("<a href='" + url2 + "'>结账</a></br>");
    
    request.getSession(false); // false,只获取,但不创建session;

    Md5

    MessageDigest md = MessageDigest.getInstance("md5");
    byte[] md5 = md.digest(String.getBytes());
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(md5);
  • 相关阅读:
    Ugly Numbers
    Present
    Out of Hay
    Stars(树状数组或线段树)
    Humble Numbers
    Wireless Network
    Rank List
    Argus
    食物链
    Antenna Placement
  • 原文地址:https://www.cnblogs.com/284628487a/p/5580183.html
Copyright © 2020-2023  润新知