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"); //创建用户对象列表 Listlist = 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} |
|
修改 删除 |