简单自定义MVC框架,并实现校验功能
2020-03-02 本文已影响0人
煗NUAN
-
MVC简介
- MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码.
- 控制器Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发和重定向;servlet
- 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
- 模型Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。javabean
-
Spring MVC的执行原理
- 浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet。
- 中央调度器调用处理器映射器handerMapping,处理器映射器根据请求的url找到处理该请求对应的处理器hander及相关的拦截器intercepter,将它们封装成一个处理器执行链并返回给中央调度器
- 中央调度器根据处理器执行链中的处理器找到对应的处理器适配器handerAdaptor
- 处理适配器调用处理器执行对应的方法并将返回的结果封装为一个对象modelAndView中返回给中央处理器,当然在处理器执行方法前如果方法有拦截器的话会先依次执行拦截器的prehander方法,方法执行结束后会依次执行拦截器的posthander方法。
- 中央调度器获取到modelAndView对象后,调用视图解析器viewResolver,将modelAndView封装为视图对象
- 中央调度器获取到视图对象后,进行渲染,生成最后的响应返回给浏览器。
-
自定义MVC框架
- 注意图中的ActionServlet也可是DispatcherServlet
-
控制器:
- 主控制动态调用子控制器,完成具体的业务逻辑
- 主控制器:查看是否有对应的子控制器来处理用户请求,如果就调用子控制器来处理请求,没有就报错,就处理不了请求
- 子控制器:就是处理用户请求用的
-
代码实现
-
UserBean.java
public class UserBean {
private String uid;
private String name;
private String age;
private String sex;
private String img;
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("UserBean{");
sb.append("uid='").append(uid).append('\'');
sb.append(", name='").append(name).append('\'');
sb.append(", age='").append(age).append('\'');
sb.append(", sex='").append(sex).append('\'');
sb.append(", img='").append(img).append('\'');
sb.append('}');
return sb.toString();
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
}
- 定义需要校验的Form文件UserForm.java
public class UserForm {
private String uid;
private String name;
private String age;
private String sex;
private String img;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
}
- 自定义接口,实现管理多个请求,模拟Spring MVC中的控制器Controller.java
public interface Controller {
String handleRequest(HttpServletRequest req, HttpServletResponse resp);
}
- 实现控制器,并且返回需要跳转的页面地址ToLoginController.java
public class ToLoginController implements Controller {
@Override
public String handleRequest(HttpServletRequest req, HttpServletResponse resp) {
String str="/WEB-INF/page/loginController.jsp";
return str;
}
}
- 实现控制器,并且获取需要返回给页面的内容,放到req域中,并且放回转发页面的地址ToUserInfoController.java
public class ToUserInfoController implements Controller {
@Override
public String handleRequest(HttpServletRequest req, HttpServletResponse resp) {
UserBean userBean=new UserBean();
String uid= req.getParameter("uid");
String name=req.getParameter("name");
String age= req.getParameter("age");
String sex=req.getParameter("sex");
String img=req.getParameter("img");
UserForm uf=new UserForm(); //错误的对象
uf.setName(name);
uf.setAge(age);
uf.setSex(sex);
uf.setImg(img);
//添加校验功能
UserValidata uv=new UserValidata();
List<String> errors=uv.validata(uf); //把错误对象放到list集合中
if (errors!=null && !errors.isEmpty()){ //如果有错误信息,跳转到登陆页面
req.setAttribute("error",errors); //把错误信息放到req域中
return "/WEB-INF/page/loginController.jsp";
}else {
userBean.setUid(uid);
userBean.setName(name);
userBean.setAge(age);
userBean.setSex(sex);
userBean.setImg(img);
req.setAttribute("user",userBean);
}
return "/WEB-INF/page/userInfoController.jsp";
}
}
- 负责将多个请求分发给各⾃不同的控制器的类DispatcherServlet.java
@WebServlet({"/toLoginController","/toUserInfoController"})
public class DispatcherServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestURL=req.getRequestURI(); //获取请求地址
String action=requestURL.substring(requestURL.lastIndexOf("/")+1);
//获取注解的名称
Controller con=null;
if ("toUserInfoController".equalsIgnoreCase(action)){
con=new ToUserInfoController();
}else if ("toLoginController".equalsIgnoreCase(action)){
con=new ToLoginController();
}
String url=con.handleRequest(req,resp);
//获取需要转发的对象
req.getRequestDispatcher(url).forward(req,resp);
}
}
- 设置校验类UserValidata.java
public class UserValidata {
/**
* Description: 校验给定的UserForm对象
* @param: uf : 需要校验的对象
* @return: 如果校验不成功,则把错误信息存储到集合中
*/
public List<String> validata(UserForm uf){
List<String> errors=new ArrayList<String>();
//定义list集合用来存放错误信息
String name=uf.getName();
String age=uf.getAge();
String sex=uf.getSex();
String img=uf.getImg();
if (name==null || name.length()==0){
errors.add("name值为空");
}
if (age==null || age.length()==0){
errors.add("age值为空");
}
if (sex==null || sex.length()==0){
errors.add("sex值为空");
}
if (img==null || img.length()==0){
errors.add("img值为空");
}
return errors;
}
}
- 登陆页面的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h3>欢迎你,大帅比</h3>
<form action="/toUserInfoController" method="post" class="form-horizontal" role="form">
<div class="form-group">
<lable class="col-sm-2 control-label" >编号</lable>
<div class="col-sm-8">
<input type="text" name="uid" class="form-control">
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >名称</lable>
<div class="col-sm-8">
<input type="text" name="name" class="form-control">
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >年龄</lable>
<div class="col-sm-8">
<input type="text" name="age" class="form-control">
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >性别</lable>
<div class="col-sm-8">
<input type="text" name="sex" class="form-control">
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >图片</lable>
<div class="col-sm-8">
<input type="text" name="img" class="form-control">
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" ></lable>
<div class="col-sm-8">
<input type="submit" value="submit" class="form-control">
</div>
</div>
</form>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
- 用户详情的jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户详情</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h3>大帅比,你好</h3>
<div class="form-horizontal" role="form">
<div class="form-group">
<lable class="col-sm-2 control-label" >名称</lable>
<div class="col-sm-8">
<span class="form-control">${user.name}</span>
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >年龄</lable>
<div class="col-sm-8">
<span class="form-control">${user.age}</span>
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >性别</lable>
<div class="col-sm-8">
<span class="form-control">${user.sex}</span>
</div>
</div>
<div class="form-group">
<lable class="col-sm-2 control-label" >图片</lable>
<div class="col-sm-8">
<span class="form-control">${user.img}</span>
</div>
</div>
</div>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>