打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
struts 2 配置方法及其技巧实例整理(一)

struts 2环境的配置:

把struts.xml文件拷贝到项目的src目录下:

              STRUTS_HOME/apps/struts2-blank-2.1.6/WEB-INF/src/java/struts.xml  

       把相关jar文件拷贝到项目中:

              STRUTS_HOME /apps/struts2-blank-2.1.6/WEB-INF/lib 目录下的相关jar文件

       配置web.xml文件:

              可以从

              STRUTS_HOME /apps/struts2-blank-2.1.6/WEB-INF/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>

 

    实现最简单的的struts文件配置:

<!—配置struts常量,设置为开发模式-->

     <constant name="struts.devMode" value="true" />

     <package name="default" namespace="/" extends="struts-default">

       

        <action name="hell">

            <result>

                /Hello.jsp

            </result>

        </action>

</package>

    设置struts标签的自动提示功能:

       在MyEclipse Enterprise Workbench-->Files and Editors-->XML-->XML Catalog-->Add...添加文档,选择

\STRUTS_HOME\struts-2.1.6\lib\struts2-core-2.1.6\struts-2.0.dtd 文件,Key Type选择URI,Key上填写:

http://struts.apache.org/dtds/struts-2.0.dtd"

 

 

Namespace 命名空间:

    <package name="front" extends="struts-default" namespace="/front">

    如果namespace不写,则相当于:namespace=””;

 

 

Action:

    三种创建方法:

public class IndexAction1 {

    public String execute() {

       return "success";

    }

}

//只要有execute方法,返回了字符串,就可以被strut2认为是action

 

public class IndexAction2 implements Action {

    @Override

    public String execute() {

       return "success";

    }

}

 

public class IndexAction3 extends ActionSupport {

    @Override

    public String execute() {

       return "success";

    }

}

//一般使用第三种方法,

struts配置文件:

        <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">

            <result name="success">/ActionIntroduction.jsp</result>

        </action>

 

 

Path路径问题:

JSP中的“/”代表的是服务器的跟路径,而不是网站的根路径,struts中不允许出现“//”两个斜杠,一般使用绝对路径:

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

<base href="<%=basePath%>" />

 

 

ActionMethod_DMI动态方法:

        <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">

    可以使用method属性显式调用add方法;

    也可以在url地址中动态指定执行的方法(action名!方法名):

    .../user!add

    推荐使用动态指定的方式  

 

 

ActionMethod_通配符配置:

使用通配符,将配置量降到最低,不过一定要遵守“约定优于配置”的原则。

        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">

            <result>/Student{1}_success.jsp</result>

        </action>

访问方法:       

<a href="<%=context %>/actions/Studentadd">添加学生</a>

 

 

        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">

            <result>/{1}_{2}_success.jsp</result>

            <!-- {0}_success.jsp -->

        </action>

访问方法:

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

注意:如果在同一个package中,有一个请求符合两个action的配置,会默认匹配第一个。

 

 

用Action的属性接收参数:

URL访问:.../user/user!add?name=a&age=1

要在action中获取参数,需要添加两个属性,并加上getter和setter方法:

    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;

    }

 

DomainModel接收参数:

URL访问:.../user/user!add?user.name=a&user.age=1

