自定义MVC实现登录案例
2024-10-21 13:39:28
MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
我们今天自己定义的MVC框架是简单模仿struts2的
然后我们会用到两个常用的技能点,一个是使用dom4j解析xml文件,还有一个是java反射机制。
案例架构:
1.导入依赖jar包:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>01MyBatis</artifactId>
<groupId>cn.happy</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>12CustomMVC</artifactId>
<packaging>war</packaging>
<name>12CustomMVC Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
<scope>test</scope>
</dependency> <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency> <!--ServletAPI-->
<dependency>
<groupId>javaee</groupId>
<artifactId>javaee-api</artifactId>
<version>5</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>
2..定义自己的dtd约束文件和配置信息:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE myframe[
<!ELEMENT myframe (actions)>
<!ELEMENT actions (action*)>
<!ELEMENT action (result*)>
<!ATTLIST action
name CDATA #REQUIRED
class CDATA #REQUIRED>
<!ELEMENT result (#PCDATA)>
<!ATTLIST result
name CDATA #IMPLIED
redirect (true|false) "false">
]>
<myframe>
<actions>
<action name="login" class="cn.curry.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="login">login.jsp</result>
</action>
</actions>
</myframe>
3.分层搭建
Action:
Action 自己定义的结果集和执行方法 :
package cn.curry.action; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Created by Administrator on 2018/3/4.
*/
public interface Action {
//定义字符串常量
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
//准备一个方法,用于获取数据
public String execute(HttpServletRequest request, HttpServletResponse response)throws Exception;
}
定义一个ActionMapping用来存放Action节点
package cn.curry.action; import java.util.HashMap;
import java.util.Map; /**
* Created by Administrator on 2018/3/4.
*/
public class ActionMapping {
private String name;
private String className;
private Map<String,String> map=new HashMap<String, String>(); public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public String getValue(String key) {
return map.get(key);
} public void addToMap(String key,String value) {
map.put(key,value);
}
}
定义ActionManager 通过类名用反射机制获取对象
package cn.curry.action; /**
* Created by Administrator on 2018/3/4.
*/
public class ActionManager {
public static Action getActionClass(String className) throws Exception{
Class clazz=null;
Action action=null;
clazz=Thread.currentThread().getContextClassLoader().loadClass(className);
if (clazz==null){
clazz=Class.forName(className);
}
if (action==null){
action=(Action) clazz.newInstance();
}
return action;
}
}
ActionMappingManager 通过dom4j读取xml
package cn.curry.action; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
* Created by Administrator on 2018/3/4.
*/
public class ActionMappingManager {
private Map<String,ActionMapping> map=new HashMap<String, ActionMapping>(); public ActionMapping getValue(String key) {
return map.get(key);
} public void addToMaps(String key,ActionMapping value) {
map.put(key,value);
} public ActionMappingManager(String [] files)throws Exception{
for (String item:files){
init(item);
}
}
public void init(String path)throws Exception{
InputStream is=this.getClass().getResourceAsStream("/"+path);
Document doc=new SAXReader().read(is);
Element root=doc.getRootElement();
Element actions=(Element)root.elements("actions").iterator().next();
for (Iterator<Element> action = actions.elementIterator("action"); action.hasNext();){
Element actionnext=action.next();
ActionMapping am=new ActionMapping();
am.setName(actionnext.attributeValue("name"));
am.setClassName(actionnext.attributeValue("class"));
for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
Element resultnext=result.next();
String name=resultnext.attributeValue("name");
String value=resultnext.getText();
if (name==null||"".equals(name)){
name="success";
}
am.addToMap(name,value);
}
map.put(am.getName(),am);
}
}
}
接下来我们定义一个Servlet来获取请求LoginServlet 主通过获取的请求找到Framework.xml
package cn.curry.servlet; import cn.curry.action.Action;
import cn.curry.action.ActionManager;
import cn.curry.action.ActionMapping;
import cn.curry.action.ActionMappingManager; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* Created by Administrator on 2018/3/4.
*/
public class LoginServlet extends HttpServlet {
private ActionMappingManager manager=null;
private String getClassName(HttpServletRequest request){
String uri=request.getRequestURI();
System.out.println(uri+" uri");
String context=request.getContextPath();
System.out.println(context+" context");
String result=uri.substring(context.length());
System.out.println(result+" result");
return result.substring(1,result.lastIndexOf("."));
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String key=getClassName(request);
System.out.println(key+" key");
try {
ActionMapping actionMapping=manager.getValue(key);
System.out.println(actionMapping.getClassName()+" classname");
Action action= ActionManager.getActionClass(actionMapping.getClassName());
String result=action.execute(request,response);
System.out.println(result+" result");
String path=actionMapping.getValue(result);
System.out.println(path+" path");
request.getRequestDispatcher(path).forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
} public void init(ServletConfig config) throws ServletException {
String fileName=config.getInitParameter("config");
String file[]=null;
if(fileName==null){
file=new String[]{"Framework.xml"};
}else {
fileName.split(",");
}
try {
manager=new ActionMappingManager(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.curry.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
jsp页面
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form action="login.action" method="post">
用户名:<input name="name"><br>
密码:<input name="pwd"/><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</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>
执行结果;
最新文章
- 学习笔记:利用GDI+生成简单的验证码图片
- Ant学习-002-ant 执行 TestNG 测试用例时 [testng] java.lang.NoClassDefFoundError: com/beust/jcommander/ParameterException 解决方案
- android studio配置AndroidAnnotations
- ARP:地址解析协议
- [反汇编练习] 160个CrackMe之005
- iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
- 公有云开启全面竞争时代——青云QingCloud
- http://www.shengshiyouxi.com
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
- C#扩展方法类库StringExtensions
- Spring揭秘 读书笔记 三 bean的scope与FactoryBean
- 小程序顶部navbar(非Slider)
- ASP.NET Core 快速入门(环境篇)
- CG-CTF simple-machine
- 稍稍解读下ThreadPoolExecutor
- 一、I/O操作(中文问题)
- 玩linux就是不断的踩坑,踩坑。最近的坑。xpath firefox兼容问题,抓取表格。
- MySQL安装配置错误\日常使用错误
- Linux:TCP状态/半关闭/2MSL/端口复用
- 基于java NIO 的服务端与客户端代码
热门文章
- Springboot 5.Springboot 返回cookies信息的post接口开发
- es6常用的
- .pyc是个什么 python的执行过程
- 模型评估【PR|ROC|AUC】
- Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?
- 老男孩Python全栈学习 S9 日常作业 001
- 利用 /proc/sys/kernel/core_pattern隐藏系统后门
- LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001
- 设置redis服务开机自启动
- JS 正则中的命名捕获分组