struts2 学习笔记(未完待续)

来源:互联网 发布:忘不了脑营养 知乎 编辑:程序博客网 时间:2024/05/01 19:31
1、在strut2下的apps中有strut2-blank项目,可以拷贝里面的jar包以及   配置文件
2、<constant name="struts.devMode" value="true"/>定义开发模式的   目的是:修改配置文件后不用重新启动服务器。
3、在myeclipse中显示项目的物理结构:window->show view-   >General->Navigator(航海家,领航员)
4、使用自己的jres的设置方法:preferences->java->Installed Jres
5、用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter(但是可能会有中文乱码,这是strut2的一个bug),用以前的拦截器就没有乱码。
6、在myeclipse中查看源码:在jar中右键properties->java source   attachment->external folder(文件夹)->E:/java资料/struts-  2.3.4.1/src/core/src/main/java
7、关联文档:在jar中右键properties->javadoc location ->(设置好后按F1就可以查看相关的文档了)
8、如果新建项目的话最好拷贝以前的存在的项目,这样就不用重新配置了   。
9、在不联网的情况下,设置struts中xml自动提示:首先将strut2-  core-2.3.4.1.jar解压;window->preferences->xml catalog-  >add:location中为:解压文件strut-2.3.dtd;keyType:URI;   Key:http://struts.apache.org/dtds/struts-2.3.dtd
10、如果result没有写name属性,action没有class属性也可以,例如:
   <action name="hello">   
   <result>/a.jsp</result>
   </action>
   输入hello后就会跳到a.jsp
   解析:struts2默认会执行ActionSupport的的execute()方法,而且execute()默认返回SUCCESS。


11、项目做好以后(没有启动服务器),右击->debug as->myeclipse    server application->tomcat 6.x
12、<result name="success">success可以省略,即如果没有name属性的   话,就是默认success。
13、namespace=""时,访问路径/任意/任意/.../任意/action的名字,作   用是:如果在其他namespace中没有找到action的话就可以在   namespace=""的package包中找。


14、在preference中修改jsp的默认编码:files and editors-   >jsp:Encoding改为:chinese,national Standard
15、struts1中,很多客户端共享一个action对象,得做很好的线程同步控制;而strut2每次访问action的时候都会new一个action,所以不会发生线程同步的问题。
16、从xwork的api文档或者xwork的源代码(可以下载)可以看出:action接口有ERROR,INPUT,LOGIN,SUCCESS,NONE静态常量,static final String SUCCESS="success";而且actionsupport类实现了action接口,所以无论是实现了action接口还是继承了actionsupport类,都可以直接使用这些静态常量。因为ActionSupport类有很多方法(比如:execute()),所以实际开发都继承ActionSupport类。


17、如果直接在地址栏输入.../项目名/:则去配置文件找namespace="/"的package,如果没有响应的package,这会交给tomcat去处理(web.xml),找到默认的欢迎页面。
18、最好实用绝对路径!
19、路径问题
   因为action存在命名空间的问题,所以action和jsp之间,不同命名空间之间action之间的跳转容易出现路径不对的问题。
   例如:namespace="path"的action跳转到根路径下的a.jsp,在a.jsp中有<a href="b.jsp">tesgt</a>虽然a.jsp和b.jsp都在根目录下,但是此时点击超链接并不能跳到b.jsp中去!因为此时相当于.../path/a.action跳到.../b.jsp。这样会发生错误!
   解决办法:用绝对路径,<a href="<%=request.geContextPath()%>/b.jsp">test</a>
            用绝对路径<a href="<%=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"%>b.jsp">
            用myeclipse中jsp提供的标签<base href="<%=basePath%>">,这样就不用前两个绝对路径了(因为页面所有的链接会默认加上basPath),这样就可以随心所欲得            使用相对或者绝对路径了。
20、 动态方法调用
    <action name="user" class="user.action.UserAction">
   </action>
    不用写method属性的情况下,用user!add访问add()方法,用 user!delete访问delete()方法!
21、使用通配符可以使配置降到最低.例如:
   <action name="*_*" class="action.{1}Action" method="{2}">
    <result>/{1}_{2}_success.jsp</result>
   </action>
22、如果有多个匹配的action,则应该匹配精确的那个,但是如果都有*的话(*个数可以不相等),则应该匹配前边的那个。
23、关于action用属性接收参数
    可以自动类型转换,不用全部写能String类型的。
    属性名可以随便起,但是set和get方法的名字必须和接收参数的名字一致。
