1. Difference between stucts1 and struts2

struts1 : Servlet used as Controller , you can visit the Servlet directly, code like if---else if--else

struts2 : Filter used as Controller , you can only  visit it passively, though setting the condition like "/*"

2. Imitate the core Filter of Struts2 (StrutsPrepareAndExecuterFilter.java)

version 1.0(like struts1)

package com.cdv.web.filter;

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; /**
* Servlet Filter implementation class StrutsPreparedAndExecuterFilter
*/
public class StrutsPreparedAndExecuterFilter implements Filter { /**
* Default constructor.
*/
public StrutsPreparedAndExecuterFilter() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI();
boolean isDo = uri.endsWith(".do");
if(isDo){
//get the operation
String op = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
if(op.equals("login")){
request.setAttribute("username", "zhangsan");
}else{
//to do something
}
}else{
//
chain.doFilter(request, response);
}
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }

version 2.0

we need create the interface , for creating different instance aim at different params condition, and use the map  instead of if--else

package com.cdv.web.action;

import javax.servlet.http.HttpServletRequest;

public interface Action {

    String execute(HttpServletRequest request);
}
package com.cdv.web.action;

import javax.servlet.http.HttpServletRequest;

public class LoginAction implements Action {

    @Override
public String execute(HttpServletRequest request) {
String username = request.getParameter("username");
if(username.equals("zhangsan")){
return "ok";
}
return null;
} }
package com.cdv.web.filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; 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.cdv.web.action.Action;
import com.cdv.web.action.LoginAction; /**
* Servlet Filter implementation class StrutsPreparedAndExecuterFilter
*/
public class StrutsPreparedAndExecuterFilter2 implements Filter { private Map<String, Action> actionMap = new HashMap<String, Action>();
/**
* Default constructor.
*/
public StrutsPreparedAndExecuterFilter2() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI();
boolean isDo = uri.endsWith(".do");
if(isDo){
String op = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
Action instance = actionMap.get(op);
String result = instance.execute(request);
if(result.equals("ok")){
request.setAttribute("user", "zhangsan");
}
}else{
chain.doFilter(request, response);
}
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
actionMap.put("login", new LoginAction());
//actionMap.put("logout", new LogoutAction());
//...
} }

version 3.0

put the value of instance into xml file , use dom4j to parse it, and use reflect technology to create instance dynamic.

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<package name="mypackage">
<action name="loginAction" class="com.cdv.web.action.LoginAction"></action>
<action name="logoutAction" class="com.cdv.web.action.LogoutAction"></action>
</package>
package com.cdv.web.filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; 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.cdv.web.action.Action;
import com.cdv.web.action.LoginAction; /**
* Servlet Filter implementation class StrutsPreparedAndExecuterFilter
*/
public class StrutsPreparedAndExecuterFilter3 implements Filter { private Map<String, Action> actionMap = new HashMap<String, Action>();
/**
* Default constructor.
*/
public StrutsPreparedAndExecuterFilter3() {
// TODO Auto-generated constructor stub
} /**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI();
boolean isDo = uri.endsWith(".do");
if(isDo){
String op = uri.substring(uri.lastIndexOf("/"), uri.lastIndexOf("."));
Action instance = actionMap.get(op);
String result = instance.execute(request);
if(result.equals("ok")){
request.setAttribute("user", "zhangsan");
}
}else{
chain.doFilter(request, response);
}
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//进行dom4j解析,将struts.xml中的name 和 value取出,
//并利用反射将class的值转化为对象
/* Document document = Dom4jUtil.getDocument();
List<Node> list = document.selectNodes("//action");
for(Node node : list){
//遍历action节点,取出值
String key = node.valueOf("@name");
String value = node.valueOf("@class");
actionMap.put(key, (Action) Class.forName(value).newInstance());
}*/
} }

