Fork me on GitHub

自定义MVC实现登录案例

MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

我们今天自己定义的MVC框架是简单模仿struts2的

然后我们会用到两个常用的技能点,一个是使用dom4j解析xml文件,还有一个是java反射机制。

案例架构:

1.导入依赖jar包:

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 3     <parent>
 4         <artifactId>01MyBatis</artifactId>
 5         <groupId>cn.happy</groupId>
 6         <version>1.0-SNAPSHOT</version>
 7     </parent>
 8     <modelVersion>4.0.0</modelVersion>
 9     <artifactId>12CustomMVC</artifactId>
10     <packaging>war</packaging>
11     <name>12CustomMVC Maven Webapp</name>
12     <url>http://maven.apache.org</url>
13     <dependencies>
14         <dependency>
15             <groupId>junit</groupId>
16             <artifactId>junit</artifactId>
17             <version>4.3</version>
18             <scope>test</scope>
19         </dependency>
20 
21         <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
22         <dependency>
23             <groupId>dom4j</groupId>
24             <artifactId>dom4j</artifactId>
25             <version>1.6.1</version>
26         </dependency>
27 
28         <!--ServletAPI-->
29         <dependency>
30             <groupId>javaee</groupId>
31             <artifactId>javaee-api</artifactId>
32             <version>5</version>
33         </dependency>
34     </dependencies>
35     <build>
36         <resources>
37             <resource>
38                 <directory>src/main/java</directory>
39                 <includes>
40                     <include>**/*.*</include>
41                 </includes>
42             </resource>
43         </resources>
44     </build>
45 </project>

2..定义自己的dtd约束文件和配置信息:

 1 <?xml version='1.0' encoding='UTF-8'?>
 2 <!DOCTYPE myframe[
 3         <!ELEMENT myframe (actions)>
 4         <!ELEMENT actions (action*)>
 5         <!ELEMENT action (result*)>
 6         <!ATTLIST action
 7                 name CDATA #REQUIRED
 8                 class CDATA #REQUIRED>
 9         <!ELEMENT result (#PCDATA)>
10         <!ATTLIST result
11                 name CDATA #IMPLIED
12                 redirect (true|false) "false">
13         ]>
14 <myframe>
15     <actions>
16         <action name="login" class="cn.curry.action.LoginAction">
17             <result name="success">/success.jsp</result>
18             <result name="login">login.jsp</result>
19         </action>
20     </actions>
21 </myframe>

3.分层搭建

Action:

Action  自己定义的结果集和执行方法 :

 1 package cn.curry.action;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 /**
 7  * Created by Administrator on 2018/3/4.
 8  */
 9 public interface Action {
10     //定义字符串常量
11     public static final String SUCCESS="success";
12     public static final String NONE="none";
13     public static final String ERROR="error";
14     public static final String INPUT="input";
15     public static final String LOGIN="login";
16     //准备一个方法,用于获取数据
17     public String execute(HttpServletRequest request, HttpServletResponse response)throws Exception;
18 }

 

 定义一个ActionMapping用来存放Action节点

 1 package cn.curry.action;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**
 7  * Created by Administrator on 2018/3/4.
 8  */
 9 public class ActionMapping {
10     private String name;
11     private String className;
12     private Map<String,String> map=new HashMap<String, String>();
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 
22     public String getClassName() {
23         return className;
24     }
25 
26     public void setClassName(String className) {
27         this.className = className;
28     }
29 
30     public String getValue(String key) {
31         return map.get(key);
32     }
33 
34     public void addToMap(String key,String value) {
35         map.put(key,value);
36     }
37 }

定义ActionManager  通过类名用反射机制获取对象

 1 package cn.curry.action;
 2 
 3 /**
 4  * Created by Administrator on 2018/3/4.
 5  */
 6 public class ActionManager {
 7     public static Action getActionClass(String className) throws Exception{
 8         Class clazz=null;
 9         Action action=null;
10         clazz=Thread.currentThread().getContextClassLoader().loadClass(className);
11         if (clazz==null){
12             clazz=Class.forName(className);
13         }
14         if (action==null){
15             action=(Action) clazz.newInstance();
16         }
17         return action;
18     }
19 }

ActionMappingManager  通过dom4j读取xml

 1 package cn.curry.action;
 2 
 3 import org.dom4j.Document;
 4 import org.dom4j.Element;
 5 import org.dom4j.io.SAXReader;
 6 
 7 import java.io.InputStream;
 8 import java.util.HashMap;
 9 import java.util.Iterator;
