struts2自定义MVC框架

本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下

自定义MVC: (首先了解Model1和Model2的概念)

Model1与Model2:

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

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

总结MVC特点如下:

(1)数据的获取和显示分离

(2)控制器将不同的模型和视图组合在一起

(3)应用分为三部分,三部分之间松耦合并协同工作,从而提高应用的可扩展性和可维护性

(4)各层负责不同的功能,各司其职,每一层的组件具有相同的特征,便于通过工程化和工具化产生程序代码

MVC思想及其优势(很强势)

MVC是一种架构模式,目的是将模型(业务逻辑)、视图(表示层)分离,使模型和视图可以独立修改互不影响。大多数软件在设计架构时都采用此模式。使用MVC模式有很多处,当一个通过浏览器浏览的系统想要开发手机版本时,只需要重新开发视图,模型部分的业务逻辑可以重用。许多软件需要同时推出B/S和C/S版本,采用MVC模式,模型部分可以重用,只需要开发不同的视图即可。MVC思想将一个应用分成三个基本部分M(Model,模型)V(View,视图)C(Controller,控制器)。其中M表示处理业务逻辑的部分,V表示显示数据和获取用户输入的部分,C类似中介,保证M和V不会直接交互。

基本步骤如下:  

1.创建XML文档Framework.xml  

2.定义Action接口  

3.定义一个actionMapping类,视为action节点  

4.定义ActionMappingManage类来管理ActionMapping类(actions节点)  

5.定义ActionManager类使用反射机制根据字符串类型的类名获取到具体的类(web.xml标签的书写)  

6.编写servlet进行运行时机的控制  

7.定义LoginAction类进行测试

1.创建XML文档Framework.xml 

<!--?xml version="1.0" encoding="UTF-8"?-->
<!-- 定义约束文件 -->(标注)
<!-- ELEMENT 表示元素 -->
<!-- ATTLIST 表示属性 -->
<!-- CDATA 表示字符串类型 -->
<!-- REQUIRED 表示此属性必须的写 -->
<!-- *代表多个 -->
<!-- IMPLIED 表示此属性可写 -->
<!-- redirect 重定向或转发 -->

  <!--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.hq.Action.LoginAction">
  <result name="success">success.jsp</result>
  <result name="login">index.jsp</result>
  </action>
</actions>
</framework>

注意:空格和<>的书写规范。

   节点的层次。

2.定义Action接口 

注意:excute参数的书写,请求和响应。

3.定义一个actionMapping类,视为action节点(进行action节点的标签的书写)

    

进行封装字段和results集合的添加数据。

注意:添加数据的书写。(Map集合)

4.定义ActionMappingManage类来管理ActionMapping类(actions节点)

/*
 * action节点不止一个
 * 用来来管理ActionMapping类
 */
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[] file){
    for (String filename : file) {
      Init(filename);
    }
  }
  //init初始化方法
  //解析xml文档
  public void Init(String path){

    try {
       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);
           System.out.println(mapp.getName());
         }
         //得到所有action节点的集合
         maps.put(mapp.getName(), mapp);
       }

    } catch (Exception e) {
      // TODO: handle exception
    }
   }
  }

概括:

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

注意:Init方法的书写,以及ActionMappingManager带参数组的书写。

5.定义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) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    if(clazz==null)
    {
      try {
        //如果该线程中没有,那么使用class.forname方法获取
        clazz=Class.forName(classname);
      } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    if(action==null)
    {
      try {
        //将获取到的类型转换为action,调用无参构造函数,某种程度上相当于new,不过new需要指定类型
        action=(Action)clazz.newInstance();
      } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    return action;
  }
} 

web.xml的节点配置:

6.编写servlet进行运行时机的控制(servlet,初始化所有的类)

public class MyServlet extends HttpServlet {

  /**
   *你很菜
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    doPost(request, response);
  }<br>
  /**
   *继续努力
   */
  ActionMappingManager man=null;
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    //获取ActionMapping对象
    ActionMapping actionMapping = man.getActionMapping(getPath(request));
    //获取action接口反射机制
    Action action = ActionManager.getActionManager(actionMapping.getClassname());

    try {
      String message=action.execute(request, response);
      String results = actionMapping.getResults(message);

      response.sendRedirect(results);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  /*
   * 获取请求的路径名
   */
  public String getPath(HttpServletRequest request){
    //项目+请求地址
    String requestURI = request.getRequestURI();
    //项目名称
    String contextPath = request.getContextPath();
    //具体请求
    String path = requestURI.substring(contextPath.length());
    String filename = path.substring(1,path.lastIndexOf("."));

    return filename;
  }
  /*
   *重写init,程序运行加载所有类
   *
   */
  @Override
  public void init(ServletConfig config) throws ServletException {

    //config对象是javax.servlet.ServletConfig的对象,功能是获得初始化配置信息
    //config.getInitParameter是取得指定名称的初始化参数内容
    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);
  }
}

注意:代码的层次及注释。

7.定义LoginAction类进行测试

public class LoginAction implements Action{

  @Override
  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;
    }
  }
}

jsp代码:

实现效果:

