✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:JAVA开发者成长之路
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Servlet转发与重定向
更多内容点击👇
Servlet应用(Request+response对象)
转发的作用在服务器端,将请求发送给服务器上的其它资源,以共同完成一次请求的处理。
在调用业务逻辑的Servlet中,服务器端跳转主要通过 RequestDispatcher 接口来实现:
示例代码一:
package cn.lqgx.www;import entity.Student;
import service.StudentService;
import service.impl.StudentServiceImpl;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;
import java.util.List;
@WebServlet("/show")
public class StudentShow extends HttpServlet {StudentService studentService=new StudentServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List studentList = studentService.selectAllStudents();req.setAttribute("students",studentList);req.getRequestDispatcher("/StudentAllServlet").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求。
forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据。
示例代码二:根据 示例代码一 传递的数据,在显示层获取数据并显示。
package cn.lqgx.www;import entity.Student;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;@WebServlet(name = "StudentAllServlet", value = "/StudentAllServlet")
public class StudentAllServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {List studentList=(List)request.getAttribute("students");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");PrintWriter printWriter=response.getWriter();response.setContentType("text/html;charset=UTF-8");printWriter.write("");printWriter.write("");printWriter.write("");printWriter.write("Title ");printWriter.write("");printWriter.write("");printWriter.write("");printWriter.write("");printWriter.write("所有学生信息 ");printWriter.write("");printWriter.write("");printWriter.write("学号 ");printWriter.write("姓名 ");printWriter.write("年龄 ");printWriter.write("性别 ");printWriter.write("地址 ");printWriter.write("电话号码 ");printWriter.write(" ");printWriter.write("");printWriter.write("");for (int i = 0; i < studentList.size(); i++) {printWriter.write("");printWriter.write(""+studentList.get(i).getSid()+" ");printWriter.write(""+studentList.get(i).getSname()+" ");printWriter.write(""+studentList.get(i).getSage()+" ");printWriter.write(""+studentList.get(i).getSsex()+" ");printWriter.write(""+studentList.get(i).getSaddress()+" ");printWriter.write(""+studentList.get(i).getSphoneNum()+" ");printWriter.write(" ");}printWriter.write("");printWriter.write("
");printWriter.write("");printWriter.write("");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
重定向作用在客户端,客户端将请求发送给服务器中,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。
在调用业务逻辑的Servlet中,编写以下代码:
response.sendRedirect(“目标URI”);
URI:统一资源标识符(Uniform Resource Identifier),用来表示服务器中定位一个资源,资源在Web项目中的路径(、project/source)
使用redirect跳转时,是在客户端跳转,地址栏发生变化,属于多次请求
示例代码三:
package cn.lqgx.Servlet;import cn.lqgx.entity.Book;
import cn.lqgx.service.BookService;
import cn.lqgx.service.Impl.BookServiceImpl;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(name = "ServletUpdateTrue", value = "/ServletUpdateTrue")
public class ServletUpdateTrue extends HttpServlet {BookService bookService=new BookServiceImpl();@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//通过response输出在控制台int bid= Integer.parseInt(request.getParameter("bid"));String isbn= request.getParameter("isbn");String name= request.getParameter("name");String author= request.getParameter("author");String press= request.getParameter("press");double price= Double.parseDouble(request.getParameter("price"));String classification= request.getParameter("classification");Book book=new Book(bid,isbn,name,author,press,price,classification);//先查询要添加的数据是否存在数据库中int num =bookService.updateBook(book);if(num>0){//重新显示所有信息response.sendRedirect("ServletShow");}else {
// printWriter.println("修改失败!
");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
sendRedirect跳转时、地址栏改变,代表客户端重新发送的请求。属于两次请求。
当两个Servlet需要传递数据时,选择forward转发,不建议使用sendRedirect进行传递。二者区别如下:
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。