JavaWeb三大组件-Servlet(二)

JavaWeb三大组件-Servlet(二),第1张

文章目录
  • Servlet ②
    • 1. HttpServletRequest类
    • 2. 请求转发
    • 2. base标签
    • 3. HttpServletResponse类
    • 4. 请求重定向

Servlet ② 1. HttpServletRequest类

每次只要有请求进入Tomcat服务器就会把请求过来的HTTP协议解析好,封装到HttpServletRequest对象中,然后传递service()方法中(doGet()或者doPost()),给我们使用。我们根据这个对象获得所有请求的信息。

常用方法(看注释⭐):

// 该Servlet程序访问路径是 /hello02
public class HelloServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestURI(); 			  // 获取请求的资源路径
        req.getRequestURL();		 	  // 获取请求的统一资源定位法 - 绝对路径
        req.getRemoteHost();			  // 获取客户端的ip地址
        req.getHeader("User-Agent"); 	  // 获取请求头
        req.getMethod();				  // 获取请求的方式
        req.setAttribute("key", "value"); // 设置request域数据
        req.getAttribute("key"); 		  // 获得request域数据

        req.getParameter("username"); //获取请求的参数,注意在Post请求中,有中文可能出现乱码,需要设置字符集
        //req.setCharacterEncoding("UTF-8"); 
        //设置请求体的字符集为UTF-8,一定要在获取请求前调用,
        //(获取-设置-获取)这样两个都不行都可能乱码,必须(设置-获取-获取),这样的顺序
        
        req.getParameter("password");    //获取请求的参数
        req.getParameterValues("hobby"); //获取请求的(多个值),返回String[]
        req.getRequestDispatcher("/hello01"); //获取请求转发对象,即RequestDispatcher类型
    }
}

前端:

<body>
<form action="http://localhost:8080/dynamicobject/hello02" method="get">
    用户名:<input type="text" name="username"> <br/>
    密码:<input type="password" name="password"> <br/>
    爱好:<input type="checkbox" name="hobby" value="CPP"> C++
    <input type="checkbox" name="hobby" value="Java"> Java
    <input type="checkbox" name="hobby" value="JavaScript"> JavaScript
    <input type="submit"/>
form>
body>

2. 请求转发

请求转发:是指服务器收到请求后,从一个资源跳转到另一个资源的 *** 作,Servlet01程序 -> Servlet02程序

例如:Servlet01Servlet02程序共同完成一个业务。Servlet01程序获取客户端发来的数据并处理,把 Servlet02程序需要的数据通过setAttribute()方法(域对象),存储在request域公共区域。

然后请求转发 :

// 注意参数写法,必须以斜杠开头,后面是资源路径。
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet02");  //获取请求转发对象
requestDispatcher.forward(req, resp); //前往 Servlet02程序,记得传入参数!!

然后在Servlet02程序中getAttribute(),根据key获得数据,处理业务。


特点: ⭐⭐

  • 浏览器地址没有变化!

  • 它们是一次请求!

  • 他们共享Request域中的数据 (因为forward方法中把req和resp都传进去了)

    Servlet01:req.setAttribute("key", "value")

    Servlet02:req.getAttribute("key")

  • 可以转发到 WEB-INF 目录下 (用浏览器输入直接访问不到)

    例如:req.getRequestDispatcher("/WEB-INF/test.html")

  • 不能访问当前工程以外的资源

    例如:req.getRequestDispatcher("www.baidu.com")


2. base标签

base可以设置当前页面中所有标签工作时,参考base的src属性路径进行跳转,会忽略掉当前浏览器地址栏的地址,去参考base的src属性值。

web/a/b/c.html

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ctitle>
    <base href="http://localhost:8080/dynamicobject/a/b/c.html"/> 
    <base href="http://localhost:8080/dynamicobject/a/b/"/> 
     
    
head>
<body>
    <div>这是web目录下a目录下b目录下的c.html文件div> <br/>
    <a href="../../index.html">跳回首页a> <br/>
    
body>
html>

⭐⭐

web中 / 斜杠的不同意义:(/是一种绝对路径)

  • / 被浏览器解析得到地址是:http://ip:port/

    例如:斜杠

  • / 被服务器解析得到:http://ip:port/工程路径

    例如:/hello

    context.getRealPath("/") 工程部署的绝对路径

    req.getRequestDispatcher("/hello01"); 获取请求转发对象

  • 特殊情况:response.sendRedirect("/"); 重定向

    虽然写在服务器上但不是直接解析,而是发给浏览器解析,会得到http://ip:port/


3. HttpServletResponse类

1.和HttpServletRequest类一样,每次请求进来,tomcat服务器都会创建一个Response对象,传递给Servlet程序去使用。

HttpServletRequest:表示请求过来的信息

HttpServletResponse :表示所有响应的信息,可以设置返回给客户端的信息

2.两个响应流

两个响应输出流作用
字符流getOutputStream()常用于下载(传递二进制数据)
字节流getWriter()常用于回传字符串(常用)

两个流只能同时只有一个,否则报错。

⭐使用:

往客户端回传字符串?显示在页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    //response.getOutputStream();

    System.out.println(response.getCharacterEncoding()); // 服务器默认是ISO-8859-1
    response.setCharacterEncoding("UTF-8");// 设置服务器的字符集,但浏览器的字符集可能表示UTF-8,浏览器默认是GBK
    response.setHeader("Content-Type", "text/html;charset=UTF-8"); // 通过响应头设置浏览器也使用UTF-8!
   
    PrintWriter writer = response.getWriter();
    writer.write("响应的字符串"); // 中文可能出现乱码
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
    //response.getOutputStream();
    
    // 一行更简单,同时设置服务器和客户端浏览器的编码,还设置了响应头,一定要做获取流对象之前调用才有效!!
    response.setContentType("text/html; charset=UTF-8");  // !!
    PrintWriter writer = response.getWriter();
    writer.write("响应的字符串"); // 中文可能出现乱码
}

4. 请求重定向

请求重定向是指:客户端给服务器发请求,然后服务器告诉客户端,我给你新地址,你去新地址访问,叫请求重定向。(可能之间的地址已经被废弃了)

  1. 告诉他我已经搬迁了,响应码:302

  2. 搬迁的地址,响应头:Location

  3. 重定向后浏览器会重新去新地址发起请求,收到最终的返回,解析展示在页面上

public class Response01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        System.out.println("Response01");

        // 第一种:1.设置状态码
        resp.setStatus(302);
        // 2.设置响应头
        resp.setHeader("Location", "http://localhost:8080/dynamicobject/response02"); //请求重定向
        
        //第二种: 由于302和Location都是固定的,一行代替上面的两行!!!!
        resp.sendRedirect("http://localhost:8080/dynamicobject/response02");
    }
}

// 细节:浏览器地址栏变了response01 -> response02,http://localhost:8080/dynamicobject/response02
// 浏览器内按F12可以看到,有两个请求,第一个状态码s302
public class Response02 extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        System.out.println("Response02");

        resp.getWriter().write("Response02 is a result"); 
    }
}

特点: ⭐⭐

  • 浏览器地址有变化 (请求转发是没有变化的)

  • 它是两次请求

  • 不共享Resqust域中的数据(因为Tomcat每次请求都会重新封装为一个新的HttpServletRequest类)

  • 不能访问到WEB-INF下的资源 (因为重定向还是浏览器请求)

  • 能访问工程以外的地址

    例如:resp.setHeader("Location", "http://www.baidu.com");

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/798749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存