01 model1开发模型
架构图
流程
①用户通过客户端浏览器请求服务器(form表单提交)
②服务器接收用户请求后调用JSP页(Controller)
③在JSP页面中调用JavaBean
④在JavaBean中连接及操作数据库,或者实现其他业务逻辑
⑤JavaBean将执行结果返回JSP页面
⑥服务器读取JSP页面中的内容(执行之后形成对应的HTML代码)
⑦最终结果返回给客户端
案例
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="loginchk.jsp">
用户名:<input type=text name=name /><br/>
密 码:<input type=password name=passwd /><br/>
<input type=submit value=登录 />
<input type=submit value=重置 />
</form>
</body>
</html>
浏览器访问登录首页面之后,输入对应的信息,点击登录之后,表单提交。对应①的步骤。
服务器接收到了该请求之后,就开始执行步骤②
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ page import="com.rjxy.domain.UserCheckBean" %>
<jsp:useBean id="user" scope="session" class="com.rjxy.domain.UserBean"/>
<jsp:setProperty name="user" property="*" />
<%
//③在JSP页面中调用JavaBean
UserCheckBean uc = new UserCheckBean(user);
if(uc.validate())
{
%>
<jsp:forward page="welcome.jsp" />
<%
}
else{
out.println("用户名或者密码错误,请<a href=\"login.jsp\">重新登录</a>");
}
%>
package com.rjxy.domain;
//④在JavaBean中连接及操作数据库,或者实现其他业务逻辑
public class UserCheckBean {
private UserBean user;
public UserCheckBean() {
}
public UserCheckBean(UserBean user) {
this.user = user;
}
public UserBean getUser() {
return user;
}
public void setUser(UserBean user) {
this.user = user;
}
public boolean validate() {
String name = this.user.getName();
String passwd = this.user.getPasswd();
if("张三".equals(name) && "123".equals(passwd)) {
return true;
}
//⑤JavaBean将执行结果返回JSP页面
return false;
}
}
package com.rjxy.domain;
public class UserBean {
private String name;
private String passwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
对应的执行过程,写在了代码注释中。
优点
- 执行效率高,开发效率比较高,适合小型项目
缺点
- 逻辑混乱,页面混乱,维护困难,不易扩展
02 model2开发模型
图解
流程及案例
①用户通过客户端浏览器请求服务器
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<A href="model2Test/UserServlet">点击这里查看</A>
</body>
</html>
②服务器接收用户请求后调用Servlet
package com.rjxy.servlet;
import java.io.IOException;
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 com.rjxy.domain.User;
import com.rjxy.service.UserService;
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UserServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserService();
//Servlet根据用户请求调用JavaBean处理业务
User user = userService.find();
request.setAttribute("user", user);
request.getRequestDispatcher("/show.jsp").forward(request, response);
}
}
③Servlet根据用户请求调用JavaBean处理业务
package com.rjxy.service;
import com.rjxy.dao.UserDao;
import com.rjxy.domain.User;
public class UserService {
private UserDao userDao = new UserDao();
public User find() {
return userDao.find();
}
}
④在JavaBean中连接及操作数据库,或实现其他业务逻辑
package com.rjxy.dao;
import com.rjxy.domain.User;
public class UserDao {
public User find() {
//模仿
return new User("zhangsan","123");
}
}
⑤JavaBean将结果返回Servlet,在Servlet中将结果保存到请求对象中(在servlet中有体现)
对比两个图可以发现,service和dao在划分上都属于JavaBean
⑥由Servlet转发请求到JSP页面(在servlet中有体现)
⑦服务器读取JSP页面中的内容(将页面中静态与动态内容相结合)
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
用户名: ${user.username}
密 码: ${user.passwd }
</body>
</html>
⑧服务器将最终的结果返回给客户端浏览器进行显示。
优点
- 将视图和业务分离,结构清晰,分工明确,维护方便,适合中大型项目。
缺点
- 执行效率相对低,代码量大,重复代码比较多。
03 MVC概述
通过以上model2的案例,充分体现了MVC设计模式,下面是我认为最贴切的MVC三者的功能定义:
- 模型:用于存放数据以及处理用户请求的业务逻辑
解释:模型也就是model,我认为其中包括domain层,因为DAO层负责把数据拿出来放在domain层,所以说DAO层也属于M层,而业务层是对DAO层的封装重组实现具体功能的JAVABEAN,所以说他也归为M层,可见,无论是值Javabean还是处理业务的Javabean都是属于M层的,从定义上看,也是这样。 - 视图:向控制器提交数据,显示模型中的数据
解释:向控制器提交数据从index.jsp页面就可以看出。而后者可从案例中看出,控制器把处理后的对象模型传递到request或者其他作用域中,然后在jsp页面可以用EL或者其他显示数据方式来显示数据。 - 控制器:根据视图提出的请求,判断将请求和数据交给哪个模型处理。处理后的有关结果交给哪个视图进行更新。
这个是很明显的,控制器在model2中使用servlet写的,收到请求之后,进行处理,得先决定调用service的那个方法。处理完之后,根据处理的结果,还得写好转发到哪个视图页面进行显示。