您的位置:首页 > 编程语言 > Java开发

struts2_1学习笔记

2013-07-30 14:34 204 查看
1. struts.xml文件要copy到src目录下

2. 对struts.xml进行配置,加上<constant name="struts.devMode" value="true" />
意思是开发模式,这样更改配置文件后不用重新启动apache server。默认是false。

3. myeclipse window -> preferences -> catalog -> add 
uri = http://struts.apache.org/dtds/struts-2.3.dtd location 在本地的structs中找apps -> WEB_INF -> lib -> struts_core ->dtd文件

4. struts: browser -> tomcat -> filter -> *.jsp 
请求经过中转再得到视图,把请求和结果分开;

5. namespace 如果设为“”,或者不写,这样只要url地址中出现了action的名字,就能执行。
namespace要以/开头;namespace为空的话,只要url中出现了这个action的名字就会被处理。
namespace为空,能够包含其它namespace处理不了的action;

6. 更改默认的jsp编码: windows -> preferences -> 搜JSP -> 改编码

补充: Struts1只提供一个action类,Struts2每次访问一个action就new一个对象出来;
action后面没有配置class的话,默认是ActionSupport.class
(ActionSupport.class实现了Action.class接口,里面有excute()方法)

7. 一个普通的java类,包含一个public String execute()方法,就能被当成一个action;
或者也可以implements Action,重写execute()方法;或者implements ActionSupport

7.1 我们一般只用implements ActionSupport这种方法;

8. 每次访问一个action时都会new 出一个action对象。 

9. action后面如果不指定class,则会执行默认的ActionSupport类;

10. struts2 发出请求统一使用绝对路径,要取到当前的context 路径作为前缀;
在jsp页面上加上,新建jsp的时候一般会自己生成啦~
<% String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

在<head>标签内部加上:<base href="<%=basePath%>">这样就直接写根目录下的相对路径就行了;

11.Action执行的时候并不一定要执行execute方法,可以在struts.xml配置文件中配置Action的时候用method=""来指定执行哪个方法, 也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=context %>/user/userAdd">添加用户</a>
<br />
<a href="<%=context %>/user/user!add">添加用户</a>
<br />
前者会产生太多的action,/user是一个package,也是一个namespace,里面有一个userAdd的action,如果有userDelete,userUpdate等,就要写多个对应的action,用第二种DMI比较好,只要一个user的Action,里面写要用到的方法就ok了,调用的时候用一个!隔开就行~

12.用通配符来配置:

<package name="Student" namespace="/" extends="struts-default">
<action name="*_*" class="{1}Action" method="{2}">

            <result>

                /jsps/{1}_{2}_success.jsp

            </result>

        </action>
</package> {1}代表第一个星号对应的字符串,{2}代表第二个星号对应的字符串,以此类推。比如调用的时候:

<a href="Student_add">添加学生</a>

    <a href="Student_delete">删除学生</a><br>

    <a href="Teacher_add">添加老师</a>

    <a href="Teacher_delete">删除老师</a><br> {1}代表"Student",{2}代表"add","delete",这样只要约定得好,配置文件就可以写得特别简单,叫"约定优于配置",Action的名字,方法的名字都按规定写,这样就不用去改配置文件!

13.使用action属性接收参数<a href="user/user!add?name=a&age=8">添加用户</a> 在链接地址上直接输入参数&参数,这样是直接把参数传到action的属性当中;

14.用域模型接收参数:<a href="User_add!add?user.name=aaa&user.age=21">添加用户</a>,UserAction类中有一个User类的实体user,作为一个域模型接收action传来的参数:

public class UserAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}

public String add(){
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}

}

但是这样其实存在一个问题,就是传过去的参数跟user对象的属性不一定完全配对,比如缺少或者多出一些属性,这时候就要用到所谓的DTO(Data Transfer Object),比如上面的例子,新建一个UserDTO类,确保能完全接受action传来的参数,然后再根据DTO的实体来构造出一个User对象。

15.jsp页面,表单传中文的时候,method尽量用post,在struts.xml中加入这句话<constant name="struts.i18n.encoding" value="GBK" /> 就能解决中文乱码问题!

另外,做实验的时候发现,如果用post方式传参数的话,要注意:如果是用domain model接收参数的话,比如有个user model,则传参数的时候应该用user.name 和 user.age

<form action="User_add!add" method="post">

    姓名:<input type="text" name="user.name" />

    年龄:<input type="text" name="user.age" />

    <input type="submit" name="添加" />

    </form> 

16.配置文件中,一个namespace不能对应多个package!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Struts