栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb三大组件-Servlet(二)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb三大组件-Servlet(二)

文章目录
  • 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类型
    }
}

前端:


用户名:
密码:
爱好: C++ Java JavaScript

2. 请求转发

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

例如:Servlet01和 Servlet02程序共同完成一个业务。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




    
    c
     
     
     
    


    
这是web目录下a目录下b目录下的c.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");

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/858922.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号