程序员社区

【Servlet-1】HTTPServletRequest接口之二

文章目录

        • HttpServletRequest接口中的常用方法
        • ServletRequest接口中request对象范围
        • 关于项目中的乱码问题

HttpServletRequest接口中的常用方法

获取客户端ip地址:String getRemoteAddr()
获取浏览器的请求方式:String getContextPath()
获取浏览器的请求方式:String getMethod()
获取URI:String getRequestURI()
获取URL:StringBuffer getRequestURL()
获取url-pattern:String getServletPath()

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/28/RequestDemo1">测试request常用方法</a>
</body
</html>
package ServletRequest;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=response.getWriter();

        //获取上下文的路径
        String contextPath = request.getContextPath();
        System.out.println(contextPath);

        //获取请求的uri
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        //获取请求的url
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //获取servlet path
        String servletPath = request.getServletPath();
        System.out.println(servletPath);

        //获取浏览器的请求方式
        String method = request.getMethod();
        System.out.println(method);
        
        //获取客户端IP地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        this.doPost(request, response);
    }
}

ServletRequest接口中request对象范围

HttpServletRequest是一个怎样的范围?
HttPServletRequest类型的变量通常命名为:request,代表当前的本次请求,一次请求对应一个request对象,100个请求对应100个request对象。请求范围是极小的。request只能完成在同一次请求中完成传递数据。

向request范围中添加数据:
void setAttribute(String name, Object o)
从request中获取数据:
Object getAttribute(String name)
向request范围中移除:
void removeAttribute(String name)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/28/RequestDemo1">测试request常用方法1</a>

<br>
<a href="/28/AServlet">AServlet</a>
<a href="/28/BServlet">BServlet</a>
</body>
</html>

在AServlet中存储数据,可以在AServlet中取出数据

package ServletRequest;
import domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //床架User对象
        User user = new User();
        user.setUsercode("111");
        user.setUsername("zhangsan");

        //将user对象存储到request范围中
        request.setAttribute("user",user);

        //从request范围中取出User对象
        Object user1 = request.getAttribute("user");
        System.out.println(user1);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在AServlet中存储数据,无法在Bservlet中取出数据,因为request对象只能在同一次请求中完成数据传递。

package ServletRequest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从request范围中取出User对象
        Object user1 = request.getAttribute("user");
        System.out.println(user1);//null
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

跳转:
执行完AServlet之后,跳转到BServlet执行,将AServlet执行和BServlet执行放到同一个请求当中,必须使用转发技术forward:
1.获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
2.调用请求转发器的forword方法即可完成转发

package ServletRequest;

import domain.User;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //床架User对象
        User user = new User();
        user.setUsercode("111");
        user.setUsername("zhangsan");

        //将user对象存储到request范围中
        request.setAttribute("user",user);

        //从request范围中取出User对象
        Object user1 = request.getAttribute("user");
        System.out.println(user1);

        //获取请求转发器对象,并将转发器指向BServlet
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/BServlet");
        //调用请求转发器的forword方法即可完成转
        requestDispatcher.forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

此事只需要点击AServlet即可,只是一次请求,不需要再点击BServlet

关于范围的选择:
ServletContext应用范围可以跨用户传递数据
ServletRequest应用范围只能在同一个请求中传递数据(可以跨Servlet传递数据,但是多个Servlet必须在同一个请求中)
优先选择request范围。

关于项目中的乱码问题

数据乱码经常出现的位置:

  1. 数据保存中的乱码:
    最终保存到数据库表的时候出现乱码
    导致数据保存过程中的乱码包括以下两种情况:
    在保存之前数据是乱码的,保存到数据库之后一定是乱码的
    在保存前不乱吗,由于数据库不支持简体中文,保存后出现乱码

  2. 数据展示过程中的乱码:
    最终展示在网页上的数据出现中文乱码
    经过执行java程序之后,java程序负责向浏览器响应的时候中文出现乱码,怎么解决?
    response.setContentType("text/html;charset=UTF-8");
    没有执行java程序,直接访问页面,出现中文乱码,怎么解决?
    <meta charset="UTF-8">

  3. 数据传递过程中的乱码?
    将数据从浏览器传递给服务器的过程中出现的乱码
    Tomcat 接收请求在没有设置的情况下默认为ISO-8859-1编码

第一种方式:解决Post请求乱码
这种方式目前针对Post方法,因为get方式已经解决了中文乱码问题

 String dname = request.getParameter("dname");
 //将dname字符串解码
 byte[] bytes = dname.getBytes("ISO-8859-1");
 //将bytes编码,但是需要和浏览器的编码方式一致
 dname = new String(bytes, "UTF-8");
 System.out.println(dname);

第二种方式:支持post请求中文乱码问题
void setCharacterEncoding(String env)
这种方式必须在获取数据之前进行设置

第三种方式:专门解决get请求方式乱码问题,这种方式只对请求行有效
修改:CATALINA_HOME/conf/server.xml文件,以后就不用设置get请求方式的编码方式了

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //第一种解决方案
        /*
        String dname = request.getParameter("dname");
        //将dname字符串解码
        byte[] bytes = dname.getBytes("ISO-8859-1");
        //将bytes编码,但是需要和浏览器的编码方式一致
        dname = new String(bytes, "UTF-8");
        System.out.println(dname);
         */
         
        //第二种解决方案
        //告诉Tomcat使用UTF-8的方式进行编码,只对Post请求体中的数据进行编码
        request.setCharacterEncoding("UTF-8");
        //从表单中取出数据,设置代码必须在取数据之前进行
        String  dname = request.getParameter("dname");
        System.out.println(dname);

        //第三种解决方案   
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        this.doPost(request, response);
    }
}

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【Servlet-1】HTTPServletRequest接口之二

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区