• 乱码问题-页面跳转方式-Servlet配置文件


    1.HttpServletRequest

    a)HttpServletRequest是一个接口,继承了ServletRequest接口;

    b)HttpServletRequest对象由服务器创建,并作为参数传递给service方法,用于给Servlet提供客户端的请求信息。

    c)获取请求行信息:

    private void getReqLine(HttpServletRequest req) {

    System.out.println("请求方式:" + req.getMethod());

    System.out.println("资源路径(URL):" + req.getRequestURL());

    System.out.println("资源路径(URI):" + req.getRequestURI());

    System.out.println("协议版本号:" + req.getProtocol());

    System.out.println("协议名:" + req.getScheme());

    }

    d)获取请求头信息

    private void getReqHead(HttpServletRequest req) {

    Enumeration<String> names = req.getHeaderNames();

    while (names.hasMoreElements()) {

    String name = names.nextElement();

    System.out.println(name + "=" + req.getHeader(name));

    }

    }

    e)获取请求实体

    private void getReqEntity(HttpServletRequest req) {

    // 获取一个值时使用getParameter

    String uname = req.getParameter("uname");

    // 获取多个值时使用getParameterValues

    String[] hobs = req.getParameterValues("hob");

    System.out.println("uname:" + uname);

    System.out.println("hob:" + Arrays.toString(hobs));

    }

    f)获取请求信息的其他信息

    private void getReqOthers(HttpServletRequest req) {

    System.out.println("服务器的地址:" + req.getLocalAddr());

    System.out.println("服务器的名称:" + req.getLocalName());

    System.out.println("服务器端口号:" + req.getLocalPort());

    System.out.println("客户端的地址:" + req.getRemoteAddr());

    System.out.println("客户端的主机:" + req.getRemoteHost());

    System.out.println("客户端端口号:" + req.getRemotePort());

    System.out.println("获取上下文路径(当前项目):" + req.getContextPath());

    }

    2.HttpServletResponse

    a)HttpServletResponse是一个接口,继承了ServletResponse接口;

    b)HttpServletResponse对象由服务器,并作为参数传递service方法,用于帮助Servlet对客户端的请求做出响应。

    c)HttpServletResponse对象用于设置响应头和响应实体;

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    // 设置响应头

    resp.setHeader("Content-Type", "text/html;charset=utf-8");

    resp.setHeader("pc", "DELL");

    // 重名时也不会覆盖

    resp.addHeader("pc", "Lenovo");

    // 设置响应实体

    resp.getWriter().print("<h1>今天天气不错!</h1>");

    }

    3.解决各种乱码问题

    发生乱码问题的原因是由于编码方式不一致,因此,解决乱码的核心思想是统一编码方式,UTF-8被称为万国码,是一个非常好的选择。

    3.1前台页面乱码

    需要在页面中添加meta标签,告知浏览器使用utf-8编码。

    <!-- 告诉浏览器要使用utf-8的方式编码页面 -->

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">

    3.2后台乱码

    Tomcat7.0及之前的版本,默认采用ISO-8859-1的编码方式。

    Tomcat8.0开始,默认编码方式改为UTF-8。

    3.2.1后台请求乱码

    3.2.1.1post请求乱码

    在接收数据前,设置请求实体编码方式为UTF-8即可

    //设置请求的字符集

    req.setCharacterEncoding("utf-8");

    3.2.1.2get请求乱码

    a) 方式一先用ISO-8859-1解码, 再用UTF-8编码.

    String uname = req.getParameter("uname");

    // iso-8859-1解码字符串

    byte[] bytes = uname.getBytes("iso-8859-1");

    // utf-8重新编码

    uname = new String(bytes, "utf-8");

    b) 方式二修改服务器配置文件server.xml, 使用UTF-8编码路径

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

    c) 方式三修改服务器配置文件server.xml, 使用请求实体的编码方式来编码路径较为灵活.

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" />

    req.setCharacterEncoding("utf-8");

    String uname = req.getParameter("uname");

    3.2.2后台响应乱码

    设置服务器使用UTF-8编码响应信息,同时,告知浏览器使用UTF-8编码响应信息;

    //设置响应的字符集

    resp.setCharacterEncoding("utf-8");

    // 告诉浏览器使用utf-8编码响应内容

    // resp.setHeader("Content-Type", "text/html;charset=utf-8");

    resp.setContentType("text/html;charset=utf-8");

    4.页面跳转的两种方式

    4.1请求转发

    a)只发送一次请求

    b)地址栏不发生改变

    c)数据可以一直传递

    d)只能舔砖内部资源,不能访问外部资源

    // 请求转发--getRequestDispatcher

    req.getRequestDispatcher("dis2").forward(req, resp);

    4.2重定向

    a)会发送多次请求

    b)地址栏会发生改变

    c)数据不能继续传递

    d)内部资源和外部资源都可以访问

    // 重定向---sendRedirect

    resp.sendRedirect("red2?mouse="+req.getParameter("mouse"));

    5.ServletConfig

    a)ServletConfig用于配置Servlet,在初始化Servlet的时候对Servlet进行配置;

    b)Servlet容器会自动将<init-param>中的数据封装为ServletConfig对象,并将其传到init方法中,对Servlet进行初始化操作;

    5.1通过配置文件配置init-param

    <servlet>

    <servlet-name>ConfigServlet</servlet-name>

    <servlet-class>com.bjsxt.servlet.ConfigServlet</servlet-class>

    <!-- 用于提供Servlet的配置信息, 供服务器封装ServletConfig对象使用 -->

    <init-param>

    <param-name>keyboard</param-name>

    <param-value>Razer</param-value>

    </init-param>

    </servlet>

    <servlet-mapping>

    <servlet-name>ConfigServlet</servlet-name>

    <url-pattern>/conf</url-pattern>

    </servlet-mapping>

    5.2通过注解配置init-param

    @WebServlet(value="/conf2", initParams=@WebInitParam(name="keyboard", value="luoji"))

    public class ConfigServlet extends HttpServlet {}

    5.3 使用ServletConfig

    @Override

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    // 获取ServletConfig对象

    ServletConfig config = this.getServletConfig();

    // 获取初始化参数

    System.out.println("keyboard:" + config.getInitParameter("keyboard"));

    // 获取当前Servlet的名字

    System.out.println("name:" + config.getServletName());

    }

    1. ServletContext

    a) ServletContext是Servlet的上下文对象, 代表了整个应用程序一个项目中只有一个ServletContext对象, 所以它经常被称之为Application.

    b) 所有的Servlet共享ServletContext对象.

    6.1 获取ServletContext对象的三种方式

    // [1] 直接调用getServletContext方法

    ServletContext ctx1 = this.getServletContext();

    // [2] 通过ServletConfig对象获取

    ServletContext ctx2 = getServletConfig().getServletContext();

    // [3] 通过req对象获取

    ServletContext ctx3 = req.getServletContext();

    6.2 全局配置参数

    <!-- 全局配置参数 -->

    <context-param>

    <param-name>computer</param-name>

    <param-value>Lenovo</param-value>

    </context-param>

    6.2 ServletContext常用功能

    // [功能1] 获取全局配置参数

    System.out.println("computer:" + ctx1.getInitParameter("computer"));

    // [功能2] 获取一些相关的路径

    System.out.println("上下文路径:" + req.getContextPath());

    System.out.println("上下文路径:" + ctx1.getContextPath());

    System.out.println("获取当前项目的绝对路径:" + ctx1.getRealPath(""));

    System.out.println("获取upload的绝对路径:" + ctx1.getRealPath("upload"));

    // [功能3] 加载静态资源

    InputStream is = ctx1.getResourceAsStream("WEB-INF/web.xml");

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    PrintWriter pw = new PrintWriter(System.out);

    String line = null;

    while((line = br.readLine()) != null) {

    pw.println(line);

    }

    pw.close();

    br.close();

    // [功能4] 请求转发

    ctx1.getRequestDispatcher("/demo.html").forward(req, resp);

  • 相关阅读:
    MySQLCluster架构图文详解
    Request.ServerVariables大全,写到这里方便查找
    如何修改表的标识列
    如何在存储过程中,调用另一存储过程的结果集
    自我简介
    第二个web网页
    第一个网页感想
    C语言I博客作业03
    ES基本搜索(1)
    ES的入门学习
  • 原文地址:https://www.cnblogs.com/bjsxt123/p/9112996.html
Copyright © 2020-2023  润新知