Java Web 回顾总结(五) - HttpServlet - Request - 重定向 与 请求转发

本文详细介绍了在Servlet中如何实现请求转发与重定向的区别,包括请求转发的实现原理、转发过程中request对象的作用及如何使用RequestDispatcher接口进行转发,同时对比了请求重定向的实现方式及其与请求转发的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

request实现请求转发:

servlet api 提供了 一个 RequestDispatcher 接口,俗称 请求分派器

它定义了如下两个 请求转发 方法:
public void forward(ServletRequest request, ServletResponse response)
public void include(ServletRequest request,ServletResponse response)

获取RequestDispatcher实例的方式主要有两种:

调用ServletContext接口提供的getRequestDispatcher(String url)方法。
调用ServletRequest接口提供的getRequestDispatcher(String url)方法。

url为要转发 过去 的 本应用内 url

RequestDispatcher

例:

        // 返回指定 属性的 值 作为对象,如果没有给定名称的属性,则返回null
        if(request.getAttribute("lol")!=null) {
            System.out.println("该请求中无此参数");
            // 添加  一个 请求 参数
            request.setAttribute("lol", "haha");
        }
        else if (request.getAttribute("lol").toString()=="haha") {
            System.out.println("我会重置此参数的值");
            // 重置  该请求参数
            request.setAttribute("lol", "wawa");
        } 
        else {
            System.out.println("其他情况我会删除 该参数");
            // 删除 该参数
            request.removeAttribute("lol");
        }
        // 获取全部属性
        Enumeration<String> enumeration = request.getAttributeNames();

        //将 该请求 实现转发
        request.getRequestDispatcher("./Demon").forward(request, response);

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把转发前 修改后的 数据 可以 通过request对象 带给其它web资源处理。

request中 的数据对象进行操作:

setAttribute()      //若无此属性 在此请求中存储  ,若有 属性在请求之间重置。
getAttribute()      // 获取该属性 的值 ,并作为 对象(object) 处理
removeAttribute()   // 移出该属性
getAttributeNames() // 获取全部属性 的名称 作为 枚举类型 使用

注意

  1. forward方法用于将请求转发到RequestDispatcher对象封装的资源。
  2. 如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被传送到了客户端
    forward方法抛出IllegalStateException异常。
  3. 如果在调用forward方法之前向Servlet引擎的缓冲区 response 中写入了内容
    只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行
    除已写入到HttpServletResponse response对象中的 响应头字段信息 保持有效 外 , 转发前 其它写入到输出缓冲区中的 内容将被清空,

请求重定向(402)和请求转发的区别

请求转发:
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理
请求重定向
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源

通过HttpServletResponse.sendRedirect()方法 实现

可重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
但不进行处理

路径区别

HttpServletResponse.sendRedirect方法的相对URL以/开头,它是相对于整个WEB站点的根目录
创建RequestDispatcher对象时指定的相对URL以/开头,它是相对于当前WEB应用程序的根目录

如同 www.pan.baidu.comwww.pan.baidu.com/disk/的区别

调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由 初始的URL 地址变成重定向的 目标URL
调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变

HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;
RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
RequestDispatcher.forward方法的调用者与 被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;
HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于 两个独立的访问请求和响应过程。

