- 浏览: 58952 次
- 性别:
- 来自: 杭州
最新评论
-
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 1324/* * @author: xiangbin@tao ... -
JVM 基础
2012-11-06 15:39 754Java启动命令 /usr/java/jdk1.6. ... -
JSON web应用前后端通讯的轻量级结果处理
2012-11-06 15:35 1216JSON是一种传递对象的语 ... -
web应用总览(个人总结)
2011-07-25 19:36 469web应用纵观全局,解决问题就是分层。每个层面都会涉及很多问题 ... -
敏捷开发
2010-06-01 17:59 1351最近关注敏捷开发,看了几本敏捷开发方面的书籍。也有点体会,做个 ... -
极限编程+敏捷开发实践
2010-05-19 09:27 1186极限编程:xp主要针对 ... -
JavaMail 入门(收发邮件)
2010-05-10 16:47 1783package mail; import java.io ... -
java与模式
2009-03-22 19:39 870Singleton模式主要作用是保证在java应用程序中,一个 ... -
java基础知识总结
2009-03-22 20:05 759一、java 基础语法 if-else ... -
Collection集合接口
2009-03-24 21:37 1134Collection集合接口 集合对象:用 ... -
空指针错误
2009-04-02 21:52 11971、空指针错误 Java.lang.N ... -
corejava小结 2009年5月9日
2009-05-09 12:53 818<script>function StorePag ... -
Servlet小结
2009-05-20 21:15 821Servlet总结一、Servlet 基本概念1、Servle ... -
事务处理和异常处理小结
2009-05-22 21:14 810事务处理: 事务最主要的就是原子性,一个交易要么一起成 ... -
转发和重定向
2009-05-22 21:29 10661.概念上的区别: 转发:一次请求,重定向:两次请求 2. ... -
购物车简单剖析
2009-06-10 21:06 896购物车应该针对每个用户一个购物车,并且购物车登陆后的用户信息做 ... -
hibernate中一些小技巧
2009-06-14 07:03 8591立即加载 lazy=false 2.延时加载lazy= ... -
ant的强大和用武之地
2009-06-21 08:27 614ant(蚂蚁工具)可用于部署应用程序 ant的配置:ANT_ ... -
错误总结(j集中在此)
2009-07-04 06:03 8821、异常处理 异常不仅仅是一种错误信息,还表示一种运行结果 ...
相关推荐
Struts1.x与Struts2.x是两种非常流行的Java Web应用程序框架,它们都由Apache软件基金会开发,旨在简化MVC(Model-View-Controller)架构的实现。然而,两者在设计哲学、功能特性以及实现方式上存在显著差异。以下是...
总的来说,Struts1.x和Struts2代表了Java Web开发中的两种不同架构风格,而"struts1.x&2_lib"文件则包含了这两个版本的库文件,对于理解和使用Struts框架进行Web开发具有重要意义。通过深入学习和实践,开发者可以...
### Struts1.x与Struts2.x的主要区别 在深入探讨Struts1.x与Struts2.x的区别之前,我们先来了解一下这两个框架的基本背景。Apache Struts是用于构建企业级Web应用程序的开源框架,它提供了MVC(模型-视图-控制器)...
虽然现在Struts1.x已经被Struts2等更新的框架所取代,但它的基础思想和设计模式仍然是Java Web开发中的重要参考。对于想要了解Web开发历史或深入理解MVC框架的开发者来说,学习Struts1.x仍然具有一定的价值。
### Struts1.x 技术课程讲解 #### 一、Struts1.x 概述 ...通过以上内容的学习,学员将能够掌握 Struts1.x 的核心概念、工作原理及开发流程,进而能够独立开发基于 Struts1.x 的企业级 Web 应用程序。
本系列教程是针对初学者的全面指导,旨在帮助学习者快速掌握Struts1.x的核心概念和使用方法。下面我们将深入探讨Struts1.x的关键知识点。 1. **MVC架构**:MVC是一种设计模式,用于分离应用程序的数据、业务逻辑和...
Struts1.x是一款经典的Java Web框架,由Apache软件基金会开发并维护。它是MVC(Model-View-Controller)设计模式的实现,极大地简化了Java Web应用程序的开发过程。本资源集合包含了所有最新的Struts1.x项目应用,为...
Struts1.x是一个经典的Java Web框架,它在20世纪末至21世纪初被广泛使用,用于构建基于MVC(Model-View-Controller)架构的Web应用。本示例将探讨如何使用Struts1.x实现一个简单的登录功能。首先,我们需要理解...
然而,随着时间的推移,Struts 1.x 因为其局限性和安全问题,逐渐被Struts 2 和其他现代框架如Spring MVC、Play Framework等取代。尽管如此,了解 Struts 1.x 的基础知识对于理解Java Web开发的历史和演变仍然非常有...
通过分析这个Struts1.x_Project,我们可以学习到如何配置Struts框架,理解ActionForm、Action、Struts-config.xml的作用,以及如何实现I18N和表单验证。同时,项目的数据库操作部分也是Java Web开发中重要的实践环节...
在学习Struts1.x的过程中,理解MVC模式以及ActionForm和Action的作用至关重要。此外,熟练掌握配置文件的编写,能让你更有效地组织和控制应用的流程。随着对框架的深入理解和实践,你将能够构建出更加复杂和功能丰富...
Struts 2.x权威指南(第3版)
**Struts2.x与Struts1.x对比**:相较于Struts1.x,Struts2.x具有更多的优势,如不再强制要求ActionForm,配置文件更简洁,处理流程更加清晰。具体而言,请求首先被过滤器捕获,然后根据`struts.xml`文件的配置调用...
Struts 1.x 是一个经典的Java Web开发框架,由Apache软件基金会开发,它极大地简化了MVC(模型-视图-控制器)架构的实现。如果你正在寻找如何搭建Struts 1.x的开发环境,以下是一些关键的知识点,以及这些指定的jar...
本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...
freemarker与struts 1.x 结合,生成html 在http://blog.csdn.net/chen1255 的web中有详细描述关于freemarker与struts1.x的结合
总的来说,《Struts 2.X权威指南(第3版)》第二章是深入学习Struts 2的关键,它涵盖了框架的基础架构、核心组件、配置、数据绑定、异常处理和插件系统等多个方面。通过阅读这一章,开发者能够建立起对Struts 2的...
尽管现在Struts2已经成为主流,但Struts1.x的原理和知识仍然对理解Web应用开发有重要意义。 Struts1.x的核心概念包括: 1. **ActionServlet**:这是Struts框架的心脏,负责处理所有的HTTP请求。它根据配置文件中的...
通过本系列教程的学习,读者将能够掌握Struts 1.x框架的基本使用方法,了解其核心组件和配置,并能够通过实践来加深对Struts 1.x开发过程的理解。同时,通过与Struts 2.x的比较,读者可以更深入地理解Web应用框架的...
总结,Struts1.x作为经典的Web开发框架,其丰富的功能和广泛的应用使得学习和掌握它成为提升Java Web开发技能的重要一步。通过本教程,你将对Struts1.x有深入的理解,并能将其应用于实际项目中,构建出高效、稳定的...