① 使用validate()校验失败时,返回哪个逻辑视图?
答:返回input逻辑视图。
② 如何将字段校验错误信息显示出来?
答:使用addFieldError(String,String)方法,第一个是字段名字,第二个是错误信息。
③ 如何使用命名空间?
答:
为什么要用命名空间呢?
因为不同模块(包)里可能会有名字一样的动作类,它们的包名并不能在访问的时候区分它们。localhost:8080/虚拟目录(项目名) /login.action如果没有命名空间,假如有两个login.action服务器就不知道要访问哪一个了。
命名空间加在哪里,怎么使用呢?
加在struts.xml的package标签的属性namespace里,如下图,访问路径
localhost:8080/虚拟目录(项目名/命名空间/login.action。
<package name="lab02" extends="struts-default" namespace="/action">
<action name="login" class="com.ljs.lab2.action.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="login">/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
然后视图里的表单里也要加命名空间,这是struts2的表单,不是html的表单,struts的表单要使用标签库,也只有struts2的表单才可以使用namespace属性
然后这个属性值要和package标签里的namespace属性值一样(你想把这个提交给这个包下的动作类去操作的话),这样表单才能提交到指定的动作类。如下图:
<body>
<s:form action="login" namespace="/action">
<s:textfield name="name" label="用户名"/>
<s:password name="password" label="密码"/>
<s:submit value="登录"/>
</s:form>
</body>
课后思考:
1、在struts-xml里声明action的时候,为什么要有package呢?老师说:因为一个项目里可能会有很多动作类,这些action会分成很多模块model,每一个模块就可以建立一个包来区分,所以在struts.xml中就可以用package标签来区分,然后继承struts-default,里面有很多功能,我也不知道继承有什么用下次问下老师。
然后部署到服务器的时候,
访问是localhost:8080/虚拟目录(项目名)/login.jsp,因为这些jsp视图都是在Webroot根目录下,所以访问的路径不用命名空间。
2、还有一个就是动作类里的execute()和validate()里执行顺序,这两个都是ActionSupport里的方法。可以在index.html里找到。服务器会默认调用动作类里的execute(),不管这个动作类有没有继承ActionSupport,但是如果这个动作类里有validate(),服务器就会先执行validate(),如果validate()里的逻辑被执行,它就不会执行execute(),不符合validate()它就还是执行execute()。但是validate()没有返回值,可是动作类一个要返回一个视图。所以它是默认返回input视图。所以在struts.xml还要加一个input返回视图结果。
3、如果我们在web项目里加struts包,使用user library是行不通的,会报核心控制器找不到或者出错。只能在WEB-INF下的lib把包复制进去或者configure
Bulid path一个一个包导进去。反正就是不能用自己的库。这是2014版本的myeclipse所不支持的,老版本可以。但是spring和hibernate可以