Struts2初认识(1)

来源:互联网 发布:打谱软件overture4.0 编辑:程序博客网 时间:2024/04/27 21:00

最近刚学习了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.动态调动

  如果不表明调用action中的哪个方法,便会默认调用execute方法。指明具体调用action中哪个方法有两种方式

(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 stubthis.request=request;}public void setSession(Map<String, Object> session) {// TODO Auto-generated method stubthis.session=session;}public void setApplication(Map<String, Object> application) {// TODO Auto-generated method stubthis.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>




0 0
原创粉丝点击