Struts2基础知识

本文详细介绍Struts2框架的部署步骤,包括所需文件的复制、配置web.xml及struts.xml等关键环节,并深入讲解了Struts2如何接收参数、解决乱码问题以及如何从前台向后台传递参数的方法。

(1)      部署Struts2项目步骤
1.1       copy struts.xml文件到项目的src目录


1.2       copy 所需要的jar文件


1.3       配置web.xml文件

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
1.4       配置struts.xml文件

<package name="default" namespace="/" extends="struts-default">
<action name="hello">
                 <result>
                      /Hello.jsp
                  </result>
             </action>
</package>

Package与java中包的概念相似,一般情况下,namaspace的路径设置为与package一样。
如果namespace为空,则可以接受所有的请求。
Action中的name属性负责接受指定的请求;class属性,表示访问该name的请求时会转向指定的action;method属性表示调用的具体的方法。
(2)      Struts2接收参数的方法
       2.1  通过url地址里传递与action中属性名字相同的参数
参数的名字与action里面属性的名字一样,实质上是地址栏传递的参数应该与set和get方法后面的名字一样;
    2.2  使用Domain Model接收参数
例如:user.username=aaa&user.password=123456;

注意不要忘记写getUser()和setUser(User user)方法。但由于域模型的模型的属性往往比传递的参数要少(如注册时传递的参数往往有多一个密码确认的参数),因此使用的时候采用dto(data transform object),即创建一个UserDTO类,然后该类就可以包含模型中没有的参数,用UserDTO接收到相应的参数后,再生成需要的User对象;
    2.3  实现ModelDriven<>接口
如:public class UserAction extends ActionSupport implements

ModelDriven<User> {}

则此时的参数传递又可以采用第一种的方法了。
private UserInfo userInfo =  new UserInfo();

public UserInfo getModel() {

    return userInfo;

}

(3)  Struts2乱码问题的解决
首先,form表单的提交方式必须是post,然后在struts.xml文件中加入配置:<constant name="struts.i18n.encoding" value="GBK" />要注意的是struts2中的2.1.7之前的版本都有bug,这句话不能解决中文问题。
注意: form表单提交的时候都要尽量使用post方式,这样才能有效避免中文的乱码问题。
除此之外也可以使用Spring的filter进行配置
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>

org.springframework.web.filter.CharacterEncodingFilter

</filter-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>GBK</param-value>
       </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
(4)  Struts2中Action向前台传递参数
4.1 后台向前台传递错误信息
this.addFieldError(“name”, “name is error”);

一般情况下,name为属性名,可以为同一个错误名设置多个错误信息
this.addFieldError("name", "name is too long");
然后前台通过struts2标签读取错误信息。步骤如下:
首先添加调用标签库的语句:
<%@taglib uri="/struts-tags" prefix="s" %>

其中,uri指定标签库的位置,prefix指定前缀。
    然后通过filelderror标签读取:
           <s:fielderror fieldName="name" theme="simple"/>

    则页面显示为:.name is error  (后台指定的错误信息)上面语句的具体含义是取出的是名字为name的全部错误信息。
另外一种方法是通过读取debug里面的内容读取后台传递的信息
<s:debug></s:debug>

可以在页面展现debug标签[debug],其中有一项称为Value Stack Contents(值栈内容),主要用于放置action定义的属性,里面的内容是可以直接取出的。
然后用标签读取debug里面的内容
           <s:property value="errors.name[0]"/>

errors既包括了actionErrors和filedErrors,上面语句的含义是取出errors中名字为name的第一个错误信息。

4.2 取得Map类型的request、session、application来传递参数(有两种方式)
ü  方式一:
首先,在后台中设置传递的值
    import java.util.Map;

    import com.opensymphony.xwork2.ActionContext;

    private Map request;

    private Map session;
    private Map application;

    ……
    request = (Map)ActionContext.getContext().get("request");

    session = ActionContext.getContext().getSession();
    application = ActionContext.getContext().getApplication();
    ……           

    //设置具体的值
    request.put("r1", "r1");
    session.put("s1", "s1");
    application.put("a1", "a1");

    ……

    //实现三者的get、set方法(容易忽略)
    public Map getRequest() {
       return request;
    }
    public void setRequest(Map request) {
       this.request = request;
    }

    然后,前台可以通过标签和request、session、application的方式获取
       通过Struts2标签获取后台传递的值<br />
    <s:property value="#request.name" /><br/>
    <s:property value="#session.name" /><br/>
    <s:property value="#application.name" /><br/>
        通过request、session、application获取<br />
    <%=request.getAttribute("name") %><br/>
    <%=session.getAttribute("name") %><br/>
<%=application.getAttribute("name") %><br/>

