Struts2学习11-20

来源:互联网 发布:python urllib decode 编辑:程序博客网 时间:2024/06/05 20:21

(1)Struts1每次调用的action对象都是同一个(所有人访问的action对象都是同一个,需要做线程同步处理),而Struts2每次都new一个新对象(占内存)

(2)时序图


(3)action不添加类,则默认调用ActionSupport这个类,他在xwork这个jar包里

(4)result不写name="success",默认是“success”

(5)自己的action有三种方法:

1直接写,要有execute方法(execute忘写了就无法执行了)

2实现Action接口重新execute方法(实现接口无法继承方法)

3继承ActionSupport类,重新execute方法(一般都选这种方法,因为ActionSupport类已经封装了很多可以直接调用的方法)

(6)override:重写(覆盖),子类重写父类的方法

     overload重载,就是两个或两个以上方法名相同,但是参数个数或类型不同,比如一个类的多个构造方法

(7)路径问题:

1.比如你的访问路径是http://localhost:8080/Struts2_0100_Introduction/

而struts.xml里面没有一个package的namespace是/,则会根据web.xml里面<welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>定义跳转到相应页面

2.比如浏览器上url是http://localhost:8080/Struts2_0100_Introduction/,页面里有个超链接写的<a href="path/path.action">路径问题说明</a>,则点击超链接

访问的url是http://localhost:8080/Struts2_0100_Introduction/path/path.action

3struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
4虽然可以用redirect方式解决,但redirect方式并非必要。
5解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
6或者使用myeclipse经常用的,指定basePath 

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<head>
<base href="<%=basePath%>" />

</head>

或者不加base标签

在每个超链接钱加basePath :<a href="<%=basePath%>index.jsp">index.jsp</a>

7 DMI(DynamicMethodInvocation):

Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)

<package name="user" extends="struts-default" namespace="/user">
        <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
            <result>/user_add_success.jsp</result>
        </action>
        
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
            <result>/user_add_success.jsp</result>
        </action>
</package>


<a href="<%=context %>/user/userAdd">添加用户</a>
<br />
<a href="<%=context %>/user/user!add">添加用户</a>
<br />
前者会产生太多的action,所以不推荐使用

8 Wildcard通配符

他比DMI好,DMI不能动态改result指向的页面

<package name="actions" extends="struts-default" namespace="/actions">
        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>
        
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
            <!-- {0}_success.jsp -->
        </action>
</package>

如多个都匹配上,则越精确越优先,同等级的谁在前谁优先

约定优于配置

9 action接收参数:

url里面的参数和action里面的变量一一对应(需写好get,set方法)(其实变量名不一定要一样,但是set和get方法一定要一样,因为就是调用setget方法的),而且类型自动转

10Domain Model接收参数,aciton写的不是变量,而是对象如user,然后getuser,setuser,user是已存在的一个类

11 vo:value object do:data object

dto :data transfer object

比如user对象只有name,password两个参数,但是又多了一个确认密码参数,则要么不用domain modle,直接在aciton加3个变量,或者建个userdto对象,含三个属性,用domain model 接收,然后填充user对象

12 Model Driven接收参数(不常用),action实现ModelDriven<User>(用泛型,否则要强制转换)接口,调用getModel方法获得user,切user要自己new出来

13 Struts MVC:M,各种数据模型,V,各种jsp页面 c:action

14 传的是中文尽量用post,别去用get

struts.xml加这个

<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->

但是还是无法显示中文,这是struts2.1.6的bug2.1.6修复

可以在struts2的filter前再添个filter

或则改成2.0的filter

<filter>
        <filter-name>struts2</filter-name>
        <!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

15struts2的配置文件看可以参考官方文档,也可以看struts-core的jar包的default.properties

16简单数据校验

action里 this.addFiledError 返回信息给页面

jsp里<%@taglib uri="/struts-tags" prefix="s" %>

<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>(取value stack ,stack context里的值)
<s:debug></s:debug>(点击链接 查看value stack,stack context的值)

javaee5.0不必单独放tld,他能自动在jar包里找到

"errors.name[0]"为ognl表达式

0 0