1.Servlet/JSP单独使用的弊端
当我们用Servlet或者JSP单独处理请求的时候
- Servlet:拼接大量的html字符串 造成可读性差、难以维护
- JSP:使得html和Java代码互相交织 也造成了可读性差、难以维护的后果
最合适的做法就是两者结合使用
2.Servlet+JSP处理请求的常见过程
- 以上过程就是典型的MVC开发模式 即Model(数据)-View(页面展示)-Controller(控制器)模式 分别对应着上图中的数据库-JSP-Servlet
3.实现
- 有了前面这层铺垫 再加上Servlet_JSP中介绍的EL和JSTL 那么我们就可以开始实现以下我们的crm项目了 即customer relationship management(客户关系管理系统) 我们采用的方式就是Servlet和JSP结合使用
- 我们首先先来实现一下Servlet中不拼接html字符串、JSP中不内嵌Java代码的需求 即Servlet转发到JSP这一步
Customer.java
ListServlet.javapackage com.mj.bean;public class Customer {// 定义成员变量// 姓名private String name;// 年龄private Integer age;// 身高private Double height;public Customer(String name, Integer age, Double height) {this.name = name;this.age = age;this.height = height;}public Customer() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Double getHeight() {return height;}public void setHeight(Double height) {this.height = height;}@Overridepublic String toString() {return "Customer{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';} }
List.jspimport com.mj.bean.Customer; 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.util.ArrayList; import java.util.List; @WebServlet("/list") public class ListServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 将用户信息集合以键值对的形式储存到request中request.setAttribute("customers", getCustomers());// 然后将请求发送给JSP 并且跳转到JSP页面request.getRequestDispatcher("page/list.jsp").forward(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}// 定义一个获取用户信息的方法private List getCustomers(){// 首先我们创建一个List集合 用于储存用户信息List<Customer> customers = new ArrayList<>();// 我们还是假设有10个用户for(int i = 0; i < 10; ++i){customers.add(new Customer("张三" + i, 10 + i, 1.70 + i));}// 返回用户信息集合return customers;} }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head><title>展示用户信息</title><!-- 设置表格单元格的样式 --><style>th td {border: 1px solid black;}</style> </head> <body> <!-- 我们要以表格的形式来展示用户信息 --> <table><thead><tr><th>姓名</th><th>年龄</th><th>身高</th></tr></thead><tbody><c:forEach items="${customers}" var="customer"><tr><td>${customer.name}</td><td>${customer.age}</td><td>${customer.height}</td></tr></c:forEach></tbody> </table> </body> </html>
- 一些小细节:
- Customer.java中的成员变量统统设置为包装类的原因在于方便判空 我举个例子 比如我设置了一个price成员变量 如果设置为int基本类型 那么就无法判空 相反 如果设置为了包装类Integer的话 那么判空操作就十分容易
- getRequestDispacher() 可以接收一个参数 表示的是转换的目的地 由于转发操作只能在同一个context中进行 所以你只需要写明Servlet/JSP在当前context中的路径即可
- 我们在jsp中导入标签库的时候 语句为
<%@taglib prefix="c" uri="xxx"%>
其中uri指的是导入的标签库路径 而prefix则为使用标签库中的标签时所加的前缀 设置前缀的意义在于可以区分不同标签库中的相同标签 避免产生歧义 - 我们利用el获取了customers集合 他的本质为request.getAttribute(“customers”) 但是接下去获取集合中每一个元素的属性时 我们也利用了el 但是他的本质就不是request.getAttribute() 我想说的是el有自己的一套解析方式 他会根据不同的场合做出不同的举动
- 一些小细节:
4.转发
- 所谓转发 其实就是将请求发送给指定的接收方 并且跳转到接收方的界面
- 转换操作只能在同一个context(项目 context就是用来定位部署到服务器软件上的项目的) 即只允许你在同一个项目中的不同Servlet/JSP(JSP的本质就是Servlet)进行转发操作
1.转发链条
- 在同一个请求中 可以转发多次 形成一个转发链条
-
在一个转发链条上 可以通过request.setAttribute、request.getAttribute进行数据共享(不同的context之间肯定是不可能发生数据共享的 原因在于转发操作只允许在同一个context中进行)
-