自定义MVC        
数据库:Oracle
表:User(id,uname,upwd)
自定义Struts框架

一、定义Action接口

  import javax.servlet.http.*;

             public interface Action {
                 /**
                  * 执行方法
                  * @return
                  */
                 String execute(HttpServletRequest request,HttpServletResponse response);
             }

二、根据特定功能实现Action接口(这里用User表添加用户)

  import javax.servlet.http.HttpServletRequest;
         import javax.servlet.http.HttpServletResponse;

         import com.biz.UserBiz;
         import com.biz.impl.UserBizImpl;
         import com.entity.User;
         import com.mystruts.Action;
         /**
          * 注册Action 完成注册功能  调用业务层  返回页面
          * @author Administrator
          *
          */
         public class RegAction implements Action {

             @Override
             public String execute(HttpServletRequest request,
                     HttpServletResponse response) {
                 //获取请求内容
                 String uname = request.getParameter("uname");
                 String upwd = request.getParameter("upwd");
                 //创建User 对象  创建UserBizImpl对象
                 User user = new User(uname,upwd);
                 UserBiz userBiz = new UserBizImpl();
                 if(userBiz.reg(user)){
                     request.getSession().setAttribute("login", user);
                     return "success";
                 }else{
                     request.getSession().setAttribute("msg", "注册失败!");
                     return "input";
                 }
             }

         }

三、ActionFilter(负责请求的转发,将用户的请求交给相应的action进行处理)

 import java.io.IOException;

         import javax.servlet.Filter;
         import javax.servlet.FilterChain;
         import javax.servlet.FilterConfig;
         import javax.servlet.ServletException;
         import javax.servlet.ServletRequest;
         import javax.servlet.ServletResponse;
         import javax.servlet.http.HttpServletRequest;
         import javax.servlet.http.HttpServletResponse;

         import com.action.RegAction;
         /**
          * ActionFilter  负责请求的转发   将用户的请求交给相应的Action进行处理
          * @author Administrator
          *
          */
         public class ActionFilter implements Filter {

             private FilterConfig config;
             private ActionMappingManager mappingManager;

             @Override
             public void destroy() {
                 // TODO Auto-generated method stub

             }

             @Override
             public void doFilter(ServletRequest arg0, ServletResponse arg1,
                     FilterChain chain) throws IOException, ServletException {
                 //强转对象
                 HttpServletRequest req = (HttpServletRequest)arg0;
                 HttpServletResponse resp = (HttpServletResponse)arg1;
                 //获取Action 去执行相应的功能
                 ActionMapping actionMapping = getActionMapping(req);
                 Action action = ActionManager.createAction(actionMapping.getClassName());
                 //调用execute方法执行
                 String resultname = null;
                 try{
                     resultname = action.execute(req, resp);
                 }catch(Exception ex){
                     ex.printStackTrace();
                 }
                 String result = actionMapping.getResultMap().get(resultname);

                 //正常得到处理后的返回值  进行页面跳转
                 if(null==result){
                     return;
                 }
                 resp.sendRedirect(result);
             }

             @Override
             public void init(FilterConfig conf) throws ServletException {
                 // TODO Auto-generated method stub
                 this.config = conf;
                 //获取配置文件
                 String[] configFiles = null;
                 String configStr = config.getInitParameter("config");
                 if(null==configStr || configStr.isEmpty()){
                     configFiles = new String[]{"mystruts.xml"};
                 }else{
                     configFiles = configStr.split(",");
                 }
                 this.mappingManager = new ActionMappingManager(configFiles);
             }

             //得到请求地址  通过请求地址得到对应action   通过request得到请求信息
             public ActionMapping getActionMapping(HttpServletRequest request){
                 //获取上URI
                 String uri = request.getRequestURI();
                 //获取请求的路径
                 String contextPath = request.getContextPath();
                 //截取获得action路径
                 String actionPath = uri.substring(contextPath.length());
                 //获取action名称
                 String actionName = actionPath.substring(1,actionPath.lastIndexOf('.')).trim();

                 //获取ActionMapping
                 ActionMapping actionMapping = null;
                 actionMapping = mappingManager.getActionMappingName(actionName);

                 return actionMapping;
             }

         }

