request对象和response对象;Web应用中的乱码问题;web应用中的绝对路径;基于注解【JavaEE6(web3.0)】注册Servlet(六)

462 阅读5分钟

request对象和response对象【重要】

​ 无论在doGet方法还是doPost方法都有HttpServletRequest和HttpServletResponse对象形参。

1 request请求对象

类型:HttpServletRequest。

概念:request对象封装浏览器向服务器发送请求时的请求报文【请求行,请求头,请求体】,该对象由服务器创建,以参数形式传入service(),最终传入doPost()或doPost()方法。

作用:

​ 1 获取请求行

  • 获取请求方式:request.getMethod()
  • 获取URI:request.getRequestURI()【当前上下文资源路径】
  • 获取URL:request.getRequestURL()【绝对路径(从服务器开始的路径)】
    • 获取协议:request.getScheme()
    • 获取服务器名称:request.getServerName()
    • 获取服务器端口号:request.getServerPort()

​ 2 获取请求头:request.getHeader(String 参数名)

​ 3 获取请求参数:

  • request.getParameter(String 参数名) 【获取请求参数,单个参数单个值】
  • request.getParameterValues()【获取请求参数,单个参数多个值(如复选框)】
  • request.getParameterMap()【获取请求参数,多个参数多个值,能够获取所有参数,返回的是Map】

​ 4 请求转发:

​ ①获取转发器

​ RequestDispather requestdispatcher = request.getRequestDispather;

​ ②执行转发

​ requestdispatcher.forward(String url);

请求转发地址栏地址不会改变,一次请求两次响应。

​ 5 request是域对象,具有以下方法,

  • request.setAttribute()
  • request.getAttribute()
  • request.getServletContext()
  • request.removeAttribute()

2 response响应报文

类型:HttpServletResponse

概念:response对象封装服务器向浏览器做出响应时的响应报文【响应头,相应行,响应体】,该对象由服务器创建,以参数形式传入service(),最终传入doPost()或doPost()方法。

作用:

  1. 设置响应行

    • 设置状态码【比如强行抛出404,但是基本不会这样用】
  2. 设置响应头

    • 设置文本类型以及字符集 response.setHeader("Content-Type","text/html;charset=utf-8")【解决乱码】
  3. 设置响应体

    • 获取响应流,响应数据response.getWriter(); 测试写入数据: response.getWriter().write("success");

    • 重定向【路径跳转】 response.sendRedirct(String url);

    重定向地址栏路径改变,两次请求两次响应。

3 转发与重定向的区别

  1. 转发地址栏不变,重定向地址栏改变
  2. 转发携带request对象,重定向不带
  3. 转发只进行了一次请求,重定向进行了两次请求。
  4. 转发可以访问WEB-INF目录下的资源。重定向不能直接访问WEB-INF目录下的资源。

WEB-INF下目录属于服务器私有的,服务器内部可以访问,浏览器不能直接访问。

Web应用中的乱码问题

乱码情况:

1 请求乱码:

​ POST方式发送请求时,出现乱码;

​ GET方式发送请求时,未出现乱码。

2 响应乱码

​ 响应过程中,默认出现乱码

1 基本概念

字符集:指的是所有字符集合,包括【中文,英文字符,各个国家字符以及标点符号等】

常用字符集有:UTF-8【支持比较大量的中文字符】、GBK【GB2312支持少量中文字符】、ISO-8859-1【不支持中文字符】等。

编码与解码

​ 编码:将字符转换为二进制的过程。

​ 解码:将二进制转换为字符的过程。

​ 乱码:编码与解码使用的字符集不一致时,出现的乱码现象。

2 浏览器与服务器默认编码与解码情况

服务器默认编码与解码一致为:ISO-8859-1【不支持中文】

浏览器:

​ 默认编码:<mete charset="UTF-8">

​ 默认解码:GBK

3 默认请求与响应乱码情况

乱码种类

1 浏览器向服务器发送请求时,出现乱码:请求乱码

  • 浏览器编码与服务器解码不一致

2 服务器向浏览器做出响应时,出现乱码:响应乱码

  • 服务器编码与浏览器解码不一致

4 解决乱码

(1)解决请求乱码

①解决GET请求乱码

​ Tomcat8.5以及以后的版本,不用解决【服务器默认解决GET请求乱码问题】。

​ Tomcat7 解决方案:

​ 思路:找到修改端口号8080的位置,设置字符集问题。

​ 代码位置:tomcat——>conf——>server.xml

<connector URIEncoding="UTF-8" port="8080" protocol = "HTTP/1.1" 
           connectionTimeout="20000"
           redirectPort = "8443" />
②解决POST请求乱码

思路:浏览器编码【UTF-8】与服务器解码【ISO-8859-1】不一致。将服务器解码设置为:UTF-8

代码:

request.setCharacterEncoding("UTF-8");

(2)解决响应乱码

思路:服务器编码【ISO-8859-1】与浏览器编码【GBK】不一致。

代码:

方法1 将服务器编码设置为:GBK

response.setCharacterEncoding("GBK");

方法2 将服务器编码与解码均设置为:UTF-8【推荐使用】

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

总结:三行代码解决请求与响应乱码问题

web应用中的绝对路径

web应用中路径问题:由于使用转发跳转路径时,转发地址栏不变,此时使用相对路径不可靠【../】,可能出现404。所以建议使用绝对路径

1 什么是绝对路径

​ 以【/】开头路径,称之为绝对路径。

2 【/】代表的意义

  1. 服务器解析【/】,代表当前上下文路径,即为:http://localhost:8080/项目名。以下两种情况由服务器解析【/】
    • 注册中的【/】,web.xml中【/】或者注解。
    • 转发中的【/】
  2. 浏览器解析【/】,代表当前服务器路径,即为:http://localhost:8080。以下两种情况由浏览器解析【/】
    • html代码中使用【/】,如:<a><form><script>等
    • 重定向中【/】

3 Servlet注册路径问题

Servlet默认路径注册在当前上下文路径下,比如在web.xml中声明servlet路径时所写的。

 <url-pattern>/RegistServlet</url-pattern>

运行期间的【上下文】路径,相当于编写代码期间的【web】路径。

运行时servlet是在web目录下的。

路径问题示例代码

html代码

<head>
    <meta charset="UTF-8">
    <title>登录成功</title>
    <base href="/day06_Servlet/">
</head>
<body>
<h2>登录成功!</h2>
<br>
<a href="index.html" target="_self">回首页</a>
</body>

Servlet代码

//登录成功:使用转发跳转login_success.html
request.getRequestDispatcher("/page/login_success.html").forward(request,response);
//登录失败:使用重定向跳转回login.html    
response.sendRedirect(request.getContextPath()+"/page/login.html");     

基于注解【JavaEE6(web3.0)】注册Servlet

示例代码

//@WebServlet(name = "Servlet30",value={"/Servlet30","/Servlet3"})
@WebServlet(name = "Servlet30",value="/Servlet30")
public class Servlet30 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet30");
    }
}