一、Model1与Model2:

Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起。

Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发

二、MVC设计模式:

由3个部分组成,各部分作用如下:

Model:模型,主要用于数据和业务的处理

View:视图,用于数据的显示

Controller:控制器,用于进行流程控制

MVC设计模式的特点:

①一个模型可以对应多个视图

②显示与逻辑控制的分离

③分层控制,减轻了代码间的耦合


自定义MVC框架只需dom4j.jar包即可!

三、准备XML文档Framework.xml

注意点:

<!-- ELEMENT 表示元素 -->
<!-- ATTLIST 表示属性 -->
<!-- CDATA 表示字符串类型 -->
<!-- REQUIRED 表示此属性必须的写 -->
<!-- *代表多个 -->
<!-- IMPLIED 表示此属性可写 -->

<!DOCTYPE Framework[
<!ELEMENT Framework (actions)>
<!ELEMENT actions (action*)>
<!ELEMENT action (result*)> <!ATTLIST action name CDATA #REQUIRED
class CDATA #REQUIRED
> <!ATTLIST RESULT name CDATA #IMPLIED
redirect (true|false) "false"
> ]> <Framework>
<actions>
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="success">success.jsp</result>
<result name="login">index.jsp</result>
</action>
</actions>
</Framework>


四、定义自己的Action接口,用于存放结果集和要执行的方法

public interface Action {
//定义两个静态字符串常量(逻辑视图名)
public static final String SUCCESS="success";
public static final String LOGIN="login";
//定义一个抽象方法execute
public String execute(HttpServletRequest request,HttpServletResponse response)throws Exception; }

五、定义ActionMapping类用于存放Action节点,即一个ActionMapping类可以视为配置文件中的一个action节点

public class ActionMapping {
//根据action节点中的属性 以及action节点中的<result></result>节点定义三个私有属性 private String name;//action的名称
private String classname;//action对应程序中的类
private Map<String,String> results=new HashMap<String,String>(); //向results集合中添加数据的方法
public void addResult(String name,String value){
results.put(name, value);
} //根据名称获取的方法
public String getResults(String name){
return results.get(name);
} public Map<String, String> getResults() {
return results;
}
public void setResults(Map<String, String> results) {
this.results = results;
}
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;
}

六、定义ActionMappingManager类用于管理ActionMapping,并通过dom4j解析Framework.xml配置文件。从而获取根节点,以及actions节点,并通过for循环遍历actions节点下的action节点拿到name和class的属性值,由于一个action节点下有多个result节点 及遍历action下所有的result节点,分别存入到actionMapping中的双列集合中,最后得到所有action节点的集合

public class ActionMappingManager {
//actionMapping类的集合
private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>(); public ActionMapping getActionMapping(String name){
return maps.get(name);
} //解析src下所有配置文件
public ActionMappingManager(String[]files){
for (String filename : files) {
init(filename);
}
} //创建初始化方法,使用dom4j解析配置文件
public void init(String path){
try {
//getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据
InputStream is=this.getClass().getResourceAsStream("/"+path);
//解析XML
Document doc=new SAXReader().read(is);
//获取根节点
Element root = doc.getRootElement();
//获取actions节点
Element actions =(Element)root.elementIterator("actions").next();
//使用for循环来
//遍历actions节点下的所有action节点
for (Iterator<Element> action=actions.elementIterator("action");action.hasNext();) {
//获取到action节点
Element actionnext = action.next();
//分别获取到action节点中的name属性和class属性
String name=actionnext.attributeValue("name");
String classname=actionnext.attributeValue("class");
//将以上两个属性保存到ActionMapping类中
ActionMapping mapp=new ActionMapping();
mapp.setClassname(classname);
mapp.setName(name);
//由于一个action节点下有多个result节点 遍历action下所有的result节点
for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
//获取到result节点
Element resultnext = result.next();
//提取result节点的name属性值和result节点中的值
String resultname= resultnext.attributeValue("name");
String resultvalue= resultnext.getText();
//将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
mapp.addResult(resultname, resultvalue);
}
//得到所有action节点的集合
maps.put(mapp.getName(), mapp);
} } catch (Exception e) { }
}

七、使用反射机制根据字符串类型的类名获取到具体的类--ActionManager

public class ActionManager {