<think>好的,我现在要回答用户关于HTML文件Java文件交互方式的问题。首先,我需要回顾用户提供的参考资料,特别是引用[1]中提到ServletJSP的区别,以及它们如何处理HTMLJava的交互。根据引用[1],ServletJava中处理逻辑,然后生成HTML输出,而JSP允许在HTML中嵌入Java代码。这可能是一个关键点。 用户想知道HTMLJava文件如何交互,所以需要涵盖常见的几种方法,比如Servlet、JSP、AJAX、模板引擎等。引用[3]提到ServletContext的作用,可能涉及到服务器端的数据存取,但可能直接交互关系不大。引用[4]中的axios库属于前端JavaScript,用于通过AJAX后端Java交互,这应该是一个重要的点。 首先,应该解释基本机制:HTML作为前端,Java作为后端,通常通过HTTP请求响应交互。常见的实现方式包括: 1. Servlet处理HTTP请求:用户在HTML表单提交数据到ServletServlet处理后返回响应。这需要配置web.xml或者使用注解。 2. JSP:虽然JSP本质上是Servlet,但允许在HTML中嵌入Java代码,适合生成动态内容。但现代开发可能更倾向于前后端分离,所以JSP可能不如以前常用。 3. AJAX技术:使用JavaScript(如axios库)发送异步请求Java后端(如Servlet或Spring控制器),获取数据并动态更新页面,无需刷新。引用[4]中的axios示例正是这种情况。 4. RESTful API:Java后端提供REST接口,HTML前端通过fetch或axios调用这些接口,使用JSON数据交互。这可能更符合现代前后端分离的架构。 5. 模板引擎:比如Thymeleaf或Freemarker,在服务器端将数据填充到HTML模板中,生成动态页面。但这也属于后端渲染,JSP类似。 需要确保每种方法的实现机制都有简要说明,并可能结合引用中的内容。例如,引用[1]提到ServletJSP的不同,可以说明Servlet处理逻辑生成HTML,而JSP混合HTMLJava。引用[4]中的axios用于前端发送请求,后端Servlet或Controller处理。 同时,需要注意用户可能对技术细节不熟悉,需要解释清楚每个步骤,比如表单提交如何触发Servlet,AJAX如何后端通信等。此外,可能涉及到的技术如JNI(引用[2])虽然提到,但可能HTMLJava交互关系不大,可以暂时忽略。 最后,生成相关问题时,要涵盖用户可能进一步询问的方向,如具体实现步骤、优缺点比较、数据格式处理、安全性等。</think>### HTML文件Java文件交互的方法及实现机制 HTML(前端)Java(后端)的交互主要通过**HTTP协议**实现,以下是常见的实现方式及技术原理: --- #### 一、表单提交Servlet处理 1. **HTML表单提交数据** 在HTML中使用`<form>`标签定义表单,通过`action`属性指向Java后端的Servlet路径: ```html <form action="/submit" method="POST"> <input type="text" name="username"> <button type="submit">提交</button> </form> ``` 2. **Servlet接收并处理请求** Java Servlet通过`doPost`或`doGet`方法接收请求参数,处理后生成响应(如重定向或返回HTML片段): ```java @WebServlet("/submit") public class FormServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); // 处理逻辑后返回响应 } } ``` **特点**:同步请求,页面刷新[^1]。 --- #### 二、JSP动态页面技术 1. **JSP嵌入Java代码** 在JSP文件中直接使用`<% %>`标签编写Java逻辑,或通过`${}`表达式显示后端数据(EL表达式): ```jsp <% String message = (String) request.getAttribute("msg"); %> <p>${message}</p> ``` 2. **Servlet转发数据到JSP** Servlet处理请求后,将数据存入`request`作用域并跳转到JSP页面: ```java request.setAttribute("msg", "Hello World"); request.getRequestDispatcher("/result.jsp").forward(request, response); ``` **特点**:适合服务器端渲染动态页面。 --- #### 三、AJAX异步通信 1. **前端通过JavaScript发送请求** 使用`axios`或`fetch`发送异步请求Java后端(如Servlet或Spring控制器): ```html <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script> axios.post('/api/data', { name: 'John' }) .then(response => console.log(response.data)); </script> ``` 2. **后端返回JSON数据** Java后端处理请求后返回JSON格式数据(需使用库如Jackson或Gson): ```java @RestController public class DataController { @PostMapping("/api/data") public Map<String, String> processData(@RequestBody User user) { Map<String, String> result = new HashMap<>(); result.put("status", "success"); return result; // 自动转换为JSON } } ``` **特点**:无需刷新页面,适合前后端分离架构[^4]。 --- #### 四、RESTful API通信 1. **Java提供REST接口** 使用Spring Boot等框架定义RESTful端点: ```java @GetMapping("/api/users/{id}") public User getUser(@PathVariable int id) { return userService.findById(id); } ``` 2. **前端调用接口并渲染数据** HTML通过JavaScript获取数据后动态更新DOM: ```javascript fetch('/api/users/1') .then(res => res.json()) .then(user => document.getElementById('name').innerText = user.name); ``` --- #### 、模板引擎(如Thymeleaf) 1. **后端渲染动态HTML** 在Java中绑定数据到模板,生成最终HTML: ```java @Controller public class PageController { @GetMapping("/profile") public String profile(Model model) { model.addAttribute("user", userService.getCurrentUser()); return "profile"; // 对应src/main/resources/templates/profile.html } } ``` 2. **HTML模板中使用表达式** ```html <p th:text="${user.name}">默认名称</p> ``` **特点**:分离视图逻辑,但仍在服务器端完成渲染[^3]。 --- ### 对比选择 | 方法 | 场景 | 优缺点 | |---------------|------------------------|---------------------------------| | 表单+Servlet | 简单表单提交 | 同步刷新,适合传统应用 | | JSP | 动态页面渲染 | 混合JavaHTML,维护成本较高 | | AJAX+REST | 前后端分离、SPA应用 | 异步高效,需处理跨域问题 | | 模板引擎 | 服务端动态页面生成 | 逻辑视图分离,SEO友好 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值