Servlet适合用Java编写复杂的业务逻辑。JSP适合编写HTML并穿插动态内容。
MVC作用即取长补短的结合二者,让Servlet专注业务处理,JSP专注页面显示
MVC模式是一种分离业务逻辑和显示逻辑的设计模式
**
假设我们已经编写了几个JavaBean:
public class User {public long id;public String name;public School school;}public class School {public String name;public String address;}
在UserServlet中,我们可以从数据库读取User、School等信息,然后,把读取到的JavaBean先放到HttpServletRequest中,再通过forward()传给user.jsp处理:
@WebServlet(urlPatterns = "/user")public class UserServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 假装从数据库读取:School school = new School("No.1 Middle School", "101 South Street");User user = new User(123, "Bob", school);// 放入Request中;setAttribute方法是保存数据的方法,可以使用对应的get方法把存储的数据取出来req.setAttribute("user", user);// forward给user.jsp:req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req, resp);}}
在user.jsp中,我们只负责展示相关JavaBean的信息,不需要编写访问数据库等复杂逻辑:
<%@ page import="com.itranswarp.learnjava.bean.*"%><%//取出数据并保存User user = (User) request.getAttribute("user");%><html><head><title>Hello World - JSP</title></head><body>//输出保存的数据<h1>Hello <%= user.name %>!</h1><p>School Name:<span style="color:red"><%= user.school.name %></span></p><p>School Address:<span style="color:red"><%= user.school.address %></span></p></body></html>
请注意几点:
- 需要展示的
User被放入HttpServletRequest中以便传递给JSP,因为一个请求对应一个HttpServletRequest,我们也无需清理它,处理完该请求后HttpServletRequest实例将被丢弃; - 把
user.jsp放到/WEB-INF/目录下,是因为WEB-INF是一个特殊目录,Web Server会阻止浏览器对WEB-INF目录下任何资源的访问,这样就防止用户通过/user.jsp路径直接访问到JSP页面; - JSP页面首先从
request变量获取User实例,然后在页面中直接输出,此处未考虑HTML的转义问题,有潜在安全风险。
我们在浏览器访问http://localhost:8080/user,请求首先由UserServlet处理,然后交给user.jsp渲染:
我们把UserServlet看作业务逻辑处理,把User看作模型,把user.jsp看作渲染,这种设计模式通常被称为MVC:Model-View-Controller,即UserServlet作为控制器(Controller),User作为模型(Model),user.jsp作为视图(View),整个MVC架构如下:
┌───────────────────────┐
┌────>│Controller: UserServlet│
│ └───────────────────────┘
│ │
┌───────┐ │ ┌─────┴─────┐
│Browser│────┘ │Model: User│
│ │<───┐ └─────┬─────┘
└───────┘ │ │
│ ▼
│ ┌───────────────────────┐
└─────│ View: user.jsp │
└───────────────────────┘
使用MVC模式的好处是,Controller专注于业务处理,它的处理结果就是Model。Model可以是一个JavaBean,也可以是一个包含多个对象的Map,Controller只负责把Model传递给View,View只负责把Model给“渲染”出来,这样,三者职责明确,且开发更简单,因为开发Controller时无需关注页面,开发View时无需关心如何创建Model。
MVC模式广泛地应用在Web页面和传统的桌面程序中,我们在这里通过Servlet和JSP实现了一个简单的MVC模型,但它还不够简洁和灵活,后续我们会介绍更简单的Spring MVC开发。
MVC进阶(写一个MVC框架)
通过结合Servlet和JSP的MVC模式,我们可以发挥二者各自的优点:
- Servlet实现业务逻辑;
- JSP实现展示逻辑。
但是,直接把MVC搭在Servlet和JSP之上还是不太好,原因如下:
- Servlet提供的接口仍然偏底层,需要实现Servlet调用相关接口;
- JSP对页面开发不友好,更好的替代品是模板引擎;
- 业务逻辑最好由纯粹的Java类实现,而不是强迫继承自Servlet。
https://www.liaoxuefeng.com/wiki/1252599548343744/1337408645759009