四、配置xml文件,保存sction信息

 <?xml version="1.0" encoding="UTF-8"?>
         <!DOCTYPE mystruts SYSTEM "mystruts.dtd">
         <mystruts>
             <actions>
                 <action name="reg" class="com.action.RegAction">
                     <result name="success">login.jsp</result>
                     <result name="input">index.jsp</result>
                 </action>
                 <action name="login" class="com.action.LoginAction">
                     <result name="success">success.jsp</result>
                     <result name="input">login.jsp</result>
                 </action>
             </actions>
         </mystruts>

五、创建actionMapping对应xml中action的配置

     import java.util.*;

         public class ActionMapping {
             //对应Action名称
             private String name;
             //对应Action类
             private String className;
             //对应result结果   result-name result-value
             private Map<String,String> resultMap = 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 Map<String, String> getResultMap() {
                 return resultMap;
             }
             public void setResultMap(Map<String, String> resultMap) {
                 this.resultMap = resultMap;
             }

         }

六、创建ActionMappingManager负责读取配置信息

    import java.io.InputStream;
         import java.util.*;

         import org.dom4j.*;
         import org.dom4j.io.SAXReader;

         public class ActionMappingManager {
             //创建保存所有action的集合
             private static Map<String,ActionMapping> actionMappings =  new HashMap<String, ActionMapping>();

             /**
              * init方法加载Action配置文件
              */
             public void init(String configFileName){
                 try{
                     if(null==configFileName || configFileName.isEmpty()){
                         throw new Exception("configFileName为空!");
                     }
                     //加载配置文件到输入流
                     InputStream is = this.getClass().getResourceAsStream("/"+configFileName);
                     Document doc = new SAXReader().read(is);
                     Element root = doc.getRootElement();
                     //找到根节点下的actions节点
                     Iterator<Element> actionIt = root.elements("actions").iterator();
                     //获取到actions
                     Element actions = actionIt.next();
                     //获取action
                     Iterator<Element> iter = actions.elementIterator("action");
                     while(iter.hasNext()){
                         Element action =iter.next() ;
                         ActionMapping mapping = new ActionMapping();
                         //将xml配置文件中读取的action 名称和类存入到actionMapping中
                         mapping.setName(action.attributeValue("name"));
                         mapping.setClassName(action.attributeValue("class"));
                         //将result存入到ActionMapping中
                         Iterator<Element> results = action.elementIterator("result");
                         while(results.hasNext()){
                             Element resultElement = results.next();
                             String name = resultElement.attributeValue("name");
                             String result = resultElement.getText();
                             if(name==null||"".equals(name)){
                                 //设置默认结果  默认success
                                 name="success";
                             }
                             mapping.getResultMap().put(name, result);
                         }
                         actionMappings.put(mapping.getName(), mapping);
                     }
                 }catch(Exception ex){
                     ex.printStackTrace();
                 }
             }

             /**
              * 加载配置文件
              * @param configureFileNames
              */
             public ActionMappingManager(String[] configureFileNames){
                 for (String configureFileName : configureFileNames) {
                     init(configureFileName);
                 }
             }
             /**
              * 根据action名称 获取对应的actionMapping对象
              * @param actionName
              * @return
              */
             public ActionMapping getActionMappingName(String actionName){
                 if(actionName==null || actionName.isEmpty()){
                     return null;
                 }
                 ActionMapping mapping = this.actionMappings.get(actionName);
                 if(mapping==null){
                     System.out.println("Mapping为空");
                 }
                 return mapping;
             }

         }

  七、创建ActionManager通过反射创建对应的Action

           public class ActionManager {

               public static Action createAction(String className){
                   Class clazz = null;
                   try {
                       clazz = Class.forName(className);
                       return (Action)(clazz).newInstance();
                   } catch (ClassNotFoundException e) {
                       // TODO Auto-generated catch block
                      e.printStackTrace();
                  } catch (InstantiationException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                   } catch (IllegalAccessException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                  }
                  return null;
              }

          }

 

