struts2学习细节

Action

1.struts.xml中加入<constant name="struts.devMode" value="true" />

       value设置成true,应用struts开发模式,每次修改struts.xml就不用重启服务器了。

 

2.查看struts的源码。

Referenced Librariesàstruts2-core-2.3.15.jar右键—>Propertiesàjava source attachmentàExternal Folderà路径选:文件夹目录/struts-2.3.15/src/core/src/main/java

 

3.myeclipse附加上strutsjavadoc

Referenced Librariesàstruts2-core-2.3.15.jar右键—>PropertiesàJavadoc Locationà路径选:文件夹目录/ struts-2.3.15/docs/struts2-core/apidocs

 

4.namespace命名空间

namespace决定了action的访问路径,默认为"",可以接收所有路径的action

namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action/xxx/index.action,或者/xxx/yyy/index.action.

namespace最好也用模块来进行命名

 

5.新引入项目的时候,解决jre system library不匹配的问题

jre system library右键build path—remove from build path。项目名右键build path—configure build path—》选library标签add library—》选jre system library—finish

 

6.Action

具体视图的返回可以由用户自己定义的Action来决定

具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容

具体Action的实现可以是一个普通的java类,里面有public String execute方法即可

或者实现Action接口

不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法

Srtucts.xml中的配置:

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

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

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

        </action>

</package>

 

7.path路径问题

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 href=”<%=basePath%>”/>

 

8.ActionMethod调用

    Action执行的时候并不一定要执行execute方法

可以在配置文件中配置Action的时候用method=来指定执行哪个方法

也可以在url地址中动态指定(动态方法调用DMI)(推荐)

    <a href="<%=context %>/user/userAdd">添加用户

    <a href="<%=context %>/user/user!add">添加用户(推荐)

前者会产生太多的action,所以不推荐使用

public class UserAction extends ActionSupport {

        public String add() {

            return SUCCESS;

        }

}

 

9.通配符设置

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

    Index.jsp:

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

<a href="<%=context %>/actions/Teacher_delete">删除老师</a>

Struts.xml:

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

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

       </action>

   TeacherAction.java:

       public String add() {

           return SUCCESS;

       }

       public String delete() {

           return SUCCESS;

       }

 

10.Action接受参数三种方法:

    1)使用Action属性接收参数:

     <a href=”user/user!add?name=xiao”>添加用户

     UserAction.java:

   public class UserAction extends ActionSupport {

   private String name;

   public String add() {

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

       return SUCCESS;

   }

   public String getName() {

       return name;

   }

   public void setName(String name) {

       this.name = name;

   }

}

Java类必须包含getset方法,struts会自动帮助填充。

2Domain Model方法

       使用Domain Model接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a>

User.java

package com.bjsxt.struts2.user.model;

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;

              }

}

UserAction.java

public class UserAction extends ActionSupport {

              private User user;

              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)Model Driven(不常用)

使用Model Driven接收参数<a href="user/user!add?user.name=a&user.age=8">添加用户</a>

UserAction.java

public class UserAction extends ActionSupport implements ModelDriven<User>{

  

   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;

   }

  

}

11.struts2的中文问题

    Struts.xml中加入<constant name="struts.i18n.encoding" value="GBK" /> <!-- i       18n=internationalization -->

web.xml中把

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

换成    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 

12.简单的数据校验

Struts.xml:

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

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

            <result>/user_add_success.jsp</result>

            <result name="error">/user_add_error.jsp</result>

        </action>

</package>

UserAction.java

public class UserAction extends ActionSupport {

              private String name;

      

              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;

              }

 

              public String getName() {

                     return name;

              }

 

              public void setName(String name) {

                     this.name = name;

              }

}

User_add_error.jsp:

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

    <s:fielderror fieldName="name" theme="simple"/>(有自动的格式,不太好用。)

       <br />

       <s:property value="errors.name[0]"/>(常用,取出值栈的值)

       <s:debug></s:debug>

 

13.struts2访问Web元素