custom struts framework的更多相关文章

  1. Struts framework

    Struts功能详解——ActionMapping对象 Struts旅程(一)Struts简介和原理 实例讲解DispatchAction和LookupDispatchAction DispatchA ...

  2. Struts 2 Learning

    目录 . J2EE简介 . JAVA EE应用的分层模型 . 搭建Struts2 Demo应用 . struts2流程 . struts2的常规配置 . 实现Action . 配置Action . 配 ...

  3. Configure the Struts Tag Libraries

    In Struts framework, you always need to configure the Struts tag libraries in order to access it in ...

  4. Spring+Struts+Hibernate 简介(转)

    http://blog.csdn.net/slnqnd/article/details/1772910/ Struts2.0 +Hibernate 3.2 +Spring 2.0 一.         ...

  5. Struts和SpringMVC两种MVC框架比较

    基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框架 ...

  6. Struts知识问答 分类: 面试 2015-07-10 22:01 4人阅读 评论(0) 收藏

    1. 简述Struts框架的初始化流程. 答案: 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-c ...

  7. struts工作原理不错的解释___

    Struts 使用 Model 2 架构.Struts 的ActionServlet 控制导航流.其他Struts 类,比如Action, 用来访问业务逻辑类.当 ActionServlet 从容器接 ...

  8. Struts 2 Overview

    Struts2 is popular and mature web application framework based on the MVC design pattern. Struts2 is ...

  9. 概述struts,以及struts如何实现MVC架构的

    概述MVC体系结构? 答:MVC包括三类对象,model是应用对象,view是视图,controller是控制器,它定义用户界面对用户输入的响应方式. 在MVC体系中,模型通常被称为”业务逻辑”,是真 ...

随机推荐

  1. saiku 升级&备份&恢复

    最近使用saiku,重新编译升级之后维护困难,下面讲解一下简单的办法: 1.备份saiku-server下面的data文件夹 2.备份saiku-server下面的repository文件夹 3.升级 ...

  2. Unity3d插件汇总

    Unity3d 中的svn插件 插件下载地址:http://www.dehome.net/down/viewfile.php?file_id=53

  3. 原生DOM探究 -- NodeList v.s. HTMLCollection

    涉及获取元素的主要API 在获取原生DOM元素的时候,主要涉及这几个DOM API(链接为Living Standard): Node及对应集合NodeList Element(继承Node)及对应集 ...

  4. Apache配置多个网站的方法

    Apache的虚拟主机是一种允许在同一台机器上,运行超过一个网站的解决方案.虚拟主机有两种,一种叫基于IP的(IP-based),另一种叫基于名字的(name-based).虚拟主机的存在,对用户来说 ...

  5. HTML CSS——margin和padding的学习

    你在学习margin和padding的时候是不是懵了,——什么他娘的内边距,什么他娘的外边距.呵呵呵,刚开始我也有点不理解,后来通过查资料学习总算弄明白了,现在我来谈一下自己对margin和paddi ...

  6. ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误

    今天我们的项目遇到问题 为了避免跨站点脚本攻击, 默认我们项目是启用了 validateRequest,这也是 ASP.NET 的默认验证规则.项目发布后,如果 customError 启用了,则会显 ...

  7. C#中,接口不能被实例化,但存在特例

    看一个例子: interface IFoo { string Message { get; } } 则, IFoo obj = new IFoo("abd"); 将会报错:接口不能 ...

  8. 火狐浏览器修改userAgent

    火狐浏览器修改userAgent的办法: 在火狐浏览器地址栏输入“about:config”,按下回车进入设置菜单. 找到“general.useragent.override”,如果没有这一项,则点 ...

  9. linux主机间复制文件

    命令基本格式: 1.从 本地 复制到 远程    * 复制文件:          * 命令格式:                  scp local_file remote_username@re ...

  10. Bucky – 免费开源的实时用户监控工具

    Bucky 是一个开源的实时用户监控工具,用于衡量用户在浏览器中使用 Web 应用程序时的性能.它可以自动测量你的网页需要多长时间来加载,Ajax 请求需要多长时间和各个函数需要实行多久. 您可能感兴 ...