注意:通过Struts2标签取值时,由于request、session、application都是Stack Context属性里面的值,必须通过格式“#request” + “属性名“才能取出。而放在了ActionContext中的属性则直接加#。
ü  方式二:
实现Struts2提供的3个接口:RequestAware、SessionAware、
ApplicationAware,然后实现对应的setRequest、setSession、setApplication方法,是取得request、session、application对象最常用的方法。实例:
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;
    //DI dependency injection依赖注入
    //IoC inverse of control控制反转
    public String execute() {
       request.put("r1", "r1");
       session.put("s1", "s1");
       application.put("a1", "a1");
       return SUCCESS;
    }
    @Override
    public void setRequest(Map<String, Object> request) {
       this.request = request;
    }
    @Override
    public void setSession(Map<String, Object> session) {
       this.session = session;
    }
    @Override
    public void setApplication(Map<String, Object> application) {
       this.application = application;
    }
}
4.3 而要取得真实的HttpServletRequest、HttpSession、ServletContext对象,可以采用下列的两种形式:
ü  形式一:
public class LoginAction3 extends ActionSupport {
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;
    public LoginAction3() {
       request = ServletActionContext.getRequest();
       session = request.getSession();
       application = session.getServletContext();
    }
    public String execute() {
       request.setAttribute("r1", "r1");
       session.setAttribute("s1", "s1");
       application.setAttribute("a1", "a1");
       return SUCCESS;
    }
}
ü  形式二:
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;
    public String execute() {
       request.setAttribute("r1", "r1");
       session.setAttribute("s1", "s1");
       application.setAttribute("a1", "a1");
       return SUCCESS;
    }
@Override
    public void setServletRequest(HttpServletRequest request) {
       this.request = request;
       this.session = request.getSession();
       this.application = session.getServletContext();
    }
}
4.4 通过在后台对参数添加get、set方法,即将其放进了Value Stack中,然后在前台通过调用<s:property value=”属性名”>标签获取
    特别需要知道的是:有时候需要在jsp的java语句中把property里的值赋给一个变量,直接写标签是不行的,而需要写成:
    (假设标签内容为:<s:property value=”user.username” />)

    <%String name = request.getAttribute(“user.username”);%>

(5)Struts2标签
5.1  通用标签
    5.1.1 property标签 – 常用于取后台的属性值以及后台中设置的值。
       <li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理  员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>//若设置为true,则直接把<hr />当作字符串输出。
此处涉及Struts ValueStack Debug,包含Value Stack Contents和Stack Context

其中Value Stack Contents可以直接拿出,在Stack Context中的内容则要添加#。
    5.1.2 set标签 – 常用于设置一个变量的值,如:将后台的值赋给一个变量。
       <li>set 设定adminName值(默认为request 和 ActionContext):

<s:set var="adminName" value="username" />

</li>
设定后的值默认会自动放到request和ActionContext中。      
       <li>set 从request取值:

<s:property value="#request.adminName" />

</li>
<li>set 从ActionContext取值:

<s:property value="#adminName" />

</li>
可以通过scope属性设定范围取值。
<li>set 设定范围:

<s:set name="adminPassword" value="password"scope="page"/>

</li>
<li>set 从相应范围(此处为page)取值:

 <%=pageContext.getAttribute("adminPassword") %>

</li>

<li>set 设定var,使其范围为ActionContext:

   <s:set var="adminPassword" value="password" scope="session"/>

</li>
<li>set 使用#取值: <s:property value="#adminPassword"/> </li>
<li>set 从相应范围取值:

<s:property value="#session.adminPassword"/>

</li>
注意:如果没有设置scope=”session”(即没有设置范围),那么在设置var后,adminPassword就会被放到ActionContext中,则表示可以加上#后直接取出,而设置了范围session后,struts2.1就只在session中才有了(2.0则仍然会放入ActionContext中),因此必须通过“#session.adminPassword”才能取出。
    5.1.3 bean标签 – 用于设置自己定义的类的属性值
       <li>bean 定义bean,并使用param来设定新的属性值:
           <s:bean name="com.bjsxt.struts2.tags.Dog" >
              <s:param name="name" value="'pp'"></s:param>
              <s:property value="name"/>
           </s:bean>
       </li>

 

       <li>bean 查看debug情况:
           <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
              <s:param name="name" value="'oudy'"></s:param>
           </s:bean>
           拿出值:
           <s:property value="#myDog.name"/>
       </li>
注意:没有使用var,则value的值在<s:bean>标签结束后就会从Value Stack Context中取走,因此当<s:bean>标签结束后就拿不到value的值了。只有使用了var,才能把value值放在ActionContext中,通过#便可取出。
    5.1.4 include标签(尽量少用)
    <li>include _include1.html 包含静态英文文件
       <s:include value="/_include1.html"></s:include>
    </li>
      
    <li>include _include2.html 包含静态中文文件
       <s:include value="/_include2.html"></s:include>
    </li>
      
    <li>include _include1.html 包含静态英文文件,说明%用法
       <s:set var="incPage" value="%{'/_include1.html'}" />
       <s:include value="%{#incPage}"></s:include>
    </li>

    5.1.5 fielderror标签
     5.2  控制标签
    5.2.1 if、else if、else标签,用于判断,从而表现出不同的结果
        <li>

        if elseif else:
       age = <s:property value="#parameters.age[0]" /> <br />
       <s:set var="age" value="#parameters.age[0]" />
       <s:if test="#age < 0">wrong age!</s:if>

       <s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>

       <s:else>yeah!</s:else><br />

       <s:if test="#parameters.aaa == null">null</s:if>
       </li>
     5.3  UI标签
     5.4  AJAX标签
     5.5  $*%区别


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/yilong7797/archive/2010/10/02/5919188.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值