八、修改web.xml和ActionFilter完成自定义Controller

           <filter>
             <filter-name>openSessionInView</filter-name>
             <filter-class>com.web.OpenSessionInViewFilter</filter-class>
           </filter>
           <filter-mapping>
             <filter-name>openSessionInView</filter-name>
             <url-pattern>/*</url-pattern>
           </filter-mapping>
           <!-- 配置ActionFilter过滤器  -->
           <filter>
             <filter-name>actionFilter</filter-name>
             <filter-class>com.mystruts.ActionFilter</filter-class>
             <init-param>
                 <param-name>config</param-name>
                 <param-value>mystruts.xml</param-value>
             </init-param>
           </filter>
           <filter-mapping>
             <filter-name>actionFilter</filter-name>
             <url-pattern>*.action</url-pattern>
           </filter-mapping>

基于Struts自定义MVC-2的更多相关文章

  1. 基于Struts自定义MVC-1

    自定义MVC        数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 1 import javax.servlet.http.*; ...

  2. 通过Struts了解MVC框架,兼说如何在面试中利用Struts证明自己

    虽然目前Struts MVC框架不怎么用了,但它确是个能帮助大家很好地入门Web MVC框架,而且,一些历史项目可能还用Struts,反正技多不压身,大家如果能在面试中通过项目证明自己Struts这块 ...

  3. .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框

    .NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...

  4. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  5. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  6. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  7. 自定义MVC框架

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

  8. Struts2 自定义MVC框架

    一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...

  9. struts2自定义MVC框架

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

随机推荐

  1. HTML 相同name 传递一个数组

    今天发现一个很厉害的东西 在input表单中,name名称可以是一个,后面[],里面跟名称,和数组一样,传递到PHP中也是一个数组 <html> <body> <form ...

  2. Delphi实例之一个较复杂的记事本的实现

    http://www.mamicode.com/info-detail-110813.html delphi中控件位置及自动排版的问题 http://blog.csdn.net/avan_lau/ar ...

  3. LINQ to Sql系列二 简单查询和联接查询

    这一篇文章主要总结LINQ to sql的简单查询(单表查询)和联接查询(多表查询) 单表查询 需求是我们要输出TClass表中的结果.使用了from-in-select语句,代码如下: public ...

  4. 在Windows下开发Node.js的C/C++原生扩展

    准备工作 (1)本机系统说明:本人机器为win7 64位,32位也可以. (2)软件安装: VISUAL C++ 2010 EXPRESS(Visual Studio 2010也可以): window ...

  5. LeetCode Database题解

    175. Combine Two Tables 使用外连接即可. # Write your MySQL query statement below select FirstName, LastName ...

  6. 结合swiper使用图片懒加载

    本人渣渣一枚,技术一般,记录下笔记,大神勿喷,可以留下优化建议,谢谢 最近刚刚做了个展示型的网站,使用swiper搭的框架,因为图片比较多,所 以首次加载稍微有些慢,虽然压缩过了,但是尽可能的优化吧, ...

  7. python bottle 简介

    bottle是一个轻量级的python web框架, 可以适配各种web服务器,包括python自带的wsgiref(默认),gevent, cherrypy,gunicorn等等.bottle是单文 ...

  8. Git学习之路(3)-提交文件到三个区

    ▓▓▓▓▓▓ 大致介绍 年过的差不多了,开始学习!小白学Git(持续更新) Git有三个工作区域: ◆ 工作区(Working Directory) ◆ 暂存区(Stage) ◆ 版本库(Reposi ...

  9. 新生命组件XAgent使用心得

    1.简单介绍 XAgent为大石头带领下的新生命团队自己开发的一个.Net下的常用的Windows服务管理组件利器,通过在控制台中简单的输入1,2,3,4,5等数字可以实现一步安装.卸载Windows ...

  10. 关于小程序swiper不显示图的那些事

    还有几天快过年了,在这里提前祝大家新年快乐! 今天没事研究了一下小程序,想整个轮播图玩玩,然后开始看看文档https://mp.weixin.qq.com/debug/wxadoc/dev/compo ...