最近刚学习了Struts2,作为一个菜鸟,下面简单整理一下Struts2的基础知识。
一、Action
Action在我看来就是一个动作,这个动作类每个属性必须有一个get和一个set方法,属性命名遵循JavaBean命名规则。其次动作类必须有一个不带任何参数的构造器。如果Action中没有定义构造器,那么编译器会自动增加一个不带参数的构造器,但是如果我们定义了一个构造器,那么我们必须保证要有一个不带参数的构造器
。 每个动作类至少有一个方法供Struts2在执行该动作时调用。
1.实现action的方法
(1)普通类实现action,只需要有一个无参数构造方法,以及public String execute(){}方法。
(2)实现com.opensymphony.xwork2.Action接口,同时这个接口定义了一个execute的方法。
(3)通过继承ActionSuppor类来实现,这个类其实也实现了action接口,除此之外还实现了一下接口
com.opensymphony.xwork2.Validateable:提供validate()方法来为Action增加验证的功能
com.opensymphony.xwork2.Validateaware:提供方法来保存和恢复action或field级的错误信息
com.opensymphony.xwork2.TextProvider:提供获取本地信息文本的功能
com.opensymphony.xwork2.LocaleProvider:提供getLocale()方法来获取本地消息。
2.动态调动
(1)在struts2的配置文件中在,
<action name="TagsAction" class="cmm.so.action.TagsAction" <span style="color:#FF0000;">method=""></span>
<pre name="code" class="java">在method中加上要调用的方法即可。
(2)动态调动,actionName!method,即调用的action的名字后面加<span style="color:#FF0000;">“!”</span>,再加上要调用的方法名。
3.通配符
<action name="*_*" class="com.neusoft.method.{1}Action" method="{2}">
<result name="{2}">/{1}_{2}.jsp</result>
</action>
使用要“约定优于配置”,必须要先约定好命名规范,{1}代表第几个*号
4.接受参数的的方法
(1)使用Action属性接受参数
在action中定义与请求参数同名的属性,struts2便自动接收请求参数并赋予给同名属性
public class ParamAction extends ActionSupport{
private String username;
public String getUsername() {
return username; }
public void setUsername(String username) {//struts2通过反射技术调用与请求参//数同名的属性的setter方法来获取请求参数值
this.username = username;}
public String execute()
{System.out.println("username:"+username);
return SUCCESS;
}}
(2)使用DomainModel接收参数
在前台jsp页面中必须使用"对象.属性“来命名,在action中只需定义该对象,并生成set,get
public class ParamAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}public void setUser(User user) {
this.user = user;
}
public String execute()
{
System.out.println("username:"+user.getUsername());
return SUCCESS;}}
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
(3)使用ModelDriver<T>接收参数
ModelDriven接口只有一个方法
public Object getModel(){
returnnull;
}
该方法返回一个用于接收用户输入数据的对象模型,在这个模型对象中的属性可以直接通过(属性名)userName来访问
但是必须要
private User user=new User();new出这个对象来
5.访问web元素。
Struts2中访问web元素有四种方法,两种与servlet api解耦的,两种与servlet api耦合。
解耦的、Map类型:
(1)通过ActionContext来访问Map类型的request、session、application对象
public class AttributeAction extends ActionSupport{
private Map<String,Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
public AttributeAction()
{
request=(Map<String,Object>)ActionContext.getContext().get("request");
session=ActionContext.getContext().getSession();
application=ActionContext.getContext().getApplication();
}
public String execute()
{
request.put("req", “req");
session.put("ses", “ses");
application.put("app", “app");
return SUCCESS;
}}
(2)通过实现RequestAware、SessionAware、ApplicationAware接口来访问Map类型的request、session、application对象(IoC方式-控制反转)
public class StudentAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
public StudentAction(){
request=(Map<String, Object>) ActionContext.getContext().get("request");
session=ActionContext.getContext().getSession();
application =ActionContext.getContext().getApplication();
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
private String pwd;
public String add(){
System.out.println("name"+name);
System.out.println("pwd"+pwd);
request.put("r", "r");
session.put("s", "s");
application.put("a", "a");
return SUCCESS;
}
public String delete(){
System.out.println("delete");
return SUCCESS;
}
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request=request;
}
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session=session;
}
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application=application;
}
}
耦合的、真实类型(httpxxxx类型):
(1)通过ServletActionContext来访问Servlet API类型的HttpServletRequest、 HttpSession、 ServletContext对象(依赖于Servlet API 方式)
public class AttributeAction extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public AttributeAction()
{
request=ServletActionContext.getRequest();
session=request.getSession();
application=session.getServletContext();
}
public String execute()
{
request.put("req", “req");
session.put("ses", “ses");
application.put("app", “app");
return SUCCESS;
}}
(2)通过实现ServletRequestAware接口来访问Servlet API类型的HttpServletRequest、 HttpSession、 ServletContext对象(IoC方式)
public class AttributeAction4 extends ActionSupport implements ServletRequestAware{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public void setServletRequest(HttpServletRequest request) {
session=request.getSession();
application=session.getServletContext();
}
public String execute()
{
request.setAttribute("req", "aaa3");
session.setAttribute("ses", "bbb3");
application.setAttribute("app", "ccc3");
return SUCCESS;
}
6.包含文件配置
每个模块一个struts配置文件,使用<include file=“”/>导入其他配置文件即可。
命名规则一般建议如下:
<include file="xxx\xxxxxx\struts-user.xml" />
7.默认action
如果访问一个不存在的action,就会默认的访问<default-action-ref>标签中name属性定义的action,此处为名称为index的action。
<default-action-ref name="index" />放在package的第一行。
8.常见的常量
<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->
<constant name="struts.action.extension" value="do"/>
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!– 与spring集成时,指定由spring负责action对象的创建 -->
<constant name="struts.objectFactory" value="spring" />
<!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。-->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--上传文件的大小限制-->
<constant name="struts.multipart.maxSize" value=“10701096"/>
9.Action中result的转发类型
chain:处理action链,跳转到下一个action
redirectAction:重定向到一个action
redirect:重定向到一个URL
dispatcher:转发到Jsp。。。。。。。。。。。。。。。。类似于forward
httpheader:控制特殊http行为
stream:向浏览器发送InputStream对象
FreeMarker:跳转到模板文件
velocity:处理velocity模板
xslt:处理xml/xlst
plaintext:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码 的时候,我们可以使用此类型。
如果重定向或者转发的action在别的命名空间下:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</result>
在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:
<package name="param" namespace="/param" extends="struts-default">
<action name="param" class="com.neusoft.global.ParamAction">
<result>/param.jsp?age=${age}</result>
</action>
</package>
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package ....>
<global-results>
<result name=”success”>/main.jsp</result>
</global-results>
</package>