再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Struts2通过自定义标签实现权限控制的方法

    近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮. 例如:若用户拥有删除数据的权限,则在界面中显示"删除"按钮:若用户无该权限,则界面中不显示相应按钮. 这样,就需要用到自定义标签了. 要定义Struts2的自定义标签,只需三步: 1.定义一个Component类,并继承自org.apache.struts2.components.Component; 2.定义一个Tag类,并继承自import org.apache.struts2.views.jsp.Component

  • Struts2 自定义下拉框Tag标签

    自定义标签主要包括三个步骤: 1.编写java类,继承TagSupport类: 2.创建tld文件,影射标签名和标签的java类: 3.jsp页面引入tld. 例子:自定义下拉框标签 如果页面上有下拉选择框,通常最好的解决方法是使用数据字典,因为有可能多个页面 使用同一个下拉框,便于后台统一维护. 自定义Tag类 import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.

  • JSP 开发之Struts2内建自定义拦截器

    JSP 开发之Struts2内建自定义拦截器 Struts2的自定义拦截器主要用于解析请求参数,将请求参数赋值给Action属性,执行数据校验,文件上传等等操作.当需要扩展Struts2的功能时,我们只需要提供相应的拦截器并将它配置到Struts2容器中即可:当我们不需要使用的时候,只需要取消它在Struts2容器中的配置就行了. 1>配置拦截器主要使用四个配置元素: :用于配置自定义拦截器 :用于引用拦截器或者拦截器栈 :用于配置自定义拦截器栈,一个拦截器栈由多个拦截器构成,也可以包含其他的拦

  • 关于Struts2文件上传与自定义拦截器

    一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

  • struts2自定义拦截器的示例代码

    题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录) 定义拦截器 在struts.xml中定义拦截器使用标签<Intercaptors>.<Intercapter>. <interceptors> <interceptor name="test" class="Intercaptor.Intercaptor

  • struts2自定义MVC框架

    本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下 自定义MVC: (首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形成一个Servlet,Model2也是基于MVC开发. 总结MVC特点如下: (1)数据的获取和显示分离 (2)控制器将不同的模型和视图组合在一起 (3)应用

  • 一文了解自定义MVC框架实现

    目录 一.让中央控制器动态加载存储子控制器 二.参数传递封装优化 三.对于方法执行结果转发重定向优化 四.框架配置可变 一.让中央控制器动态加载存储子控制器 上期回顾,我们说明了自定义MVC工作原理,其中,中央控制器起到了接收浏览器请求,找到对应的处理人的一个作用,但是也存在缺陷,如: 就像在每一次顾客访问前台时,有很多个部门,比如说料理部门,财务部门,每当访问一次,就要new一个此类,代码如下: public void init() throws ServletException { acti

  • MVC框架自定义实现过程

    1.思维导图 2.什么是MVC? MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 它是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码. 3.运行原理 用户发送请求 → 中央控制器接受用户请求 → 分析请求连接/获取到用户需要的类+方法 → 调用相对应的Model → 访问数据库服务器 4.演绎过程 4.1.控制层 BookServlet: package com.tyf.web; impo

  • Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

  • 搭建自己的PHP MVC框架详解

    本文详细讲述了搭建自己的PHP MVC框架的方法.分享给大家供大家参考,具体如下: 前言 说到写PHP的MVC框架,大家想到的第一个词--"造轮子",是的,一个还没有深厚功力的程序员,写出的PHP框架肯定不如那些出自大神们之手.经过时间和各种项目考验的框架.但我还是准备并且这么做了,主要是因为: 认为有关PHP的方方面面都了解了,但自己学习PHP的时间还短,基础并不扎实,很多常用函数的参数还偶尔要查手册,而且对于PHP的一些较新的特性如命名空间.反射等只是简单的看过,并没有能实际应用过

  • Spring Web MVC框架学习之配置Spring Web MVC

    这一篇文章讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法. 启用MVC Java配置和XML命名空间 默认配置 要启用MVC Java配置(@Controller等各种注解)和XML命名空间,如果使用的是Java配置,在配置类上再添加@EnableWebMvc注解即可. @Configuration @EnableWebMvc public class WebAppConfig { } 如果使用XML配置文件的话,添加下面一行

  • Zend Framework教程之MVC框架的Controller用法分析

    本文讲述了Zend Framework教程之MVC框架的Controller用法.分享给大家供大家参考,具体如下: 这里简单讲讲MVC模式中Controller的基本使用方法. 基本使用实例: root@coder-671T-M:/www/zf_demo1/application# tree. ├── Bootstrap.php ├── configs │   └── application.ini ├── controllers │   ├── ErrorController.php │  

  • 浅谈MVC框架的优点(翻译)

    传统的ASP.NET Web Forms是一个非常好的主意,但现实需求非常复杂.随着时间的推移,现实世界的项目暴露出Web Forms的一些不足之处: "沉重的"视图状态:现实中在http请求之间维持状态(术语叫视图状态)导致了服务端和客户端巨大的数据块来回传递.典型情况下这个数据块会大到数百K字节,而且这个数据块会在每次请求时来回传输,导致网站访问者访问速度下降,同时增加了服务器的带宽负担. 页面生存周期:作为页面生存周期的一部分,连接客户端事件和服务端事件处理代码的机制,有时会非常

  • Java 自定义Spring框架与Spring IoC相关接口分析

    在本讲,我们来对Spring IoC功能相关的接口逐一进行分析,分析这些接口的原因就是为了我们自己定义Spring IoC功能提前做好准备. Spring IoC相关接口分析 BeanFactory接口解析 对于BeanFactory接口,我之前只是稍微提到过,并且将就着用了一下它.这里,我将会对BeanFactory接口进行一个具体讲解. Spring中bean的创建是典型的工厂模式,这一系列的bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中

  • Java 自定义Spring框架与核心功能详解

    目录 Spring核心功能结构 核心容器 spring-beans和spring-core模块 spring-context模块 spring-context-support模块 spring-context-indexer模块 spring-expression模块 AOP和设备支持 数据访问与集成 Web组件 通信报文 集成测试 bean概述 在上一讲中,我们对Spring的基本使用进行了一个简单的回顾,接下来,我们就来看一下Spring核心功能结构. Spring核心功能结构 Spring

随机推荐