一、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 表示此属性可写 -->

  1. <!DOCTYPE Framework[
  2. <!ELEMENT Framework (actions)>
  3. <!ELEMENT actions (action*)>
  4. <!ELEMENT action (result*)>
  5.  
  6. <!ATTLIST action name CDATA #REQUIRED
  7. class CDATA #REQUIRED
  8. >
  9.  
  10. <!ATTLIST RESULT name CDATA #IMPLIED
  11. redirect (true|false) "false"
  12. >
  13.  
  14. ]>
  15.  
  16. <Framework>
  17. <actions>
  18. <action name="loginAction" class="cn.happy.action.LoginAction">
  19. <result name="success">success.jsp</result>
  20. <result name="login">index.jsp</result>
  21. </action>
  22. </actions>
  23. </Framework>


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

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

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

  1. public class ActionMapping {
  2. //根据action节点中的属性 以及action节点中的<result></result>节点定义三个私有属性
  3.  
  4. private String name;//action的名称
  5. private String classname;//action对应程序中的类
  6. private Map<String,String> results=new HashMap<String,String>();
  7.  
  8. //向results集合中添加数据的方法
  9. public void addResult(String name,String value){
  10. results.put(name, value);
  11. }
  12.  
  13. //根据名称获取的方法
  14. public String getResults(String name){
  15. return results.get(name);
  16. }
  17.  
  18. public Map<String, String> getResults() {
  19. return results;
  20. }
  21. public void setResults(Map<String, String> results) {
  22. this.results = results;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public String getClassname() {
  31. return classname;
  32. }
  33. public void setClassname(String classname) {
  34. this.classname = classname;
  35. }

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

  1. public class ActionMappingManager {
  2. //actionMapping类的集合
  3. private Map<String,ActionMapping> maps=new HashMap<String,ActionMapping>();
  4.  
  5. public ActionMapping getActionMapping(String name){
  6. return maps.get(name);
  7. }
  8.  
  9. //解析src下所有配置文件
  10. public ActionMappingManager(String[]files){
  11. for (String filename : files) {
  12. init(filename);
  13. }
  14. }
  15.  
  16. //创建初始化方法,使用dom4j解析配置文件
  17. public void init(String path){
  18. try {
  19. //getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据
  20. InputStream is=this.getClass().getResourceAsStream("/"+path);
  21. //解析XML
  22. Document doc=new SAXReader().read(is);
  23. //获取根节点
  24. Element root = doc.getRootElement();
  25. //获取actions节点
  26. Element actions =(Element)root.elementIterator("actions").next();
  27. //使用for循环来
  28. //遍历actions节点下的所有action节点
  29. for (Iterator<Element> action=actions.elementIterator("action");action.hasNext();) {
  30. //获取到action节点
  31. Element actionnext = action.next();
  32. //分别获取到action节点中的name属性和class属性
  33. String name=actionnext.attributeValue("name");
  34. String classname=actionnext.attributeValue("class");
  35. //将以上两个属性保存到ActionMapping类中
  36. ActionMapping mapp=new ActionMapping();
  37. mapp.setClassname(classname);
  38. mapp.setName(name);
  39. //由于一个action节点下有多个result节点 遍历action下所有的result节点
  40. for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){
  41. //获取到result节点
  42. Element resultnext = result.next();
  43. //提取result节点的name属性值和result节点中的值
  44. String resultname= resultnext.attributeValue("name");
  45. String resultvalue= resultnext.getText();
  46. //将其分别存入到actionMapping中的双列集合中去,方便调用actionMapping类(actionMapping类中就有数据了!)
  47. mapp.addResult(resultname, resultvalue);
  48. }
  49. //得到所有action节点的集合
  50. maps.put(mapp.getName(), mapp);
  51. }
  52.  
  53. } catch (Exception e) {
  54.  
  55. }
  56. }

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

  1. public class ActionManager {
  2.  
  3. public static Action getActionClass(String classname){
  4. Class clazz=null;
  5. Action action=null;
  6. //获取当前线程的加载类
  7. try {
  8. clazz=Thread.currentThread().getContextClassLoader().loadClass(classname);
  9. } catch (ClassNotFoundException e) {
  10. e.printStackTrace();
  11. }
  12.  
  13. if(clazz==null){
  14. try {
  15. //如果该线程中没有,那么使用class.forname方法获取
  16. clazz=Class.forName(classname);
  17. } catch (ClassNotFoundException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21.  
  22. if(action==null){
  23. //将获取到的类型转换为action,调用无参构造函数,某种程度上相当于new,不过new需要指定类型
  24. try {
  25. action =(Action)clazz.newInstance();
  26. } catch (InstantiationException e) {
  27. e.printStackTrace();
  28. } catch (IllegalAccessException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. }
  33. return action;
  34. }

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

  1. public class MyServlet extends HttpServlet {
  2.  
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. doPost(request,response);
  6.  
  7. }
  8.  
  9. ActionMappingManager man=null;
  10. public void doPost(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. //获取到ActionMapping对象
  13. ActionMapping actionMapping=man.getActionMapping(getname(request));
  14. //获取action接口利用反射机制
  15. Action action = ActionManager.getActionClass(actionMapping.getClassname());
  16. try {
  17. String message=action.execute(request, response);
  18. String results=actionMapping.getResults(message);
  19. response.sendRedirect(results);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24.  
  25. //获取请求路径名
  26. public String getname(HttpServletRequest request)
  27. {
  28. //项目+请求地址
  29. String requestURI =request.getRequestURI();
  30. //项目名称
  31. String contextPath=request.getContextPath();
  32. //具体的请求
  33. String path=requestURI.substring(contextPath.length());
  34. String filename=path.substring(1,path.lastIndexOf(".")).trim();
  35. return filename;
  36.  
  37. }
  38.  
  39. //重写servlet的init方法,让程序一开始就初始化servlet
  40. //由于一个项目src根目录下有可能有多个配置文件,不止一个,所以逐个解析
  41.  
  42. @Override
  43. public void init(ServletConfig config) throws ServletException {
  44.  
  45. //初始化参数信息
  46. String filename = config.getInitParameter("config");
  47. String [] filenames=null;
  48.  
  49. if(filename==null){
  50. //如果没有别的参数信息,就将已经配好的放入数组中
  51. filenames=new String[]{"Framework.xml"};
  52. }
  53. else{
  54. //拆分配置文件名称字符串
  55. filenames=filename.split(",");
  56. }
  57. //使用init方法初始化
  58. man=new ActionMappingManager(filenames);
  59. }

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

  1. public class LoginAction implements Action{
  2.  
  3. public String execute(HttpServletRequest request,
  4. HttpServletResponse response) throws Exception {
  5. String name=request.getParameter("name");
  6. String pwd=request.getParameter("pwd");
  7. if(name.equals("1")&&pwd.equals("1")){
  8. return SUCCESS;
  9. }
  10. else{
  11. return LOGIN;
  12. }
  13. }

十、编写登录界面

  1. <body>
  2. <form action="loginAction.action" method="post">
  3. 姓名:<input type="text" name="name"/><br/>
  4. 密码:<input type="text" name="pwd"/><br/>
  5. <input type="submit" value="登录">
  6. </form>
  7. </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. Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_58.lib'

    I had a similar problem when trying to use boost unit testing in Visual Studio 2015 (Community Editi ...

  2. 2个很有趣、耐思考的C语言算法

    1. 输入10个整数,任意相邻的两个数不同,输出所有的递增,递减序列 比如: 输入:1 5 9 8 12 21 3 0 -1 9 输出: 1 5 9 9 8 8 12 21 21 3 0 -1 -1 ...

  3. Hibernate实现有两种配置,xml配置与注释配置

    hibernate实现有两种配置,xml配置与注释配置. (1):xml配置:hibernate.cfg.xml (放到src目录下)和实体配置类:xxx.hbm.xml(与实体为同一目录中) < ...

  4. SpringMvc面试题

    f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差 ...

  5. Easticsearch通信方式_API

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch概念 a. Elasticsearch是一个基于Luc ...

  6. jQuery获取Table-Input控件值封装

  7. Thinkcmf 二次开发

    一.   创建模板 demo 1 Tpl下创建demo文件-----后台启用新的模板 (网站信息--模板方案) 2 在模板在tpl/demo目录下创建Portal目录,然后在Portal目录下创建in ...

  8. Civil 3D API二次开发学习指南

    Civil 3D构建于AutoCAD 和 Map 3D之上,在学习Civil 3D API二次开发之前,您至少需要了解AutoCAD API的二次开发,你可以参考AutoCAD .NET API二次开 ...

  9. sourceTree忽略文件

    *~.DS_Store*.xcworkspacexcuserdata Podfile.lockPods

  10. 省市区三级联动 pickerView

    效果图 概述 关于 省市区 三级联动的 pickerView,我想大多数的 iOS 开发者应该都遇到过这样的需求.在遇到这样的需求的时候,大多数人都会觉的这个很复杂,一时无从下手.其实真的没那么复杂. ...