MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。[1]
使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet +
javabean的模式。如图所示:
视图(JSP,HTML,ASP,VUE…)的职责:
1)数据显示
2) 发起请求(人机交互)
3)减少业务逻辑
控制器(Servlet)的职责:
1)获取前端的数据
2)页面跳转
3)创建Model层的引用
4)创建service层对象
Model(业务模型)
service + dao
这里先谈Control控制器和Service业务逻辑的交互性。
可以先写一个Model页面中service页面,如下:
public class UserServiceImpl {
public User login(String name,String pass){
User user = null;
if (name.equals("admin")&&pass.equals("admin")) {
user = new User(name,pass);
}
return user;
}
public Boolean register(User user){
if (user.getName().equals("张三")){
System.out.println(user.getName()+"注册失败");
return false;
}
System.out.println(user.getName()+"注册成功");
return true;
}
}
然后再写一个Control控制器页面,在控制器里调用了service的业务逻辑:
@WebServlet("/login.action")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserServiceImpl userService = new UserServiceImpl();
//设置request的编码方式
request.setCharacterEncoding("utf-8");
//设置response的编码方式
response.setCharacterEncoding("utf-8");
//接收用户的信息
String name = request.getParameter("name");
String pass = request.getParameter("pass");
System.out.println(name+":"+pass);
User user = userService.login(name,pass);
//判断是否登陆成功
if (user != null) {
//通过request得到Session对象
HttpSession session = request.getSession();
//将用户对象添加到session中
session.setAttribute("user",user);
//转发,传递信息request,response
//request.getRequestDispatcher("main.html").forward(request,response);
response.sendRedirect("main.html");
}else {
//登陆失败则重定向
response.sendRedirect("failed.html");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
Control和View的交互
首先进入Control的页面:
@WebServlet("/userservlet.action")
public class UserServlet extends HttpServlet {
public UserServlet() {
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//创建用户对象列表
List list = new ArrayList<>();
list.add(new User("张飞",18,new Date()));
list.add(new User("刘备",17,new Date()));
list.add(new User("关羽",22,new Date()));
list.add(new User("黄忠",23,new Date()));
list.add(new User("赵云",25,new Date()));
req.setAttribute("userlist",list);
//转发
req.getRequestDispatcher("userlist.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
然后再写View的页面,这里用jsp原生代码来实现:
<%--用表格来接收用户信息--%>
| 姓名 | 年龄 | 生日 | 操作 |
|---|---|---|---|
| "u.getName()+" | "+u.getAge()+" | " +u.getBirth()+" | 修改 删除 |
用jstl重写View页面,首先需要在项目里导入jstl的jar包,jstl的全称是Java server pages standarded tag library,即JSP标准标签库,然后在页面引入jsp标准标签库,如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
接下来就可以使用jsp标准标签库,在使用过程中还要搭配EL表达式来使用,EL表达式全称为Expression
Language,即表达式语言。 EL表达式的作用是:代替jsp中的表达式脚本进行数据的输出,只能获取数据,不能设置数据。
EL表达式的格式是:${表达式} ,注:EL表达式写在jsp页面中,表达式一般是域对象的key。
EL表达式搜索域范围的顺序是:EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关。
<%--用表格来接收用户信息--%>
| 编号 | 姓名 | 年龄 | 生日 | 操作 |
|---|---|---|---|---|
| ${vs.count} | ${user.name} | ${user.age} |
|
修改 删除 |