IoCInversion of Control控制反转

<form name="f" action="" method="post">

用户名:<input type="text" name="name"/>

密码:<input type="text" name="password"/>

<br />

<input type="button" value="submit2"       οnclick="javascript:document.f.action='login/login2';
       document.f.submit();" />

</form>

LoginAction.java:

*继承SessionAware接口

*重写public void setSession(Map<String, Object> session) ;方法

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;

       }    

}

14.struts2模块包含

Struts.xml:

<struts>

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

           <include file="login.xml" />

</struts>

Login.xml:书写方式和struts.xml一样,只是为了分模块开发方便。

 

15.默认Action

敲不存在的地址或者错误地址,默认跳转到name=index的网页。

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

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

           <action name="index">

                  <result>/default.jsp</result>

           </action>

 </package>

results

16.Results类型

<li><a href="r/r1">dispatcher</a></li>(默认)服务器跳转,地址栏不变

       <li><a href="r/r2">redirect</a></li>客户端跳转,地址栏变化,显示jsp地址...../r2.jsp

Action跳转:

       <li><a href="r/r3">chain</a></li>    forward方式访问Action,地址栏显示.../r/r3

       <li><a href="r/r4">redirectAction</a></li>  地址栏显示..../r2.jsp

Struts.xml:

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

           <action name="r1">

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

           </action>

          

           <action name="r2">

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

           </action>

          

           <action name="r3">

                  <result type="chain">r1</result>// *r1前不要加/,如果Action在另外包中,则查文档

           </action>

          

           <action name="r4">

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

           </action>   

</package>

 

17.results全局结果集

<ol>

              <li><a href="user/user?type=1">返回success</a></li>

              <li><a href="user/user?type=2">返回error</a></li>

              <li><a href="user/user?type=3">返回global result</a></li>

              <li><a href="admin/admin">admin,继承user</a></li>

</ol>

Struts.xml

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

           <global-results>

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

           </global-results>

           配置的全局结果集在一个package里可以通用。

           <action name="index">

                  <result>/index.jsp</result>

           </action>

          

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

                  <result>/user_success.jsp</result>

                  <result name="error">/user_error.jsp</result>

           </action>    

    </package>

    如果想用另一个package中的global-reasults,需要extends那个package的包名。

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

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

                         <result>/admin.jsp</result>

                  </action>

           </package>

UserAction.java

public class UserAction extends ActionSupport {

       private int type;

       public int getType() {

              return type;

       }

       public void setType(int type) {

              this.type = type;

       }

       @Override

       public String execute() throws Exception {

              if(type == 1) return "success";

              else if (type == 2) return "error";

              else return "mainpage";

       }

}

 

18.动态结果集

*一定不要忘了为动态结果的保存值设置set get方法

<ol>

       <li><a href="user/user?type=1">返回success</a></li>

       <li><a href="user/user?type=2">返回error</a></li>

</ol>

Struts.xml:

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

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

                  <result>${r}</result>

           </action>    

</package>

UserAction.java:

public class UserAction extends ActionSupport {

       private int type;     

       private String r;

       public String getR() {

              return r;

       }

       public void setR(String r) {

              this.r = r;

       }

       public int getType() {

              return type;

       }

       public void setType(int type) {

              this.type = type;

       }

       @Override

       public String execute() throws Exception {

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

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

              return "success";

       }

}

 

19.带参数的结果集

Redirect方式才需要传参数,forward方式不需要。

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

Struts.xml

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

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

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

           </action>    

</package>

UserAction.java

public class UserAction extends ActionSupport {

              private int type;     

              public int getType() {

                     return type;

              }

              public void setType(int type) {

                     this.type = type;

              }

              public String execute() throws Exception {

                     return "success";

              }

}

User_Success.jsp:

from valuestack: <s:property value="t"/><br/>

       from actioncontext: <s:property value="#parameters.t"/>

只能从ActionContext中取,在valuestack中没有对应的值,不是用一个request对象。   只是传递了参数的值。

<s:debug></s:debug>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值