配置了多个struts1 web.xml,但是在提交的时候,是如何找到对应的strutsxxx.xml的呢?

最简单的比如在用户登陆和注册两个功能,
其中涉及的成员变量都很相似,
登陆功能的成员变量有:name,password,vercode(验证码)
注册功能的成员变量有:name,password,email,···
由于没真正接触企业的实际的项目,所以问下,到底是一个功能模块对应一个请求好呢,还是类似的多个请求对应一个action
如果多个请求对应一个action 的话,那又有一些问题了。。
一个action 只能配有一个input ,如果验证错误的话,会直接跳转到input 中,但我想在登陆 验证错误的话,跳转到登陆页面,注册验证错误跳转到注册页面,这样该怎么配置好呢。。
网上有一些解决的办法是,在struts.xml 中配置多个aciton映射,但同指向一个action 中,就是加多个method 属性了。
ps:另外有个小问题,struts2中ajax 主题是不是不建议使用了,网上说效率有点差了,而如果用struts2 的ajax 主题的话,能很容易实现ajax 的效果。struts2.1x中已经把ajax 主题包放在了dojo插件了,好像有点被struts2遗弃了。实际开发中是怎样的呢??
采纳的答案
把一类请求放到一个action里,相关的action对以请求
一个请求对应一个action,当项目最后你会为查找action而疯狂
我些一个基于注解的mcv例子给你看看:
@Controller
@RequestMapping(value="/news/*")
public class NewsController {
@Autowired
NewsService newsS
public String delNews(News news,ModelMap model){
newsService.del(news);
return "/news/news.jsp";
@Autowired
public String addNews(News news,ModelMap model){
return "/news/news.jsp"
这样子还不够,还要注意CRC原则默认大约配置,这个啥意思呢,就是你的controller,service,dao层的名字最还一致后面+controller,service,dao等,包括的你的action请求可以写成/news/addNews. /news/delNews. /news/getList.do等,而news就是那个统一到的controller了,你找也方便,直接找NewsController.然后找里面的delNews,getList等方法。
Struts1.2 里用一个DispatchAction 多个方法对应多个用户请求。
Struts2.0 里也可以采用类似的方式,而且又不怕存在并发问题。
其实关于验证的问题,个人觉得主要使用前台JS验证(不用Struts2.0 的验证框架,因为影响页面外观),后台验证也可以用 不过需要配置多个Action的映射,对每个不同映射指定 input属性。
至于Ajax 只需要用Action就可以了,前台可以用 Prototype、JQuery、ExtJS等等。
每个请求可以提交给不同的action,然后由action中的方法来处理
最佳解决方案是一个action的多个method,ajax并非不能用,建议你用jquery
Struts 2.0 中的zero config, code behide等 Annotation插件可以算是 xml 的翻译,和 CoC 概念还是有一段距离。
2.1 官方出了 Convention 插件,这个插件体现了convention 的一些概念,但很大程序复制了Stripes 框架的一些成果。
Struts 2 有些地方我是不喜欢,比如ognl,功能虽然强大,但也存在问题,1.性能低下,tapestry 作者在blog报怨过,曾考虑在未来的tapestry中放弃ognl。
2.与现有jstl体系格格不入,许多jstl taglib都可能存在兼容性问题。
3.它的表示方法,不如jstl简洁。
在 Convention ,Action 多事件处理,validation 方面,Struts 2 都应该向 Stripes 学习。
一个 Action处理多个请求还是一个请求,没有定论,如果把这个当成一个话题,是个永远都争论不完的。
例如一个Login或register,都可以放到一个action中处理,用两个不同的方法。但是要说的对于这种多事件的处理,Struts1, Struts2 的方法相对不够优雅,需要额外的配置(不管是Annotation还是xml配置方式),如果你了解过 Stripes 框架就会体会到这一点()。
如何区别 input ,这个不难,在Struts2 中,针对不同方法定义不同的action url映射,这样,所有的result 都是分开的了。
Struts ajax 是基于dojo 的,应该它集成的是 0.4,效率方面存在一定的问题,这个项目已经没有人去维护,Struts 团队明确的将它标志为过时。
是的,struts,struts2都又对应的一个controller多个action的方法。
而且struts2也开始支持注解,也是非常方便的!
基本原则还是一样,保持CRC原则,命名统一,便于查找,同一类action尽量写到一个controller里可有又一下好处
1、节约命名资源,新手没发现,等你开发多了就发现了这东西是如此册宝贵啊。哈哈!
2、便于定位,便于查找。
3、简便开发,提高开发速度
上面的spring mvc
上面的代码批注错了,看这个代码好理解点!
引用
@Controller
@RequestMapping(value="/news/*")
public class NewsController {
@Autowired
NewsService newsS
@RequestMapping(value="delNews.do")
public String delNews(News news,ModelMap model){
newsService.del(news);
return "/news/news.jsp";
@RequestMapping(value="addNews.do")
public String addNews(News news,ModelMap model){
return "/news/news.jsp"
一个请求 准确来说
是对应一个 action中的 某一个方法。
你也可以以个请求 对应以个action只不过是 这个action中只有一个方法罢了。
实际项目中 一个action是有多个方法的。
你这项目能有多大。
别考虑这么多, 先按自己的理解 算法 做出来。
然后在学习重构代码。 这样学的最快。
我原来的项目是一个请求对应一个action,虽然繁琐,但是很方便,容易理解。自己写过的项目也不是很多,没有更多的经验传授。
引用一个action 只能配有一个input 应该不是一个input吧.我用struts1.x,
一个action 可以有多个forward啊,ajax我用的是jquery.2.0不熟悉
建议你看看这个
已解决问题
未解决问题请问在ssh1项目中,如何实现dispatchaction的,struts-config.xml的通配符?_百度知道
请问在ssh1项目中,如何实现dispatchaction的,struts-config.xml的通配符?
struts1.2+hibernate3+spring2.0项目中,使用的是DispatchAction,但是貌似不能实现struts-config.xml的通配符功能,请指点小弟一下!
提问者采纳
Struts2才有通配符简化操作,Struts1.x中如果使用:DispachAction只能通过在配置action属性parameter时指定一个值如:method,然后通过请求地址xxx.do?method=Action中的方法名称进行处理。不过你可以考虑一下DispatchAction的2个子类:MappingDispatchAction和LookupDispatchAction,一下是两个子类的具体用法:1. 使用 MappingDispatchActionMappingDispatchAction可将同一个Action的不同方法映射成多个ActionURI,这种Action 的写法与 DispatchAction 非常相似,同样不需要重写 execute 方法,而是将书写多个自定义的方法。这些方法除了方法名与 execute 方法不同外,其他的参数列表及异常处理完全一样。下面是本示例所使用的 Action 的源代码:public classLoginActionextends MappingDispatchAction//第一个处理逻辑public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponserespo口se)throws ExceptionSystem.out.println(&增加&);request.setAttribute( 咱ethod& , &增加&);returnmapping.fi口dForward(&success&);}//第二个处理逻辑public ActionForward modify(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ExceptionSystem.out.println(&修改&);request.setAttribute( 叮nethod&&修改&);return mapping.findForward(&success&);该 Action 与前面的 DispatchAction 没有太大的区别,仅仅改变它的父类:MappingDispatchAction,但变化在于该Action的配置,看下面关于该Action的配置代码:&!--配置第一个Action. 实现类是lee.LoginAction, parameter 为 add--&&action path=&/add& type=&lee.LoginAction& name=&loginForm&scope=&request&validate=&true& input=&logi口 .jsp&parameter=&add&&&forward name=&success& path=&/welcome.jsp&l&&/action&&!配置第二个Action. 实现类是lee.LoginAction, parameter 为 modify--&&action path=&/modify& type=&lee.LoginAction&口ame=&loginFormllscopei &request&validate=&true&input=&login.jsp/ parameter=&modify&&&forward 口ame=&success&path=&/welcome.jsp&l&&/action&在这种情况下,两个action使用的是同一个Action处理类,只是调用的方法不同,同样也可达到上面的效果。当然也需要为页面中的两个按钮增加相应的 JavaScript脚本,当单击不同按钮时,表单可提交到不同的action,下面是JSP页面三个按钮的源代码:&td&&input type=&submit& value='&bean:messagekey=&button.add&/&'onClick=&document.loginForm.action='add.do'''/&&input type=&submit&value='&bean :messagekey=&button.modify&I&'onClick=&document.loginForm.action='modify.do'''I&&input type=&reset& value='&bean:message key=&button.reset&I&'I&&ltd&其中,前面两个提交按钮都增加了onClick方法,即单击该按钮时,会改变表单的提交地址。注意:使用 MappingDispatchAction 并没有带来太大的优势,系统完全可以书写两个Action,分别定义两个不同的 action 映射,而其他部分没有区别。2.使用 LookupDispatchActionLookupDispatchAction也是 DispatchAction的一种,但它的处理更加简单。该Action也可包含多个处理方法,它可让处理方法与按钮直接关联,无须使用任何的 JavaScript脚本。使用 LookupDispatchAction时,提交按钮必须使用Struts 的 html 标签,下面是该示例按钮部分的源代码: &td&&html:submit property=&method&&&bean:message key=&button.add&l&&/html:submit&&html:submit property=&method&&&bean:message key=&button.modify&l&&/html:submit&&input type=&reset& value='&bean:message key=&button.reset&I&'I&&ltd&代码中两个提交按钮分别增加了property属性,该属性的值为method。而在 action的配置中,也使用parameter作为参数,看下面的action配置代码:&action path=&/login& type=&lee.LoginAction& name=&loginForm&scope=&request& validate=&true& input=&/login.jsp& parameter=&method&&&forward name=&success& path=&/welcome.jsp&l&&/action&这段配置代码表明:该action也根据method参数来区分请求分别调用哪个方法,此时无须使用 method 的隐藏域,而是将按钮的property设为 method。通过这种方式可以避免书写JavaScript脚本。因此可通过重写getKeyMethodMap方法完成按钮与Action 中方法的关联,下面是该 Action的源代码:public class LoginAction extends LookupDispatchAction{//用于关联按钮和方法protected Map getKeyMethodMap()Map map = new HashMap();//如果按钮标题的key 为 button.add. 则提交该按钮时对应add方法map.put (&button.add& , &add&);//如果按钮标题的key 为 button.modify. 则提交该按钮时对应modify方法map.put (&button.modify& ,&modify&);}//第一个处理逻辑public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ExceptionSystem.out.println(&增加 //)irequest.setAttribute(&method& , &增加&) ;returnmapping.findForward(&success&) ;}第二个处理逻辑public ActionForward modify(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws ExceptionSystem.out.println(&修改//) ;request.setAttribute( 咱ethod////修改 //) ;return mapping.findForward(&success&);LookupDispatchAction必须重写getKeyMethodMap方法,该方法返回一个Map对象,并在该对象内保存了按钮标题与方法之间的对应。
提问者评价
虽然现在已经不用struts1了,不过还是要谢谢你的热心回答....
其他类似问题
为您推荐:
dispatchaction的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
总结Struts1中的struts xml配置文件元素详解
下载积分:30
内容提示:总结Struts1中的struts xml配置文件元素详解
文档格式:PDF|
浏览次数:139|
上传日期: 06:57:14|
文档星级:
该用户还上传了这些文档
总结Struts1中的struts xml配置文件元素详解
官方公共微信1553人阅读
&servlet-name&action&/servlet-name&
&servlet-class&
org.apache.struts.action.ActionServlet
&/servlet-class&
&init-param&
&param-name&config&/param-name&
&param-value&
/WEB-INF/struts-config.xml,
/WEB-INF/struts-config-file.xml,
/WEB-INF/system/struts-config-user.xml,
/WEB-INF/system/struts-config-org.xml,
/WEB-INF/system/struts-config-role.xml,
/WEB-INF/system/struts-config-fluxbasic.xml,
/WEB-INF/system/struts-config-area.xml,
/WEB-INF/system/struts-config-flux.xml,
/WEB-INF/system/struts-config-sysblock.xml,
/WEB-INF/data/struts-config-data.xml,
/WEB-INF/data/struts-config-blockreport.xml,
/WEB-INF/data/sturts-config-reguserinfo.xml,
/WEB-INF/data/struts-congif-basicdata.xml,
/WEB-INF/data/struts-config-blackdata.xml,
/WEB-INF/data/struts-config-interface.xml,
/WEB-INF/data/struts-config-regreport.xml,
/WEB-INF/data/struts-config-datareport.xml,
/WEB-INF/system/struts-config-monitor.xml,
/WEB-INF/system/struts-config-property.xml
&/param-value&
&/init-param&
&init-param&
&param-name&debug&/param-name&
&param-value&2&/param-value&
&/init-param&
&init-param&
&param-name&detail&/param-name&
&param-value&2&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
struts1.2如何配置多个struts-config.xml
一 分模块的
在 web.xml里面 这样配置就行了&
=========================================================
&servlet-name&action&/servlet-name&
&servlet-class&org.apache.struts.action.ActionServlet&/servlet-class&
&init-param&
&param-name&config&/param-name&
&param-value&
/WEB-INF/struts-config.xml,
/WEB-INF/struts-config1.xml,
/WEB-INF/struts-config2.xml
&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup &
&/servlet&
=============================
三 参数化的
我说还有简单的 在web-inf下配置若干个Strut-config文件 然后在web.xml配置文件中用通配符* 例如:&
&servlet-name&action &/servlet-name&
&servlet-class&org.apache.struts.action.ActionServlet &/servlet-class&
&init-param&
&param-name&config &/param-name&
&param-value&/WEB-INF/struts-config*.xml &/param-value&
&/init-param&
&init-param&
&param-name&config/test &/param-name&
&param-value&/WEB-INF/struts-test-config.xml &/param-value&
&/init-param&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:705268次
积分:11373
积分:11373
排名:第571名
原创:433篇
转载:95篇
评论:174条
(4)(4)(16)(16)(20)(2)(3)(2)(7)(3)(3)(3)(6)(6)(3)(8)(10)(8)(7)(40)(8)(1)(7)(6)(2)(1)(1)(12)(11)(11)(18)(6)(4)(11)(10)(1)(1)(7)(1)(1)(3)(43)(30)(3)(8)(3)(6)(8)(3)(8)(6)(13)(4)(1)(6)(1)(1)(4)(10)(4)(7)(7)(3)(12)(21)(21)(1)76471人阅读
1.深入Struts2的配置文件
本部分主要介绍struts.xml的常用配置。
1.1.包配置:
Struts2框架中核心组件就是Action、拦截器等,Struts2框架使用包来管理Action和拦截器等。每个包就是多个Action、多个拦截器、多个拦截器引用的集合。
在struts.xml文件中package元素用于定义包配置,每个package元素定义了一个包配置。它的常用属性有:
l&name:必填属性,用来指定包的名字。
l&extends:可选属性,用来指定该包继承其他包。继承其它包,可以继承其它包中的Action定义、拦截器定义等。
l&namespace:可选属性,用来指定该包的命名空间。
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &!-- struts2的action必须放在一个指定的包空间下定义 --&
&&& &package name="default" extends="struts-default"&
&&& &!-- 定义处理请求URL为login.action的Action --&
&&&&&&& &action name="login" class="org.qiujy.web.struts.action.LoginAction"&
&&&&&&& &!-- 定义处理结果字符串和资源之间的映射关系 --&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。
1.2.命名空间配置:
考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
把上示例的配置改为如下形式:
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &!-- struts2的action必须放在一个指定的包空间下定义 --&
&&& &package name="qiujy" extends="struts-default"&
&&& &!-- 定义处理请求URL为login.action的Action --&
&&&&&&& &action name="login" class="org.qiujy.web.struts2.action.LoginAction"&
&&&&&&& &!-- 定义处理结果字符串和资源之间的映射关系 --&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
&&& &package name="my" extends="struts-default" namespace="/manage"&
&&& &!-- 定义处理请求URL为login.action的Action --&
&&&&&&& &action name="backLogin" class="org.qiujy.web.struts2.action.LoginAction"&
&&&&&&& &!-- 定义处理结果字符串和资源之间的映射关系 --&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&&/struts&
如上配置了两个包:default和my,配置my包时指定了该包的命名空间为/manage。
对于包default:没有指定namespace属性。如果某个包没有指定namespace属性,即该包使用默认的命名空间,默认的命名空间总是""。
对于包my:指定了命名空间/manage,则该包下所有的Action处理的URL应该是&命名空间/Action名&。如上名为backLogin的Action,它处理的URL为:
http://localhost:8080/userlogin_struts2/manage/backLogin.action
Struts2的命名空间的作用等同于struts1里模块的作用。
1.3.包含配置:
在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。
&&& &include file="struts-default.xml"/&
&&& &include file="struts-user.xml"/&
&&& &include file="struts-book.xml"/&
&&& &include file="struts-shoppingCart.xml"/&
&&& ......
&& &/struts&
1.4.拦截器配置:
见后面章节介绍。
1.5.常量配置:
Struts2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射, 及Action处理结果和物理资源之间的映射关系。除此之外,Struts2框架还包含了一个struts.properties文件,该文件主义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。
如:后面会讲到Struts2的国际化,它的资源文件位置就用常量属性来指定:
&&& ......
&&& &constant name="struts.custom.i18n.resources" value="messages"/&
表示指定了资源文件的放置在classes目录下,基本名是messages,则在classes目录下您就应该放置类似messages_zh_CN.properties,message_en.properties名的文件。
2.Struts2的Action
2.1.实现Action类:
Struts2中Action是核心内容,它包含了对用户请求的处理逻辑,我们也称Action为业务控制器。
Struts2中的Action采用了低侵入式的设计,Struts2不要求Action类继承任何的Struts2的基类或实现Struts2接口。(但是,我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用接口,提供了很多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等,这样可以大大的简化Action的开发。)
Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法。(当然,Action类中还可以封装处理结果,把处理结果信息当作一属性,提供对应的getter和setter方法)
修改第一部分的用户登录示例:把Action改成如下:
package org.qiujy.web.struts2.
import com.opensymphony.xwork2.ActionS
&*@authorqiujy
&*@version1.0
publicclass LoginAction extends ActionSupport{
&&& private String userName;
&&& private String password;
&&& private String msg; //结果信息属性
&&& &*@returnthemsg
&&& public String getMsg() {
&&&&&&& returnmsg;
&&& &*@parammsgthemsgtoset
&&& publicvoid setMsg(String msg) {
&&&&&&& this.msg =
&&& &*@returntheuserName
&&& public String getUserName() {
&&&&&&& returnuserName;
&&& &*@paramuserNametheuserNametoset
&&& publicvoid setUserName(String userName) {
&&&&&&& this.userName = userN
&&& &*@returnthepassword
&&& public String getPassword() {
&&&&&&& returnpassword;
&&& &*@parampasswordthepasswordtoset
&&& publicvoid setPassword(String password) {
&&&&&&& this.password =
&&& &*处理用户请求的excute()方法
&&& &*@return结果导航字符串
&&& &*@throwsException
&&& public String execute() throws Exception{
&&&&&& if("test".equals(this.userName) &&
"test".equals(this.password)){
&&&&&&&&&& msg = "登录成功,欢迎" + this.userName;
&&&&&&&&&& returnthis.SUCCESS;
&&&&&& }else{
&&&&&&&&&& msg = "登录失败,用户名或密码错";
&&&&&&&&&& returnthis.ERROR;
往success.jsp和error.jsp页面中添加 ${msg}&EL表达式来显示结果信息。则最终效果跟以前一样。
2.2.Action访问Servlet API:
Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试。
但是,对于web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。Struts2框架提供了一种更轻松的方式来访问Servlet API。Struts2中提供了一个ActionContext类(当前Action的上下文对象),通过这个类可以访问Servlet API。下面是该类中提供的几个常用方法:
l&public static ActionContext getContext() :获得当前Action的ActionContext实例。
l&public Object get(Object key) :此方法类似于调用HttpServletRequest的getAttribute(String name)方法。
l&public void put(Object key, Object value) :此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。
l&public Map getParameters() :获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。
l&public Map getSession() :返回一个Map对象,该Map对象模拟了HttpSession实例。
l&public void setSession(Map session) : 直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
l&public Map getApplication() :返回一个Map对象,该对象模拟了该应用的ServletContext实例。
l&public void setApplication(Map application) :直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名-属性值对。
修改以上用户登录验证示例的Action类中的execute方法:
public String execute() throws Exception{
&&&&&&& if("test".equals(this.userName) && "test".equals(this.password)){
&&&&&&&&&&& msg = "登录成功,欢迎" + this.userName;
&&&&&&&&&&& //获取ActionContext实例,通过它来访问Servlet API
&&&&&&&&&&& ActionContext context = ActionContext.getContext();
&&&&&&&&&&& //看session中是否已经存放了用户名,如果存放了:说明已经登录了;
//否则说明是第一次登录成功
&&&&&&&&&&& if(null != context.getSession().get("uName")){
&&&&&&&&&&&&&&& msg = this.userName + ":你已经登录过了!!!";
&&&&&&&&&&& }else{
&&&&&&&&&&&&&&& context.getSession().put("uName", this.userName);
&&&&&&&&&&& }
&&&&&&&&&&&
&&&&&&&&&&& returnthis.SUCCESS;
&&&&&&& }else{
&&&&&&&&&&& msg = "登录失败,用户名或密码错";
&&&&&&&&&&& returnthis.ERROR;
&&&&&& Struts2中通过ActionContext来访问Servlet API,让Action彻底从Servlet API 中分离出来,最大的好处就是可以脱离Web容器测试Action。
&&&&&& 另外,Struts2中还提供了一个ServletActionContext类,Action只要继承自该类,就可以直接访问Servlet API。具体方法参看struts2的API文档。
3.一个Action内包含多个请求处理方法的处理
Struts1提供了DispatchAction,从而允许一个Action内包含多个请求处理方法。Struts2也提供了类似的功能。处理方式主要有以下三种方式:
3.1.动态方法调用:
DMI:Dynamic Method Invocation 动态方法调用。
动态方法调用是指:表单元素的action不直接等于某个Action的名字,而是以如下形式来指定对应的动作名:
&form method="post" action="userOpt!login.action"&
则用户的请求将提交到名为&userOpt&的Action实例,Action实例将调用名为&login&方法来处理请求。同时login方法的签名也是跟execute()一样,即为public String login() throws Exception。
注意:要使用动态方法调用,必须设置Struts2允许动态方法调用,通过设置struts.enable.DynamicMethodInvocation常量来完成,该常量属性的默认值是true。
3.1.1.示例:
修改用户登录验证示例,多增加一个注册用户功能。
1.修改Action类:
package org.qiujy.web.struts2.
import com.opensymphony.xwork2.ActionC
import com.opensymphony.xwork2.ActionS
&*@authorqiujy
&*@version1.0
publicclass LoginAction extends ActionSupport{
&&& private String userName;
&&& private String password;
&&& private String msg; //结果信息属性
&&& &*@returnthemsg
&&& public String getMsg() {
&&&&&&& returnmsg;
&&& &*@parammsgthemsgtoset
&&& publicvoid setMsg(String msg) {
&&&&&&& this.msg =
&&& &*@returntheuserName
&&& public String getUserName() {
&&&&&&& returnuserName;
&&& &*@paramuserNametheuserNametoset
&&& publicvoid setUserName(String userName) {
&&&&&&& this.userName = userN
&&& &*@returnthepassword
&&& public String getPassword() {
&&&&&&& returnpassword;
&&& &*@parampasswordthepasswordtoset
&&& publicvoid setPassword(String password) {
&&&&&&& this.password =
&&& &*处理用户请求的login()方法
&&& &*@return结果导航字符串
&&& &*@throwsException
&&& public String login() throws Exception{
&&&&&&& if("test".equals(this.userName) && "test".equals(this.password)){
&&&&&&&&&&& msg = "登录成功,欢迎" + this.userName;
&&&&&&&&&&& //获取ActionContext实例,通过它来访问Servlet API
&&&&&&&&&&& ActionContext context = ActionContext.getContext();
&&&&&&&&&&& //看session中是否已经存放了用户名,如果存放了:说明已经登录了;
//否则说明是第一次登录成功
&&&&&&&&&&& if(null != context.getSession().get("uName")){
&&&&&&&&&&&&&&& msg = this.userName + ":你已经登录过了!!!";
&&&&&&&&&&& }else{
&&&&&&&&&&&&&&& context.getSession().put("uName", this.userName);
&&&&&&&&&&& }
&&&&&&&&&&&
&&&&&&&&&&& returnthis.SUCCESS;
&&&&&&& }else{
&&&&&&&&&&& msg = "登录失败,用户名或密码错";
&&&&&&&&&&& returnthis.ERROR;
&&& public String regist() throws Exception{
&&&&&&& //将用户名,密码添加到数据库中
&&&&&&& //...
&&&&&&& msg = "注册成功。";
&&&&&&& returnthis.SUCCESS;
2.struts.xml文件:没有什么变化,跟以前一样配置
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &package name="my" extends="struts-default" namespace="/manage"&
&&& &!-- 定义处理请求URL为login.action的Action --&
&&&&&&& &action name="userOpt" class="org.qiujy.web.struts2.action.LoginAction"&
&&&&&&& &!-- 定义处理结果字符串和资源之间的映射关系 --&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
&%@ page language="java" pageEncoding="UTF-8"%&
&&& &title&用户登录页面&/title&
&&&h2&用户入口&/h2&
&&& &form action="manage/userOpt!login.action" method="post"&
&&& &table border="1"&
&&& &&&& &tr&
&&& &&&&&&&& &td&用户名:&/td&
&&& &&&&&&&& &td&&input type="text" name="userName"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td&密码:&/td&
&&& &&&&&&&& &td&&input type="password" name="password"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td colspan="2"&
&&& &&&&&&&&&&&& &input type="submit" value=" 确定 "/&
&&& &&&&&&&& &/td&
&&& &&&& &/tr&
&&& &/table&
&&& &/form&
regist.jsp
&%@ page language="java" pageEncoding="UTF-8"%&
&&& &title&用户注册页面&/title&
&&&h2&用户注册&/h2&
&&& &form action="manage/userOpt!regist.action" method="post"&
&&& &table border="1"&
&&& &&&& &tr&
&&& &&&&&&&& &td&用户名:&/td&
&&& &&&&&&&& &td&&input type="text" name="userName"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td&密码:&/td&
&&& &&&&&&&& &td&&input type="password" name="password"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td colspan="2"&
&&& &&&&&&&&&&&& &input type="submit" value=" 注册 "/&
&&& &&&&&&&& &/td&
&&& &&&& &/tr&
&&& &/table&
&&& &/form&
4.运行结果:
3.2.为Action配置method属性:
将Action类中的每一个处理方法都定义成一个逻辑Action方法。
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &package name="my" extends="struts-default" namespace="/manage"&
&&&&&&& &action name="userLogin" class="org.qiujy.web.struts2.action.LoginAction" method="login"&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&&&&&& &action name="userRegist" class="org.qiujy.web.struts2.action.LoginAction" method="regist"&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
如上,把LoginAction中的login和regist方法都配置成逻辑Action。要调用login方法,则相应的把index.jsp中表单元素的action设置为"manage/userLogin.action";要调用regist方法,把regist.jsp中表单元素的action设置为"manage/userRegist.action"。
3.3.使用通配符映射(wildcard mappings)方式:
在struts.xml文件中配置&action&&元素时,它的name、class、method属性都可支持通配符,这种通配符的方式是另一种形式的动态方法调用。
当我们使用通配符定义Action的name属性时,相当于用一个元素action定义了多个逻辑Action:
&action name="user_*"
class="org.qiujy.web.struts2.action.UserAction" method="{1}"&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
如上,&action name=&user_*&&定义一系列请求URL是user_*.action模式的逻辑Action。同时method属性值为一个表达式{1},表示它的值是name属性值中第一个*的值。例如:用户请求URL为user_login.action时,将调用到UserAction类的login方法;用户请求URL为user_regist.action时,将调用到UserAction类的regist方法。
4.处理结果
Struts2的Action处理完用户请求后,将返回一个普通字符串,整个普通字符串就是一个逻辑视图名。Struts2通过配置逻辑视图名和物理视图资源之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把对应的物理视图资源呈现给浏览者。
4.1.配置处理结果:
Struts2的Action处理用户请求结束后,返回一个普通字符串-逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图资源的映射,才可让系统转到实际的视图资源。
Struts2通过在struts.xml文件中使用&result &/&元素来配置结果。Struts2提供了两种结果。
l&局部结果:将&result &/&作为&action &&元素的子元素配置。
l&全局结果:将&result &/&作为&global-results &&元素的子元素配置。
在package元素中配置&global-results&子元素:
&global-results&
&&result name="error"&/Error.jsp&/result&
&&result name="invalid.token"&/Error.jsp&/result&
&&result name="login" type="redirect-action"&Logon!input&/result&
&/global-results&
4.2.处理结果类型:
Struts2提供了对不同种类返回结果的支持,常见的有JSP,FreeMarker,Velocity等。
Struts2支持的不同类型的返回结果为:
用来处理Action链
dispatcher
用来转向页面,通常处理JSP,这是默认的结果类型
freeMarker
处理FreeMarker模板
httpHeader
用来控制特殊的Http行为
重定向到一个URL
redirect-action
重定向到一个Action
向浏览器发送InputSream对象,通常用来处理文件下载
处理Velocity模板
处理XML/XLST模板
显示原始文件内容,例如文件源代码
结合Tile使用
另外第三方的Result类型还包括JasperReports Plugin,专门用来处理JasperReport类型的报表输出;Jfreechart Plugin;JSF Plugin。
4.3.动态返回结果
有些时候,只有当Action执行完毕的时候我们才知道要返回哪个结果,这个时候我们可以在Action内部定义一个属性,这个属性用来存储Action执行完毕之后的result值,例如:
private String nextA
public String getNextAction() {
&&& return nextA
在strutx.xml配置文件中,我们可以使用${nextAction}来引用到Action中的属性,通过${nextAction}表示的内容来动态的返回结果,例如:
&action name="fragment" class="FragmentAction"&
&&result name="next" type="redirect-action"&${nextAction}&/result&
上述Action的execute方法返回next的时候,还需要根据nextAction的属性来判断具体定位到哪个Action。
5.属性驱动和模型驱动
不管属性驱动还是模型驱动,Struts2框架都是通过拦截器负责提取请求参数,并将请求数据封装到相应的Action实例的属性或专门的模型的属性。
5.1.属性驱动:
属性驱动就是属性(property)作为贯穿MVC流程的信息携带者。简单的说,就是使用Action实例来封装请求参数和处理结果信息。前面我们做的示例都属于属性驱动模式。
5.2.模型驱动:
模型驱动就是使用单独的javaBean作为贯穿整个MVC流程的信息携带者。也就是说,使用单独的VO(值对象)来封装请求参数和处理结果信息。
示例:继续修改用户登录验证:
1.新增一用户域模型对象:User.java
package org.qiujy.
publicclass User {
&&& private String userName;
&&& private String password;
&&& &*@returntheuserName
&&& public String getUserName() {
&&&&&&& returnuserName;
&&& &*@paramuserNametheuserNametoset
&&& publicvoid setUserName(String userName) {
&&&&&&& this.userName = userN
&&& &*@returnthepassword
&&& public String getPassword() {
&&&&&&& returnpassword;
&&& &*@parampasswordthepasswordtoset
&&& publicvoid setPassword(String password) {
&&&&&&& this.password =
2.业务控制器:UserAction.java
package org.qiujy.web.struts2.
import org.qiujy.domain.U
import com.opensymphony.xwork2.ActionC
import com.opensymphony.xwork2.ActionS
publicclass UserAction extends ActionSupport{
&&& //定义用于封装请求参数的模型对象
&&& private User user = new User();
&&& private String msg; //结果信息属性
&&& &*@returntheuser
&&& public User getUser() {
&&&&&&& returnuser;
&&& &*@paramusertheusertoset
&&& publicvoid setUser(User user) {
&&&&&&& this.user =
&&& &*@returnthemsg
&&& public String getMsg() {
&&&&&&& returnmsg;
&&& &*@parammsgthemsgtoset
&&& publicvoid setMsg(String msg) {
&&&&&&& this.msg =
&&& &*处理用户请求的login()方法
&&& &*@return结果导航字符串
&&& &*@throwsException
&&& public String login() throws Exception{
&&&&&&& String userName = user.getUserName();
&&&&&&& String password = user.getPassword();
&&&&&&& if("test".equals(userName) && "test".equals(password)){
&&&&&&&&&&& msg = "登录成功,欢迎" + userN
&&&&&&&&&&& //获取ActionContext实例,通过它来访问Servlet API
&&&&&&&&&&& ActionContext context = ActionContext.getContext();
&&&&&&&&&&& //看session中是否已经存放了用户名,如果存放了:说明已经登录了;否则说明是第一次登录成功
&&&&&&&&&&& if(null != context.getSession().get("uName")){
&&&&&&&&&&&&&&& msg = userName + ":你已经登录过了!!!";
&&&&&&&&&&& }else{
&&&&&&&&&&&&&&& context.getSession().put("uName", userName);
&&&&&&&&&&& }
&&&&&&&&&&&
&&&&&&&&&&& returnthis.SUCCESS;
&&&&&&& }else{
&&&&&&&&&&& msg = "登录失败,用户名或密码错";
&&&&&&&&&&& returnthis.ERROR;
&&& public String regist() throws Exception{
&&&&&&& //将用户名,密码添加到数据库中
&&&&&&& //...
&&&&&&& msg = "注册成功。";
&&&&&&& returnthis.SUCCESS;
3.配置文件:struts.xml
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &package name="my" extends="struts-default" namespace="/manage"&
&&&&&&& &action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
&%@ page language="java" pageEncoding="UTF-8"%&
&&& &title&用户登录页面&/title&
&&&h2&用户入口&/h2&
&&& &form action="manage/userOpt!login.action" method="post"&
&&& &table border="1"&
&&& &&&& &tr&
&&& &&&&&&&& &td&用户名:&/td&
&&& &&&&&&&& &td&&input type="text" name="user.userName"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td&密码:&/td&
&&& &&&& &td&&input type="password" name="user.password"/&&/td&
&&& &&&& &/tr&
&&& &&&& &tr&
&&& &&&&&&&& &td colspan="2"&
&&& &&&&&&&&&&&& &input type="submit" value=" 确定 "/&
&&& &&&&&&&& &/td&
&&& &&&& &/tr&
&&& &/table&
&&& &/form&
其它页面略。
5.运行效果:同以前一样。
6.源代码:
6.Struts2的异常处理机制:
任何成熟的MVC框架都应该提供成就的异常处理机制。Strut2也不例外。Struts2提供了一种声明式的异常处理方式。Struts2也是通过配置的拦截器来实现异常处理机制的。
Struts2的异常处理机制通过在struts.xml文件中配置&exception-mapping &&元素完成的,配置该元素时,需要指定两个属性:
exception:此属性指定该异常映射所设置的异常类型。
result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。
6.1.异常映射也分为两种:
l&局部异常映射:&exception-mapping&&元素作为&action&&元素的子元素配置。
l&全局异常映射:&exception-mapping&&元素作为&global-exception-mappings&元素的子元素配置。
6.2.输出异常信息:
使用Struts2的标签来输出异常信息:
l&&s:property value="exception.message"/& : 输出异常对象本身。
l&&s:property value="exceptionStack"/& : 输出异常堆栈信息。
6.3.示例:
还是修改用户登录示例:
1)把UserAciton.java中的regist方法改成:
public String regist() throws Exception{
&&&&&&& //将用户名,密码添加到数据库中
&&&&&&& //...
&&&&&&& //msg = "注册成功。";
&&&&&&& if(true){
&&&&&&&&&& throw new java.sql.SQLException("没有数据库驱动程序");
&&&&&&& return this.SUCCESS;
2)修改struts.xml文件:
&!DOCTYPE PUBLIC
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&&& &package name="my" extends="struts-default" namespace="/manage"&
&&&&&&& &!-- 定义全局处理结果 --&
&&&&&&& &global-results&
&&&&&&& &!-- 逻辑名为sql的结果,映射到/exception.jsp页面 --&
&&&&&&& &result name="sql"&/exception.jsp&/result&
&&&&&&& &/global-results&
&&&&&&& &global-exception-mappings&
&&&&&&& &!-- 当Action抛出SQLException异常时,转入名为sql的结果 --&
&&&&&&& &exception-mapping exception="java.sql.SQLException"&result="sql"/&
&&&&&&& &/global-exception-mappings&
&&&&&&& &action name="userOpt" class="org.qiujy.web.struts2.action.UserAction"&
&&&&&&&&&&& &result name="success"&/success.jsp&/result&
&&&&&&&&&&& &result name="error"&/error.jsp&/result&
&&&&&&& &/action&
&&& &/package&
3)新增一页面:exception.jsp
&%@ page language="java" pageEncoding="utf-8"%&
&%@ taglib uri="/struts-tags" prefix="s" %&
&&& &title&异常信息&/title&
&出现异常啦
&& &h3 style="color:red"&
&& &!-- 获得异常对象 --&
&&& &s:property value="exception.message"/&
&&& &!-- 异常堆栈信息 --&
&&& &s:property value="exceptionStack"/&
4)运行regist.jsp进行调试:
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:450671次
积分:5652
积分:5652
排名:第2200名
原创:152篇
转载:102篇
评论:153条
(15)(4)(10)(6)(1)(5)(8)(4)(5)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(2)(11)(5)(3)(4)(9)(4)(6)(5)(11)(3)(2)(15)(9)(11)(7)(5)(1)(7)(3)(3)(5)(8)(9)(3)(2)(6)(1)(10)(1)(5)(2)(5)(2)(2)}

我要回帖

更多关于 struts1 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信