分享
 
 
 

Struts源码研究 - Action-Input属性篇

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

初学Struts,写了一个很简单的应用,主要功能和页面如下:

1、首页显示一个“添加新用户”的链接,点击该链接出发一个forward动作,页面导向到添加用户的jsp页面

2、添加用户的jsp页面中,可供用户输入“用户名”和“用户描述”两项

3、用户输入完毕,将做输入数据合法性检查,检查通过,将输入信息保存进入文件(使用了Properties类),然后返回首页;检查失败返回添加用户页面

4、数据合法性检查分成两块,第一部分检查条件使用Struts的Validator,检查条件配置在Validator.XML中;第二部分检查放在ActionForm中,

检查失败将错误信息置入ActionErrors中,然后返回到添加用户的页面并显示错误信息。

JSP页面、ActionForm和Action类的代码书写都参照了struts-example应用,所以这里代码不再列举,请看附件中的代码包这里值得一提的是,在开发过程中,碰到了一个小问题,正是由于该问题,才导致查看Struts源码,刨根问底的查找错误原因的过程该错误发生在Struts的配置文件中,首先将错误的配置文件列出如下:

<?xml version="1.0" encoding="ISO-8859-1" ?

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"

<struts-config

<!-- ======================================== Form Bean Definitions --

<form-beans

<form-bean

name="CreateUserForm"

type="com.zchome.CreateUserForm"/

</form-beans

<!-- ================================= Global Exception Definitions --

<global-exceptions

</global-exceptions

<!-- =================================== Global Forward Definitions --

<global-forwards

<!-- Default forward to "Welcome" action --

<!-- Demonstrates using index.jsp to forward --

<forward name="welcome" path="/Welcome.do"/

</global-forwards

<!-- =================================== Action Mapping Definitions --

<action-mappings

<!-- Default "Welcome" action --

<!-- Forwards to Welcome.jsp --

<action

path="/Welcome"

type="org.apache.struts.actions.ForwardAction"

parameter="/jsp/Welcome.jsp"/

<action path="/createuserpage" forward="/jsp/createuser.jsp"

</action

<action

path="/docreateuser"

type="com.zchome.CreateUserAction"

name="CreateUserForm"

scope="request"

input="createuser"

<forward name="createusersUCcess" path="/jsp/Welcome.jsp"/

<forward name="createuser" path="/jsp/createuser.jsp"/

</action

</action-mappings

<!-- ===================================== Controller Configuration --

<controller

<set-property property="processorClass" value="org.apache.struts.tiles.TilesRequestProcessor"/

</controller

<!-- ================================ Message Resources Definitions --

<message-resources parameter="resources.application"/

<!-- ======================================= Plug Ins Configuration --

<!-- ========== Tiles plugin =================== --

<!-- --

<!--

This plugin initialize Tiles definition factory. This later can takes some

parameters eXPlained here after. The plugin first read parameters from web.xml, then

overload them with parameters defined here. All parameters are optional.

The plugin should be declared in each struts-config file.

- definitions-config: (optional)

Specify configuration file names. There can be several comma

separated file names (default: ?? )

- moduleAware: (optional - struts1.1)

Specify if the Tiles definition factory is module aware. If true (default),

there will be one factory for each Struts module.

If false, there will be one common factory for all module. In this later case,

it is still needed to declare one plugin per module. The factory will be

initialized with parameters found in the first initialized plugin (generally the

one associated with the default module).

true : One factory per module. (default)

false : one single shared factory for all modules

- definitions-parser-validate: (optional)

Specify if xml parser should validate the Tiles configuration file.

true : validate. DTD should be specified in file header. (default)

false : no validation

Paths found in Tiles definitions are relative to the main context.

--

<!-- comment following if struts1.0.x --

<plug-in className="org.apache.struts.tiles.TilesPlugin"

<set-property property="definitions-config"

value="/WEB-INF/tiles-defs.xml" /

<set-property property="moduleAware" value="true" /

<set-property property="definitions-parser-validate" value="true" /

</plug-in

<!-- end comment if struts1.0.x --

<plug-in className="org.apache.struts.validator.ValidatorPlugIn"

<set-property

property="pathnames"

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/

</plug-in

</struts-config

首先描述一下系统的出错背景:

1、从首页点击链接来到添加用户的页面 正常

2、在添加用户页面中输入Vlidator.xml文件中定义的错误数据,弹出javascript对话框,提示出错 正常

3、在添加用户页面中输入合法数据,数据保存进入文件并重定向到首页 正常

4、在添加用户页面中输入ActionForm中定义的非法数据,系统应返回到添加用户的页面 出错!!!

OK,来着重看这个添加动作的定义,如下:

<action

path="/docreateuser"

type="com.zchome.CreateUserAction"

name="CreateUserForm"

scope="request"

input="createuser"

<forward name="createusersuccess" path="/jsp/Welcome.jsp"/

<forward name="createuser" path="/jsp/createuser.jsp"/

</action

从以上的定义可以看出,假如Validate验证出错,Struts应该为我们重定向到input域所定义的uri,即/jsp/createuser.jsp

看起来应该没有问题,再来看看出错信息,如下:

Java.lang.IllegalArgumentException: Path createuser does not start with a "/" character

at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:1179)

at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:174)

at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1062)

at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:274)

at org.apache.struts.action.RequestProcessor.internalModuleRelativeForward(RequestProcessor.java:1012)

at org.apache.struts.tiles.TilesRequestProcessor.internalModuleRelativeForward(TilesRequestProcessor.java:345)

at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:980)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:255)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

出错信息清楚的说明,“createuser”这个path应该以“/”字符开头

为定位这个错误,从以上错误信息,开始打开Struts的源码RequestProcessor.java进行研究,首先来到这一段:

public class RequestProcessor {

protected boolean processValidate(H

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有