基于Struts自定义MVC-2
自定义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的更多相关文章
- 基于Struts自定义MVC-1
自定义MVC 数据库:Oracle表:User(id,uname,upwd)自定义Struts框架一.定义Action接口 1 import javax.servlet.http.*; ...
- 通过Struts了解MVC框架,兼说如何在面试中利用Struts证明自己
虽然目前Struts MVC框架不怎么用了,但它确是个能帮助大家很好地入门Web MVC框架,而且,一些历史项目可能还用Struts,反正技多不压身,大家如果能在面试中通过项目证明自己Struts这块 ...
- .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框
.NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...
- 封装:简要介绍自定义开发基于WPF的MVC框架
原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...
- GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台
注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...
- 基于存储过程的MVC开源分页控件--LYB.NET.SPPager
摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...
- 自定义MVC框架
我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...
- Struts2 自定义MVC框架
一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...
- struts2自定义MVC框架
自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是 ...
随机推荐
- redhat6 + 11G DG部署
在主库中netca配置 [oracle@HE3dbs]$ cat /u01/app/oracle/product/11gr2/db_1/network/admin/listener.ora #list ...
- 管理维护Replica Sets
1.读写分离 有一些第三方的工具,提供了一些可以让数据库进行读写分离的工具.我们现在是否有一个疑问,从库要是能进行查询就更好了,这样可以分担主库的大量的查询请求. 1. 先向主库中插入一条测试数据 2 ...
- 在MyEclipse 2014中给Spket增加ExtJS提示
参考:http://wenku.baidu.com/link?url=BT2U6Z-HktQJQYpz3Jp88pJSp4lU-lXkvCqpdeaa9a-BVdOgMGK1vj486-32YC4Gq ...
- RIP 相对寻址
知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/rip-relative-addressing 本博客 ...
- [html5]学习笔记一 新增的非主体结构元素
html新增加的非主体结构元素,主要是用来表示附加信息的,包括header,footer,hgroup,address元素. 1.header元素 header元素是一种具有引导和导航作用的结构元素, ...
- 编写JQuery插件-3
该了解我们也知道的差不多了,接下来编写我们第一个jq插件吧 封装对象方法的插件 我们编写一个设置和获取颜色的插件,我们需要实现两个功能 1.设置匹配元素的颜色 2.获取匹配元素(元素集合的第一个)的颜 ...
- js阻止表单提交的两种方法
下面直接看代码. <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Eclipse 报java.lang.UnsupportedClassVersionError: ("yourclass") bad major version at offset=6
报这个错误是指你的jar包或者class 的被编译的jdk版本比当前runtime的jdk版本高. 解决问题 1)如果是jar包,重新用jdk 1.6编译你的jar 包 2)如果是java文件或者项目 ...
- ContextMenu控件引用以及不用v4包的方法
最近想撸个APP出来玩玩,本想用Yalantis出的SideMenu,结果因为依赖问题放弃了,改用他们家的ContextMenu. 如果你用了v4包 那么问题就比较简单了,直接打开项目中app中的bu ...
- maven 配置安装
1.下载maven http://maven.apache.org/ 2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...