private User user;

    //private UserDTO userDTO;

    public String add() {

       System.out.println("name=" + user.getName());

       System.out.println("age=" + user.getAge());

 

 

用ModelDriven接收参数:

实现ModelDriven接口

import com.opensymphony.xwork2.ModelDriven;

public class UserAction extends ActionSupport implements ModelDriven<User>{

//重新方法 

@Override

    public User getModel() {

       return user;

    }

ModelDriven自动调用getModel()方法获取user对象

比较常用的是用DomainModel接收参数

 

 

2.1.6版本的中文问题:

<constant name="struts.i18n.encoding" value="GBK" />

在struts.xml文件中配置上面国际化属性为GBK使之支持中文

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

解决不了乱码问题,应该使用下面的filter:        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 

 

简单数据验证:

    Action:

    public String add() {

       if(name == null || !name.equals("admin")) {

           this.addFieldError("name", "name is error");

           this.addFieldError("name", "name is too long");

           return ERROR;

       }

       return SUCCESS;

    }

    JSP:

    使用struts的标签库:

    <%@taglib uri="/struts-tags" prefix="s" %>

    <s:fielderror fieldName="name" theme="simple"/>

    <br />

    <s:property value="errors.name[0]"/>

    <s:debug></s:debug>

 

 

访问Web元素:

在Action中取得request的方法:

Map类型:

    Action:

    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:(两种访问方法)

        <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />

    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />

    <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />

public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {

    private Map<String, Object> request;

    private Map<String, Object> session;

    private Map<String, Object> application;

 

    public String execute() {

       request.put("r1", "r1");

       session.put("s1", "s1");

       application.put("a1", "a1");

       return SUCCESS;

    }

原始类型:

    private HttpServletRequest request;

    private HttpSession session;

    private ServletContext application;

    public LoginAction3() {

       request = ServletActionContext.getRequest();

       session = request.getSession();

       application = session.getServletContext();

    }

    JSP:

    <s:property value="#attr.a1"/><br />

    <s:property value="#attr.s1"/><br />

    <s:property value="#attr.r1"/><br />

 

 

模块包含:

    <include file="login.xml" />

 

 

默认Action:

    <default-action-ref name="index"></default-action-ref>

    <action name="index">

        <result>/default.jsp</result>

    </action>

 

 

结果类型_result_type:

        <action name="r1">

        <result type="dispatcher">/r1.jsp</result>

        </action>

       //dispatcher服务器跳转到页面中取

        <action name="r2">

        <result type="redirect">/r2.jsp</result>

        </action>

       //重定向到页面中

        <action name="r3">

        <result type="chain">r1</result>

        </action>

       //forward到另外一个action

        <action name="r4">

        <result type="redirectAction">r2</result>

        </action>

       重定向到另外一个action

       

       

Global_Results_全局结果集:

    <package name="user" namespace="/user" extends="struts-default">

   <global-results>

        <result name="mainpage">/main.jsp</result>

     </global-results>

    ...

</package>

 

    <package name="admin" namespace="/admin" extends="user">

    <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">

        <result>/admin.jsp</result>

    </action>

    </package>

 

 

动态结果集_dynamic_result:

    Action:

    public String execute() throws Exception {

       if(type == 1) r="/user_success.jsp";

       else if (type == 2) r="/user_error.jsp";

       return "success";

    }

    struts.xml:

        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">

         <result>${r}</result>

        </action>

    <!--${},OGNL表达式,表示从值栈中取值-->

 

 

带参数的结果集:

    Action:

private int type;

   

    public int getType() {

       return type;

    }

 

    public void setType(int type) {

       this.type = type;

    }

    struts.xml:

        <result type="redirect">/user_success.jsp?t=${type}</result>

    JSP:

    在URL中指定type的值:

    <a href="user/user?type=1">传参数</a>

 

 

OGNL表达式:

       <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>

       <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>

//如果user是struts创建,需要保存空的构造方法;

       <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>

       <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>

       <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>

       <li>访问值栈中action的普通方法:<s:property value="m()" /></li>

       <hr />

//访问静态方法需要配置一下常量:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>

       <li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>

       <li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>

       <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>

       <hr />

       <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>

       <hr />

       <li>访问List:<s:property value="users"/></li>

       <li>访问List中某个元素:<s:property value="users[1]"/></li>

       <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>

//{}在ognl代表一个集合

       <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>

       <li>访问Set:<s:property value="dogs"/></li>

       <li>访问Set中某个元素:<s:property value="dogs[1]"/></li>

// dogs[1]取不出来,因为set元素没有顺序

       <li>访问Map:<s:property value="dogMap"/></li>

       <li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>

       <li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>

       <li>访问Map中所有的value:<s:property value="dogMap.values"/></li>

       <li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>

       <hr />

       <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>

//?代表选择符合条件的所有元素

       <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>

//^代表这些元素中的第一个

       <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>

//^代表这些元素中的最后一个

       <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>

       <hr />

       <li>[]:<s:property value="[0].username"/></li>

//[]表示访问值栈中相对应位置的对象,[0]表示栈顶元素,一般为最近访问的Action

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
structs - 标签库(html)
Struts 1.x | <html> 标签库 - ray - JavaEye技术网站
欢迎光临 - 琳婕小筑-老猫的理想 - Struts配置说明 -
Struts2 ONGL表达式
Struts2学习自我总结
Struts标签
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服