- 浏览: 56808 次
- 性别:
- 来自: 杭州
最新评论
-
abkiss:
没有一点实用价值
maven,velocity实战总结 -
aa00aa00:
这个就能收取一封邮件吧,呵呵!!
JavaMail 入门(收发邮件) -
keaixiaozhu7688:
...
JavaMail 入门(收发邮件) -
babbyyang:
struts1.x我只用他的formbean 和 action ...
struts1.x & struts2对比学习及源码分析 -
chrisx:
发表下个人看法
1. 任何MVC框架关于前台UI的那部分我感 ...
struts1.x & struts2对比学习及源码分析
Struts1.x综述
一、业务逻辑
应包含在POJO类或EJB中,完全独立于Action。这样做的优点就是不依赖与框架本身,更好复用。
原则:类和类的方法应该有自己独立的职责,能够完成所建领域的特定任务(如ActionForm)
二、处理Exception
原则:1)在异常离开业务层之前捕获,处理,记录业务层抛出的所有异常;
2)在业务层捕获一个异常时,作为一个通用的异常类型重新抛出。
编制定制ExceptionHandler(如加入邮件通知,log记录等功能)
1、扩展org.apache.struts.action.ExceptionHandler,并重写execute方法
2、配置exception时,加入handle选项
三、ActionForm与Action
1、将ActionForm与业务逻辑分离,将ActionForm收集的数据copy到VO对象中,可以借助BeanUtils类完成该项功能。
2、将ActionForm中的公共属性设置为String类型(用户处理数字类型或Date类型,ActionForm默认会做类型转化,如果不能转化会抛出异常,可以用JS在前台处理数据或后台转化,后台转化不成抛出自定义异常信息)
3、将Action作为业务逻辑的调用点,而不是插入点。
4、在ActionForm的reset方法中注意清空checkbox,应为在没有选中checkbox时,HTTP协议发送的数据为空,而页面中原来被选中的不会改变。
四、验证
ActionForm的validate方法
Struts验证框架
JS前台验证
五、扩展Struts
1、扩展RequestProcessor,实现自己的控制器 实际上struts的控制器是RequestProcessor,而不是ActionServlet
a)继承org.apache.struts.action.RequestProcessor
b)重写process,processActionPerform,processPreProcess方法
一般不重写processPreProcess方法,主要是其抛出了ServletException和IOException
c)在配置文件中配置<controller processorClass="**.*Controller"/>
========strut1.x源码分析==========
一、Struts1.x
1、ActionServlet
init方法中初始化ActionMapping,ActionForward
doGet,doPost方法调用ActionServlet.process方法,其间接调用RequestProcessor.process方法
2、RequestProcessor
process
processPreProcess 设计上是一个钩子 可以在Action调用之前做一些动作。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
private static Log log = LogFactory.getLog(ActionMapping.class);
processActionCreate Action 是单实例的,因为其存在一个HashMap中
Action instance = (Action) actions.get(className);
if (instance != null) {
if (log.isTraceEnabled()) {
log.trace(" Returning existing Action instance");
}
return (instance);
}
ServletContext.getRequestDispatcher(String url) url为绝对地址
ServletRequest.getRequestDispatcher(String url) url为相对地址
HashMap中keySet方法返回key值集合,values方法返回value集合
http://localhost:8088/news/main/list.jsp news是应用程序的名字
则执行下面向行代码后打印出如下结果:
1、System.out.println(request.getContextPath()); 打印结果:/news
2、System.out.println(request.getServletPath()); 打印结果:/main/list.jsp
3、System.out.println(request.getRequestURI()); 打印结果:/news/main/list.jsp
4、System.out.println(request.getRealPath("/")); 打印结果: F:\Tomcat 6.0\webapps\news\test
struts1.x配置细节:Action中配置ActionForm,实例化ActionForm根据attribute配置
processPopulate中定义了处理ActionForm的定义
ModuleConfigImpl implements ModuleConfig
public ModuleConfigImpl(String prefix) {
super();
this.prefix = prefix;
this.actionConfigs = new HashMap();
this.actionConfigList = new ArrayList();
this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
this.actionMappingClass = "org.apache.struts.action.ActionMapping";
this.actionForwardClass = "org.apache.struts.action.ActionForward";
this.configured = false;
this.controllerConfig = null;
this.dataSources = new HashMap();
this.exceptions = new HashMap();
this.formBeans = new HashMap();
this.forwards = new HashMap();
this.messageResources = new HashMap();
this.plugIns = new ArrayList();
}
二、struts2
1、Action 普通POJO类
Struts2为Action的执行,准备了完整的数据环境和执行环境。而这个执行环境,就保证了Action在Web容器中的顺利运行。
2、Interceptor
Interceptor
init();
destory();
String intercept(ActionInvocation invocation) throws Exception{//核心方法
//doSomething....
String result=invocation.invoke();
//invocation.invoke()这个方法其实是整个拦截器框架的实现核心
//ActionInvocation作为Action的调度者
//doSomething....
return result;
}
3、result类型
Interface Result {
public void execute (ActionInvocation invocation) throws Exception{
}
}
dispatcher
redirect
4、测试
单元测试
Interceptor借助ActionProxy
Dispatcher
ObjectFactory可配置,即struts.objectFactory=spring
action = objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);
5、Struts2源码分析
ActionMapper
其实是HttpServletRequest和Action调用请求的一个映射,屏蔽了Action对于容器的依赖
ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是由ActionInvocation持有Action实例。
ActionProxy作用是如何取得Action,无论是本地还是远程。
而ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器
Struts2中的配置文件主要是尤其实现类XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
6. Struts2请求流程
1、客户端发送请求
2、请求先通过ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,这儿已经转到它的Delegate--Dispatcher来执行
5、ActionProxy根据ActionMapping和ConfigurationManager找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
8、Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。
java.util.concurrent包
preResultListeners 在处理Request之前可以做一些事情
RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);
if(dispatcher==null){
response.sendError(404,"result not found!!");
}
struts2标签
<s:iterator value="books" id="book" status="stat">
<tr>
<td><s:property value="#stat.count"/></td>
<td><s:property value="#book.name"/></td>
<td><s:property value="#book.author"/></td>
<td><s:property value="#book.publisher"/></td>
<td><s:property value="#book.price"/></td>
<td><s:date name="#book.publishDate" format="yyyy年MM月dd"></s:date></td>
<td><a onclick="return confirm('确认删除《${book.name }》')" href="book!delete.action?id=${book.id }">删除</a></td>
<td><a href=<s:url action="book" method="delete"></s:url>>更新</a></td>
</tr>
</s:iterator>
<!-- 如何使用ognl表达式对集合过滤
返回books集合中符合price>100的所有元素对象
?:表示返回所有满足条件的对象
^:表示返回第一个满足条件的对象
$:表示返回最后一个满足条件的对象
-->
<s:iterator value="books.{?#this.price>100}" id="book">
<tr>
<td>${book.name }</td>
<td>${book.author }</td>
<td>${book.publisher }</td>
<td>${book.price }</td>
</tr>
</s:iterator>
</table>
<hr>
<!-- 定义一个age变量,可使用scope属性指定变量所属范围,
scope属性值可为page、request、session、application、action。
如果不加scope属性,则默认范围是context中 -->
<s:set name="age" value="28"></s:set>
<!-- test属性指定一个ognl表达式 -->
<s:if test="age > 20">
成年人
</s:if>
<s:else>
未成年
</s:else>
OGNL表达式
</h1><hr>
<h1>
action:<s:property value="name"/><br>
request:<s:property value="#request.name"/>
:<s:property value="#request.name1"/>
<br>
session:<s:property value="#session.name"/><br>
application:<s:property value="#application.name"/><br>
<hr>
<s:property value="person.name"/>
<s:property value="person.address"/><br>
<s:property value="user.name"/>
<s:property value="user.address"/>
<hr>EL表达式在Struts2中的使用<br>
${name }
</h1>
评论
1. 任何MVC框架关于前台UI的那部分我感觉都比较鸡肋,前台可以自己去实现,比如jQuery, ext, flex, 用他们提供的很不灵活,不可控。前台验证可以用jquery提供的验证,如果是ext或flex项目,框架自身提供验证。
2. Struts2的Action可以是线程安全的,与Spring集成时,定义bean的时候要定义成非单利模式,即可线程安全,每次实例化。
3. S1与S2虽说是一个公司的产品,但是两个时代的产物,可以当做只是名一样而已
还有一个是线程安全方面的实践。
但是我发现很多网站都用JS做前台验证的啊,比如163邮箱等
你误会我意思啦,Struts会把所有的验证方法全部压倒客户端,不是说不要JS验证。
还有一个是线程安全方面的实践。
但是我发现很多网站都用JS做前台验证的啊,比如163邮箱等
线程安全方面的实践,谢谢提醒。
还有一个是线程安全方面的实践。
发表评论
-
图片处理程序
2012-11-10 15:35 1284/* * @author: xiangbin@tao ... -
JVM 基础
2012-11-06 15:39 717Java启动命令 /usr/java/jdk1.6. ... -
JSON web应用前后端通讯的轻量级结果处理
2012-11-06 15:35 1171JSON是一种传递对象的语 ... -
web应用总览(个人总结)
2011-07-25 19:36 426web应用纵观全局,解决问题就是分层。每个层面都会涉及很多问题 ... -
敏捷开发
2010-06-01 17:59 1279最近关注敏捷开发,看了几本敏捷开发方面的书籍。也有点体会,做个 ... -
极限编程+敏捷开发实践
2010-05-19 09:27 1154极限编程:xp主要针对 ... -
JavaMail 入门(收发邮件)
2010-05-10 16:47 1739package mail; import java.io ... -
java与模式
2009-03-22 19:39 836Singleton模式主要作用是保证在java应用程序中,一个 ... -
java基础知识总结
2009-03-22 20:05 724一、java 基础语法 if-else ... -
Collection集合接口
2009-03-24 21:37 1107Collection集合接口 集合对象:用 ... -
空指针错误
2009-04-02 21:52 11591、空指针错误 Java.lang.N ... -
corejava小结 2009年5月9日
2009-05-09 12:53 785<script>function StorePag ... -
Servlet小结
2009-05-20 21:15 780Servlet总结一、Servlet 基本概念1、Servle ... -
事务处理和异常处理小结
2009-05-22 21:14 761事务处理: 事务最主要的就是原子性,一个交易要么一起成 ... -
转发和重定向
2009-05-22 21:29 10001.概念上的区别: 转发:一次请求,重定向:两次请求 2. ... -
购物车简单剖析
2009-06-10 21:06 856购物车应该针对每个用户一个购物车,并且购物车登陆后的用户信息做 ... -
hibernate中一些小技巧
2009-06-14 07:03 7671立即加载 lazy=false 2.延时加载lazy= ... -
ant的强大和用武之地
2009-06-21 08:27 545ant(蚂蚁工具)可用于部署应用程序 ant的配置:ANT_ ... -
错误总结(j集中在此)
2009-07-04 06:03 8041、异常处理 异常不仅仅是一种错误信息,还表示一种运行结果 ...
相关推荐
struts1.x&2_lib文件 struts1.x&2_lib文件
Struts1.x常用的开发包,需要学习struts1.x朋友可以下载
struts1.x和struts2.x区别
Struts 2.x权威指南(第3版)
在这里,通过一个小例子稍微总结了下struts1和struts2的区别,希望这个能帮助到初学struts的朋友
Struts1.x的登录示例,Struts1.x相关详细教程参考我的Blog:http://blog.csdn.net/boyazuo
freemarker与struts 1.x 结合,生成html 在http://blog.csdn.net/chen1255 的web中有详细描述关于freemarker与struts1.x的结合
java Struts 1.x 框架 Web 开发 java Struts 1.x 框架 Web 开发
Struts1.x-Jdbc,学习Struts1.的曾删改查
struts1.x入门教程
struts1.x多文件上传, 感觉不错.
struts1.x apps 所有最新的Struts1.x项目应用 struts1.x apps 所有最新的Struts1.x项目应用 欢迎大家下载。。。
struts1.x 学习总结 struts1.x 学习总结 struts1.x 学习总结 struts1.x 学习总结
struts1 国际化 源代码 struts1 国际化 工程
Struts 2.X权威指南(第3版)第二章 因为上传大小有限制,所以只能每一章做一次上传。请自己选择需要的章节下载哦
这是struts1.x标签! struts1.x是历经考验的成熟的框架! 此标签可以帮助你更好的学习struts1.x的标签!
适用于Struts1.x初学者(网摘共25节)
struts2.x所有包及配置文件
struts2.X 拦截器源码