struts2马士兵笔记

来源:互联网 发布:控油祛痘的洗面奶知乎 编辑:程序博客网 时间:2024/05/16 14:22

转载: http://blog.csdn.net/chenggil10/article/details/5965806#_Toc250472632

目录
01 Struts2-Action
一、 Struts作用:
二、 搭建Struts2的运行环境:
三、 Namespace
四、 标签
五、 Action
六、 路径问题的说明
七、 Action的动态调用方法
八、 Action通配符(wildcard)的配置
九、 Action的属性接收参数
1、 在Action添加成员属性接受参数
2、 域模型(Domain Model)
3、 ModelDriven接收参数
十、 Action属性接收参数中文问题
十一、 简单数据验证
十二、 访问Web元素
一、 方法一:ActionContext方式
二、 方式二:Ioc(控制反转)—推荐使用
三、 方式三:获取原类型
四、 方式四:获取原类型-控制反转
十三、 Struts2配置文件模块化包含(include)
十四、 默认的Action
十五、 Action总结
02 Struts2-Result
一、 Result类型 (type)
二、 全局结果集(Globle Result)
三、 动态的结果集(dynamic result)
四、 带参数的结果集
五、 Result总结
六、 项目经理:
03 OGNL表达式语言
04 Struts2-Tags
Struts2标签目录
一、 property标签
二、 set标签
三、 bean标签
四、 标签-少使用
五、 If elseif else
六、 Iterator标签
七、 Theme
05设计约定(编码规定)
06 项目开发顺序
07 声明式异常处理
08 国际化
一、 国际化资源文件
二、 Java国际化
三、 Struts2国际化
1、 Action级别
2、 Package级别
3、 Application级别
四、 资源文件中的参数处理
五、 国际化-动态语言切换
09 自定义拦截器
10 类型转换
Struts2总结

目录
Ø Action
n 简单数据校验
Ø Result
Ø 常用配置文件
Ø OGNL & ValueStack
Ø Tags
Ø ———————Project
n 类型转换、上传与下载、interceptor、防止重复提交
Ø MVC思想深入剖析
Ø 源码解读
Ø 其他话题

01 Struts2-Action
一、Struts作用:
将请求与结果分开
二、搭建Struts2的运行环境:
1、建立Web项目;
2、建立Struts2的配置文件(struts.xml);
将Struts2的空项目中的配置文件(struts.xml)复制到项目的src目录下。
配置如下:

<!--  namespace :对应与项目名称后面的"/"(例如Struts2_0100_Introduction后面的"/")    (http://localhost:8080/Struts2_0100_Introduction/)  --><package name="default" namespace="/" extends="struts-default">    <action name="hello">        <result>            /hello.jsp        </result>    </action>


3、复制Struts2相应的jar包及第三方包。
将空项目中lib目录中的除junit和spring-test之外的所有文件复制到项目的WebRoot/WEB-INF/lib目录下
4、修改对应的web.xml,建立struts2的filter(参考struts自带的项目),添加如下配置:

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

<filter-mapping>    <filter-name>struts2</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>

三、Namespace
Namespace决定了action的访问路径,默认为“”,可以接收所有路径的action,如果没有找到相应的namespace时,则使用namespace为空的action
Namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action、/xxx/index.action、或者/xxx/yyy/index.action.
Namespace最好也用模块来进行命名。
namespace :对应与项目名称后面的”/”(例如Struts2_0100_Introduction后面的”/”)
(http://localhost:8080/Struts2_0100_Introduction/)

四、标签
是用来解决重名的问题,例如当系统的前台和后台都有一个action名叫hello,这时就需要用package来区分。 前台后台
struts2中的package与java的package是相同的作用的。
五、Action
具体视图的返回可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容,有三种手段:



/ActionIntroduction.jsp


注:标签中的class属性是表示action的对应的类(这个类是一个普通Java类),当访问这个action时会创建这个类成为一个对象,然后执行这个对象中的execute方法()(execute方法返回类型为String)。
第一种:Action 普通Java类
public class IndexAction1 {
public String execute() {
return “success”;
}
}
当标签中class属性省略时,则默认执行com.opensymphony.xwork2.ActionSupport类中的execute方法,而这个方法返回一个字符串常量SUCCESS(常量值为:”success”).

第二种:Action 实现com.opensymphony.xwork2.Action接口,这个接口中定义了一些常量和一个execute方法,我们重写execute()方法就可以了。
import com.opensymphony.xwork2.Action;
public class IndexAction2 implements Action {
@Override
public String execute() {
//return “success”;
return this.SUCCESS; //SUCCESS常量值为:”success”
}
}

第三种:Action 继承com.opensymphony.xwork2.ActionSupport类,而这个类又实现了com.opensymphony.xwork2.Action接口,我们重写execute()方法就可以了。

import com.opensymphony.xwork2.ActionSupport;
public class IndexAction3 extends ActionSupport {
@Override
public String execute() {
//return “success”;
return this.SUCCESS;//SUCCESS常量值为:”success”
}
}
注:第三种Action是我们需要使用的方式,因为这个类不担实现了com.opensymphony.xwork2.Action接口,更重要的是它已经帮我封装了许多其它有用的方法。

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

还有另一种方式,就是在标签中,指定标签值,这样就使用统一绝对路径。
<%
String path = request.getContextPath();//
String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
%>

” />
…………
注:标签:当前页面中所有连接都会在前面加上base地址。
七、Action的动态调用方法
Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法:
1、 方法一(通过methed属性指定执行方法):
可以在配置文件中配置Action的时候用method=来指定执行哪个方法

/user_add_success.jsp

这样,只要在action的对象中有一个add的方法,并且返回类型为String就可以了。如果没有method属性,则默认执行execute()方法。
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
2、 动态方法调用DMI(推荐)
可以在url地址中动态指定action执行那个方法。Url地址如下:
http://localhost:8080/Struts2_0500_ActionMethod/user/user!add
方法:action + ! + 方法名
注:只要Action对象中有这个方法,并且返回类型为String就可以调用。
这样Struts.xml配置文件中不需要配置methed属性。代码如下:

/user_add_success.jsp

Action类:
public class UserAction extends ActionSupport {
public String add() {
return SUCCESS;
}
}
总结:推荐使用第二种动态方法调用DMI,因为第一种需要大量的Action配置,后者可以在url中动态指定执行action中哪个方法。
八、Action通配符(wildcard)的配置
使用通配符,将配置量降到最低, 不过,一定要遵守”约定优于配置”的原则
1、 通配符
星号(*) 表示所有
{数字} 表示第几个通配符
例如:Student* 那么{1}代表第一个星号(*)
_ 那么{1}代表第一个星号() ,{2}代表第二个星号()
2、 实例


/Student{1}_success.jsp

    <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">        <result>/{1}_{2}_success.jsp</result>        <!-- {0}_success.jsp -->    </action>


解释:第一个Action的名称为name=”Student*” method=”{1}”,表示所有Action以Student开始的都会执行这个Action,并且执行Student后字符为方法名的方法,例如:访问的Action为Studentadd,会执行这个Action(Student*),并且执行add的方法.因为{1}在这里代表add,并且返回/Studentadd_success.jsp页面。
第二个Action的名称name=”_” method=”{2}” class=”…action.{1}Action” 表示所有Action中包含下划线(“_”)都会执行这个Action,例如:Teacher_add,那么会执行这个Action,并且Action对应的类为TeacherAction,且执行Action中的add方法,返回结果页面为/Teacher_add_success.jsp,因为在这里的{1}表示Teacher,{2}表示add
3、 匹配顺序
当匹配的Action有两个以上时,则会按匹配精确度高的那个Action,当有个相同的匹配精确度时,则按先后顺序进行。

九、Action的属性接收参数
Action中三种传递并接受参数:
1、 在Action添加成员属性接受参数
例如请求的URL地址:
http://localhost:8080/Struts2_0700_ActionAttrParamInput/user/user!add?name=a&age=8
其中传递了两个参数:name和age,其值分别为:a、8,此Action执行的是add()方法。
那我们只要在user这个Action对象中添加这两个成员属性并生成set、get方法。
public class UserAction extends ActionSupport {

private String name;private int age;public String add() {   System.out.println("name=" + name);   System.out.println("age=" + age);   return SUCCESS;}public String getName() {   return name;}public void setName(String name) {   this.name = name;}public int getAge() {   return age;}public void setAge(int age) {   this.age = age;}  

}
2、 域模型(Domain Model)
就是利用对象域来进行传递和接受参数
例如请求的URL地址:
http://localhost:8080/Struts2_0800_DomainModelParamInput/user/user!add?user.name=a&user.age=8
其中,访问的是namespace=”/user” action的name=”user” Action所执行的方法method=”add”
利用对象域user来传递参数,为对象的属性赋值(user.name=a user.age=8)
注:需要一个对象user 并且这个对象需要有两个成员属性,且具有get、set方法。
然后在Action中添加一个User对象的成员属性。并且有get、set方法,就可以了。
//User对象
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

//Action类

public class UserAction extends ActionSupport {
private User user;
//private UserDTO userDTO;
public String add() {
System.out.println(“name=” + user.getName());
System.out.println(“age=” + user.getAge());
return SUCCESS;
}

public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
3、 ModelDriven接收参数
使Action实现com.opensymphony.xwork2.ModelDriven(在实现接口时需要使用泛型,否则使用时需要转型)中利用其getModel()方法返回对象模型,从而获得传入的参数。
例如URL如下:
http://localhost:8080/Struts2_0900_ModelDrivenParamInput/user/user!add?name=a&age=8
其:访问的是namespace=”/user” action的name=”user” Action所执行的方法method=”add”,其传入了两个参数:name=a,age=8。
参数被传入至Action后,会被ModelDriven对象根据参数名自动赋值给User对象相应的属性而生成User对象,并且由getModel()返回。那么我们在Action中就可以利用这个对象了。
注意:传入的参数名需要与对象模型中的成员属性一致。
对象模型User:
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Action对象
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven{
private User user = new User();
public String add() {
System.out.println(“name=” + user.getName());
System.out.println(“age=” + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
} }
十、Action属性接收参数中文问题
如果表单提交数据中有中文时,尽量使用post方式。
需要在Struts.xml配置文件中加入一个常量配置,如下:





/user_add_success.jsp



但是,在Struts2 2.7之前,这个配置无效,需要其它方法设置。如下:
手动在web.xml中在Struts过滤器之前配置一个过滤器用于解决中文的问题。
十一、 简单数据验证
使用addFieldError方法和s:fieldError标签简单处理数据校验
场景:对一个用户名进行验证,如果用户名不合法,则显示给客户端查看信息。
URL请求地址:
http://localhost:8080/Struts2_1100_SimpleDataValiation/user/user!add?name=a 
分析:访问的Struts2配置,namespace=”/user” action的name=”user” Action所执行的方法method=”add”并且传入了一个参数name=a.如下:


/user_add_success.jsp
/user_add_error.jsp


根据配置文件可以得知action所对应的类为com.bjsxt.struts2.user.action.UserAction,并且具有两个结果集(success和error).代码如下:
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String name;
public String add() {
if(name == null || !name.equals(“admin”)) {
//addFieldError 添加错误信息,可以在客户端访问到。
this.addFieldError(“name”, “name is error”);
this.addFieldError(“name”, “name is too long”);
return ERROR;
}
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
根据Action类代码,可以看到Action是利用Action的成员属性(name)来接受参数值,并且使用this.addFieldError()方法添加错误信息,以便前台可以访问到。
this.addFieldError(name, errorMessage);
注:此方法是使用继承了ActionSupport父类的
name:可以是傻的属性名称,但一般建议使用哪个成员属性出题了,就用那个。当前是因为name没有通过验证,所以使用name
errorMessage:添加的信息

在客户端获取这些信息,如下:

User Add Error!






注:使用标题,需要使用<%@taglib>命令引用Struts2的标签库如下:
<%@taglib uri=”/struts-tags” prefix=”s” %>
1、标签:获取使用addFieldError()方法添加的信息。
FiledName:指定信息的名称。
Theme: 指定显示的主题。
注:使用此标签获取的错误信息,Struts强制添加了css的修饰。生成的HTML代码如下(不长用):

  • name is error
  • name is too long

Class=”errorMessage”是Struts2已经设置好的一个css了。这个方式不方便我们自定义样式。

2、:这是标签的写方式,会在页面上产生一个链接,点击后显示如下(Struts2生成的一些信息):
3、标签:获取值堆栈属性所对应的值。

注:value:指定值堆栈的属性名及数据下标等。
例如:value=”a” 获取Action类的成员属性a的值
Value=”errors” 获取errors属性的对象Map值
Value=”errors.name”获取errors属性的对象Map的key为name的value
Value=”errors.name[0] 获取errors属性的对象Map的key为name的value的第一个元素的值。
注:如果获取Action Context中的Key值,需要在前面加#(井号)
例如:
十二、 访问Web元素
取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
1. 前三者:依赖于容器
2. 前三者:IOC (只用这种)
3. 后三者:依赖于容器
4. 后三者:IOC
一、方法一:ActionContext方式
一般在Action类的构造方法、或execute()方法中获取。
public class LoginAction1 extends ActionSupport {

private Map request;private Map session;private Map application;public LoginAction1() {   request = (Map)ActionContext.getContext().get("request");   session = ActionContext.getContext().getSession();   application = ActionContext.getContext().getApplication();}public String execute() {   request.put("r1", "r1");   session.put("s1", "s1");   application.put("a1", "a1");   return SUCCESS;}

}
然后在Jsp页面中获取相关web元素。

User Login Success!


| <%=request.getAttribute(“r1”) %>

| <%=session.getAttribute(“s1”) %>

| <%=application.getAttribute(“a1”) %>











注:因为request、session、application对象Struts2将在放入到Action Context中,
因此需要使用#key来访问对象们。
后面的是java脚本代码的访问方式。
二、方式二:Ioc(控制反转)—推荐使用
让Action类实现RequestAware、SessionAware、ApplicationAware接口,然后重写他们的set方法(setRequest、setSession、setApplication),通过依赖注入、控制反转(原来自己控制,现在由别人来控制值。)
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map

0 0
原创粉丝点击