10 import java.util.Map;
11 
12 /**
13  * Created by Administrator on 2018/3/4.
14  */
15 public class ActionMappingManager {
16     private Map<String,ActionMapping> map=new HashMap<String, ActionMapping>();
17 
18     public  ActionMapping getValue(String key) {
19         return map.get(key);
20     }
21 
22     public void addToMaps(String key,ActionMapping value) {
23         map.put(key,value);
24     }
25 
26     public ActionMappingManager(String [] files)throws Exception{
27         for (String item:files){
28             init(item);
29         }
30     }
31     public void init(String path)throws Exception{
32         InputStream is=this.getClass().getResourceAsStream("/"+path);
33         Document doc=new SAXReader().read(is);
34         Element root=doc.getRootElement();
35         Element actions=(Element)root.elements("actions").iterator().next();
36         for (Iterator<Element> action = actions.elementIterator("action"); action.hasNext();){
37             Element actionnext=action.next();
38             ActionMapping am=new ActionMapping();
39             am.setName(actionnext.attributeValue("name"));
40             am.setClassName(actionnext.attributeValue("class"));
41             for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
42                 Element resultnext=result.next();
43                 String name=resultnext.attributeValue("name");
44                 String value=resultnext.getText();
45                 if (name==null||"".equals(name)){
46                     name="success";
47                 }
48                 am.addToMap(name,value);
49             }
50             map.put(am.getName(),am);
51         }
52     }
53 }

接下来我们定义一个Servlet来获取请求LoginServlet 主通过获取的请求找到Framework.xml

 1 package cn.curry.servlet;
 2 
 3 import cn.curry.action.Action;
 4 import cn.curry.action.ActionManager;
 5 import cn.curry.action.ActionMapping;
 6 import cn.curry.action.ActionMappingManager;
 7 
 8 import javax.servlet.ServletConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import java.io.IOException;
14 
15 /**
16  * Created by Administrator on 2018/3/4.
17  */
18 public class LoginServlet extends HttpServlet {
19     private ActionMappingManager manager=null;
20     private String getClassName(HttpServletRequest request){
21         String uri=request.getRequestURI();
22         System.out.println(uri+"        uri");
23         String context=request.getContextPath();
24         System.out.println(context+"             context");
25         String result=uri.substring(context.length());
26         System.out.println(result+"              result");
27         return result.substring(1,result.lastIndexOf("."));
28     }
29 
30 
31     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
32         String key=getClassName(request);
33         System.out.println(key+"           key");
34         try {
35             ActionMapping actionMapping=manager.getValue(key);
36             System.out.println(actionMapping.getClassName()+"            classname");
37             Action action= ActionManager.getActionClass(actionMapping.getClassName());
38             String result=action.execute(request,response);
39             System.out.println(result+"                   result");
40             String path=actionMapping.getValue(result);
41             System.out.println(path+"                path");
42             request.getRequestDispatcher(path).forward(request,response);
43         } catch (Exception e) {
44             e.printStackTrace();
45         }
46     }
47 
48     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
49         doPost(request,response);
50     }
51 
52     public void init(ServletConfig config) throws ServletException {
53         String fileName=config.getInitParameter("config");
54         String file[]=null;
55         if(fileName==null){
56             file=new String[]{"Framework.xml"};
57         }else {
58             fileName.split(",");
59         }
60         try {
61             manager=new ActionMappingManager(file);
62         } catch (Exception e) {
63             e.printStackTrace();
64         }
65     }
66 }

配置web.xml文件

 1 <!DOCTYPE web-app PUBLIC
 2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5 <web-app>
 6   <display-name>Archetype Created Web Application</display-name>
 7     <servlet>
 8         <servlet-name>LoginServlet</servlet-name>
 9         <servlet-class>cn.curry.servlet.LoginServlet</servlet-class>
10     </servlet>
11     <servlet-mapping>
12         <servlet-name>LoginServlet</servlet-name>
13         <url-pattern>*.action</url-pattern>
14     </servlet-mapping>
15 </web-app>

jsp页面

login.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>登录</title>
 5 </head>
 6 <body>
 7 <form action="login.action" method="post">
 8     用户名:<input name="name"><br>
 9     密码:<input name="pwd"/><br/>
10     <input type="submit" value="登陆"/>
11 </form>
12 </body>
13 </html>

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/3/4
  Time: 19:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h1>success!!!</h1>
</body>
</html>

执行结果;

 

posted @ 2018-03-04 20:03  L波涛  阅读(797)  评论(0编辑  收藏  举报