24、用domainModel接收参数
   在action里,
   private User user;
   set、get方法;
   传参数的时候用user.name&user.sex等。
   但是传递的参数中User中没有相应的属性的话(比如重复输入确认密码),此方法就不可以用了。此时,可以用VO或者DTO来接收,和domainModel大体相似,里面定义各种接   收参数,在action接收并处理以后可以再把其中的属性值再次包装到User的实体类中。
25、用ModelDriven接收参数(不常用)
    public class UserAction implements ModelDriven<User>{
  
    private User user=new User();
    public User getModel(){
return user;
}


public String add(){


System.out.println(user.getName());
}
}
26、上边的三种接收参数的方法中,domainModel最常用。
27、配置文件的配置常量可以在org.apache.struts2包的   default.properties中找到。
28、struts-tags.tld在META-INF下
29、仔细复习19、20课的"简单数据验证"视频。
30、关于一个form可以有多个aciton请复习  Struts2_1200_AccessWebElements
31、仔细复习Struts2_1200_AccessWebElements,理解ActionContext(即 Stack Context)
32、仔细复习视频21、22
33、仔细复习视频23关于模块包含:<include file="struts11.xml"/>
34、关于默认action详见视频24
35、dispatcher:服务器跳转到jsp
    redirect  :客户端跳转到jsp
    chain     :服务器跳转到action
    redirectAction:客户端跳转到action
36、关于chain跳转到别的包里的action的方法见视频29
37、关于Global_result和extends的作用见:视频30
38、action里的属性值都在值栈里。
39、一次request一个值栈,所以服务器跳转共用一个值栈,所以多个action之间服务器跳转可以公用一个值栈。可以用<s:debug/>查看。见视频32
40、在<result>中,只有客户端跳转才需要传递参数,${}表达式取的是值栈里的值。
41、每次访问action都会new一个action(实例化),所以可以在构造方法里写点东西。
42、user.xxx只有传,才会构造,想初始化domain.model可以自己new,也可以传参数值,但这时需要保持参数为空的构造方法。
43、访问值栈里对象的普通方法、访问值栈里action的普通方法、访问静态方法、静态属性、Math的方法、普通类的构造方法见:视频39
44、访问集合见:视频40
45、投影(过滤)见:视频41
46、[]访问值栈的action,见视频42,如果chain的话,多个action的属性a一样的话,<s:property value="a"/>则值是最后访问的那个action的a的值;<s:property value="[0].a"/>是最后访问的那个action的a的值,<s:property value="[1].a"/>是倒数第二个访问的那个action的a的值,<s:property value="[2].a"/>是倒数第三个访问的那个action的a的值;总之:[]会从上往下(从值栈的角度看)找满足条件的第一个。
47、property标签
                            property: <s:property value="username"/> 
property 取值为字符串: <s:property value="'username'"/>结果为username
 property 设定默认值: <s:property value="admin" default="管理员"/>如果没有admin的话,就会显示"管理员"
  property 设定HTML: <s:property value="'<hr/>'" escape="false"/>如果为false,则会显示html效果(一条线),如果为true,显示为"<hr/>",默认                为true。
48、<s:set/>
   根据文档id,name已经不建议使用,用var。默认的scope是actionContext(即stackContext),见视频45
49、<s:bean>见视频46、47.自习的看。
50、<s:include>会出现乱码问题,尽量少用。
51、"%{x}"的作用是将x当做ognl表达式来处理,而不是把x当做字符串处理。视频48
52、<s:property>中value的值就是ognl表达式;而<s:inlude>中的value就是String类型的,如果要使用ognl表达式则必须用%{x}将x作为ognl表达式来处理。
53、让提示速度加快的方法:java-》editor-》content assist的anto     activation delay的值设置小点。
54、parameters见视频50
55、iterator、map、list见视频51
56、theme见视频52,除了<s:fielderror>需要特殊处理外(修改配置文件或者修改css等等),其他的ui标签加上theme="simple"(默认是xhtml)就行了或者修改    struts.ui.theme=xhtml。(可以查看源代码)


57、设计约定(编码规定)
    a)原则:简单就是美
    b)库名:项目名
    c)表明:_Model名
    d)字段:保持和属性名一致(注意和数据库的冲突)
    e)用层划分包:com.zhujiaxing.bbs.action
                                      model(bean)
                                      service
                                      dto(vo)
    f)Action :XXXAction
    g)配置文件:*_*
    h)namespace:/ ,/admin(后台登陆)等等
    i)配置文件中的package:比如:action,adminAction
如果你是项目的组长,需要写约定文档或者直接给组员一个项目模板,要求他们命名规范根据模板来就行了。
58、