栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

struts2自定义MVC框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 


(标注)







 
 
  
  (*表示可以多个)
   
  
  
]>

  

  
  success.jsp
  index.jsp
  



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

   节点的层次。

2.定义Action接口 

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

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

    

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

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

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


public class ActionMappingManager {
  //actionMapping类的集合
  private Map maps=new HashMap();
   
  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 action=actions.elementIterator("action");action.hasNext();)
{
  //获取到节点
  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 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);
  }
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; } @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代码:

实现效果:

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/148845.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号