基于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是 ...
随机推荐
- iOS 之 NSUserDefault
1. 概念 NSUserDefaults是一种特殊的property list.是系统封装的属性列表,方便记录简单的数据. 2. 使用说明 2.1. 创建NSUserDefaults NSUserDe ...
- Java数据库连接--JDBC调用存储过程,事务管理和高级应用
相关链接:Jdbc调用存储过程 一.JDBC常用的API深入详解及存储过程的调用 1.存储过程的介绍 我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统 ...
- 把记事本文件固定在Win8的开始屏幕
1.创建该文件的桌面快捷方式: 2.将快捷方式拷贝至开始菜单目录,在开始屏幕的查看全部中可以看见该文件快捷: 3.在查看全部中右键点击该快捷,选择固定在开始屏幕:
- C++ 头文件系列(forward_list)
简介 forwrad_list字面意思为前向列表,但实际上它是一种单向列表,只能从单一方向遍历. 单向链表实现 forward_list内部是用单向列表实现的,并且设计该库的时候就是以近乎手写的单向链 ...
- SQL递归查询知多少
最近工作中遇到了一个问题,需要根据保存的流程数据,构建流程图.数据库中保持的流程数据是树形结构的,表结构及数据如下图: 仔细观察表结构,会发现其树形结构的特点: FFIRSTNODE:标记是否为根节点 ...
- Hadoop权威指南:FSDataInputStream对象
Hadoop权威指南:FSDataInputStream对象 FileSystem对象中的open()方法返回的是FSDataInputStream对象, 而不是标准的java.io类对象,这个类是继 ...
- python爆破定长密码脚本
def get_pwd(str, num):#str为可选字符集,num为密码长度 if(num == 1): for x in str: yield x else: for x in str: fo ...
- MongoDB基础之五:游标
1.cursor(游标)是什么 ? 通俗的说,游标不是查询结果,而是查询的返回资源,或者接口. 通过这个接口,你可以逐条读取. 就像php中的fopen打开文件,得到一个资源一样, 通过资源,可以一行 ...
- 二叉搜索树Java实现(查找、插入、删除、遍历)
由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...
- 记一次阿里云Linux服务器安装.net core sdk的问题以及解决方法
因为公司领导要求新的项目能跨平台部署,也就是说能部署到Linux服务器上,故新的项目采用了Asp.net mvc core 1.1 进行开发.开发过程一切都比较顺利,然后在之前申请试用的一台微软Azu ...