struts2学习的第二天。
在写action标签的时候,我们可以自己加上class标签,指向我们自己项目包中的类文件,并且集成ActionSupport类,重写execute方法。这时候我们就可以根据返回的值跳转到不同的页面。但是我们也可以不加class标签,这样程序就会默认到ActionSupport的execute中执行,默认返回"SUCCESS"值。action也不一定非要执行execute()方法才可以,也可以指定方法执行,可以添加method=“方法名” ,指定执行的方法,当然这也做也是比较繁琐的,那么struts2也提供了一个相对比较方便的方法,就是动态方法调用,这个方法好像在struts2的2.3版本以上就不推荐使用了,需要在struts.xml中加上
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
才可以使用,例如:user!add ,意思就是调用某个actionz中的add方法,如果想调用delete方法,则改成user!delete即可,也就是是说在当前action中动态调用某个方法。无class标签 :
<package name="default" namespace="/" extends="struts-default">
<action name="testStruts1">
<result>
/test.jsp
</result>
</action>
</package>
有class标签:
<package name="front" namespace="/user" extends="struts-default">
<action name="userList" class="xin.itfactory.user.UserListAction">
<result name="success">
/userList.jsp
</result>
</action>
</package>
下面自己来总结下这个demo的执行顺序,用户向浏览器发送请求,tomcat接收到请求后,查看看看是否具有相对应的项目,如果有对应的项目,会执行项目中的web.xml文件的StrutsPrepareAndExecuteFIlter过滤器的doFilter()方法,doFilter()会根据请求的namespace和action在struts.xml文件中查看,看看是否具有相对应的,如果查找到了对应的namespace和action,如果此action没有class标签则会执行到ActionSupport,如果有class标签,则会new一个新的对象(解决了线程同步的问题,也是与struts1的不同之处,struts1是不会new出新对象),最后返回结果值。
还有就是在jsp页面中的页面跳转,struts2中的路径问题是根据action的路径而不是根据jspl路径来确定,所以尽量不要使用相对路径,虽然可以用redirect方式解决。解决方法非常简单,同意使用绝对路径。在jsp中用
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
获取项目的全路径,或者指定basePath
<base href="<%= basePath%>"/>
还要如何解决一个jsp页面的中文编码乱码问题,可以直接修改pageEncoding为UTF-8,也可以直接在windows----preferences---File and Editors---jsp---encoding修改为UTF-8就可以了。