一、MVC的概念
MVC是Model、View、Controller的缩写,分别代表 Web 应用程序中的3种职责1 模型:用于存储数据以及处理用户请求的业务逻辑。
2视图:向控制器提交数据,显示模型中的数据。
3控制器:根据视图提出的请求,判断将请求和数据交给哪个模型处理,处理后的有关结果交给哪个视图更新显示。
二、基于servlet的MVC模式
基于Servlet的MVC模式的具体实现如下。
1.模型:
一个或多个JavaBean 对象,用于存储数据(实体模型,由JavaBean类创建和处理业务逻辑(业务模型,由一般的 Java 类创建)。
2视图:
一个或多个JSP页面,向控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean 标记来显示数据。
3控制器:
一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的JavaBean,并将处理结果存放到实体模型JavaBean中输出给视图显示。基于Servlet的MVC模式的具体实现如下。
模型:一个或多个JavaBean 对象,用于存储数据(实体模型,由JavaBean类创建和处理业务逻辑(业务模型,由一般的 Java 类创建)。
2视图:一个或多个JSP页面,向控制器提交数据和为模型提供数据显示,JSP页面主要使用HTML标记和JavaBean 标记来显示数据。
3控制器:个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的JavaBean,并将处理结果存放到实体模型JavaBean中输出给视图显示:
三、代码
1.大致框架:
2. jsp页面-loginCheck
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action ="loginCheckServlet" method ="post">
<table>
<tr>
<td>用户名:</td >
<td><input type ="text" name ="name"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type ="password" name="pwd"/></td>
</tr>
<tr>
<td><input type="submit" value ="提交"/></td >
<td><input type="reset" value ="重置"/></td >
</tr >
</table>
</form>
</body>
</html>
3.jsp页面-loginSuccess
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>loginSuccess.jsp</title>
</head>
<body>
<jsp:useBean id="user" type="dto.User" scope="request"/>
恭喜<jsp:getProperty property="name" name="user"/>登录成功!
<!-- 用来获取user对象的name,显示在页面上"恭喜[用户名]登录成功" -->
</body>
</html>
<!-- 这段JSP代码的作用是显示用户登录成功的消息,并使用了JavaBean(dto.User)来存储用户信息 -->
<!-- 用<jsp:useBean>标签实例化一个名为user的对象,类型为dto.User,如果该不存在,会创建一个新的实例,如果存在,回复用之前的 -->
4. 实体模型user
package dto;
/*定义实体模型来表示数据*/
public class User {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd=pwd;
}
}
5. 业务模型
package service;
import dto.User;
/*定义业务模型来处理业务,检查用户名和密码是否正确*/
public class UserCheck {
public boolean validate(User user) {
if(user!=null && user.getName().equals("JSPMVC")) {
if(user.getPwd().equals("MVC")) {
return true;
}
return false;
}
return false;
}
}
4. 控制层
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 dto.User;
import service.UserCheck;
/*控制器:一个或多个Servlet对象,根据视图提交的请求进行控制,
* 即将请求转发给 处理业务逻辑的JavaBean,
* 并将结果存放到实体模型JavaBean中,
* 处理后的结果交给视图显示*/
/*表单提交中servlet的配置方法*/
@WebServlet(name="loginCheckServlet",urlPatterns=("/loginCheckServlet"))
public class loginCheckServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
/* 序列化ID,相当于身份认证,主要用于程序的版本控制,
* 保持不同版本的兼容性,在程序版本升级时避免程序
* 报出版本不一致的错误 */
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
/*因为这个是控制器,是将视图层转发给业务层,处理后又转给视图层
* 所以我们需要两个层之间进行通信,HTTP就是用于传输超文本数据的应用层协议
* 有两个方法处理HTTP请求,doGet和doPost
* 对应HTTP GET请求 和HTTP POST请求
* GET用于获取数据 POST用于提交数据*/
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
/*传进来两个参数,HttpServletRequest用于获取客户端的数据
* ,HttpServletResponse用于浏览器给客户端的响应*/
request.setCharacterEncoding("utf-8");/*设置响应内容类型*/
String name= request.getParameter("name");//获取HTTP请求的参数的值
String pwd = request.getParameter("pwd");
User user = new User();//实例化一个对象,用对象调用其属性或方法
user.setName(name);//数据存储在模型user中
user.setPwd(pwd);
UserCheck uc = new UserCheck();//实例化业务模型userCheck
if(uc.validate(user)) {//validate方法传进来一个user,返回boolean类型,看登录凭据是否有效
request.setAttribute("user", user);
/*setAttribute用于向请求对象中添加属性
void setAttribute(String name, Object value)
name参数是要设置的属性的名称。
value参数是要设置的属性的值,可以是任何Java对象
在后续的请求处理中,可以通过请求对象访问这个属性
,从而获取和使用用户对象的相关信息
使用EL表达式${user}来获取这个用户对象
通过${user.username}可以获取并显示用户的用户名*/
RequestDispatcher dis = request.getRequestDispatcher("loginSuccess.jsp");
//将请求转发到名为"loginSuccess.jsp"的JSP页面
dis.forward(request, response);//执行请求转发
} else {
response.sendRedirect("loginCheck.jsp");//发送一个重定向
}
}
}