    public static Action getActionClass(String classname){
Class clazz=null;
Action action=null;
//获取当前线程的加载类
try {
clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} if(clazz==null){
try {
//如果该线程中没有,那么使用class.forname方法获取
clazz=Class.forName(classname);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} if(action==null){
//将获取到的类型转换为action,调用无参构造函数,某种程度上相当于new,不过new需要指定类型
try {
action =(Action)clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return action;
}

八、定义Servlet类,详情见注释!注意点在web.xml中添加 <load-on-startup>节点,让程序一开始就初始化servlet

public class MyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response); } ActionMappingManager man=null;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取到ActionMapping对象
ActionMapping actionMapping=man.getActionMapping(getname(request));
//获取action接口利用反射机制
Action action = ActionManager.getActionClass(actionMapping.getClassname());
try {
String message=action.execute(request, response);
String results=actionMapping.getResults(message);
response.sendRedirect(results);
} catch (Exception e) {
e.printStackTrace();
}
} //获取请求路径名
public String getname(HttpServletRequest request)
{
//项目+请求地址
String requestURI =request.getRequestURI();
//项目名称
String contextPath=request.getContextPath();
//具体的请求
String path=requestURI.substring(contextPath.length());
String filename=path.substring(1,path.lastIndexOf(".")).trim();
return filename; } //重写servlet的init方法,让程序一开始就初始化servlet
//由于一个项目src根目录下有可能有多个配置文件,不止一个,所以逐个解析 @Override
public void init(ServletConfig config) throws ServletException { //初始化参数信息
String filename = config.getInitParameter("config");
String [] filenames=null; if(filename==null){
//如果没有别的参数信息,就将已经配好的放入数组中
filenames=new String[]{"Framework.xml"};
}
else{
//拆分配置文件名称字符串
filenames=filename.split(",");
}
//使用init方法初始化
man=new ActionMappingManager(filenames);
}

九、业务逻辑Action并实现Action接口,并重写自定义的execute方法

public class LoginAction implements Action{

    public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
if(name.equals("1")&&pwd.equals("1")){
return SUCCESS;
}
else{
return LOGIN;
}
}

十、编写登录界面

  <body>
<form action="loginAction.action" method="post">
姓名:<input type="text" name="name"/><br/>
密码:<input type="text" name="pwd"/><br/>
<input type="submit" value="登录">
</form>
</body>

实现效果:

Struts2 自定义MVC框架的更多相关文章

  1. struts2自定义MVC框架

    自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...

  2. 自定义MVC框架

    我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...

  3. 第一章 自定义MVC框架

    第一章  自定义MVC框架1.1 MVC模式设计    组成:Model:模型,用于数据和业务的处理          View :视图,用于数据的显示          Controller:控制器 ...

  4. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  5. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  6. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

  7. Java Web自定义MVC框架详解 (转)

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

  8. 使用Intellij Idea自定义MVC框架

    ---恢复内容开始--- 今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图 ...

  9. springmvc执行原理及自定义mvc框架

    springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...

随机推荐

  1. 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

    关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...

  2. org.hibernate.exception.SQLGrammarException: could not execute query

    SSH项目中出现了 org.hibernate.exception.SQLGrammarException: could not execute query 错误,仔细检查后发现,是把createQu ...

  3. Thinking in Java——笔记(19)

    Enumerated Types Basic enum features When you create an enum, an associated class is produced for yo ...

  4. 十一个行为模式之中介者模式(Mediator Pattern)

    定义: 用一个中介对象(中介者)来封装一系列的对象交互,使各个对象之间不需要显式地相互引用,从而降低耦合度,而且可以独立地改变他们之间的交互关系. 解耦后: 结构图: Mediator:抽象中介者,定 ...

  5. SQL切换真假状态标识字段

    需求:用一条SQL(SQL SERVER)语句,实现反向更改状态标识字段(类型为bit)的值.即是从true变false,或从false到true. 方案: 一.判断原来这个字段值,然后UPDATE为 ...

  6. 提交留言HTML模板代码

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  7. javascript 实现一个回文数字

    写一个方法,让"1234"变成回文数字“1234321”,就是顺着读和倒着读都是一样的:注:不让用reverse()方法: function palindrome(str){ va ...

  8. jquery实现表格的搜索功能

    版权声明:作者原创,转载请注明出处! HTML代码如下: <input type="text" id="txt" value="" / ...

  9. yum使用点滴

    yum下载依赖rpm包 先安装一个yum-downloadonly 1 yum install yum-downloadonly完成安装后,yum –help在最后就提示两个命令参数,分别是: Plu ...

  10. 手机APP创建桌面快捷方式

    预览: 需要权限:   <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT& ...