zoukankan      html  css  js  c++  java
  • 初识Struts2

      今天来总结一下Struts2的知识点,学习编程我的思路一般是这样的:

        ① why ?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?)。

        ②what ? 这个技术是什么玩意?有什么牛逼的地方值得我们学习,这个技术的核心是什么。

        ③How ?  怎么学?基本技术都是自己自学的,我的学习思路就是,看视频,拿例子来学习知识,在敲代码的过程中理解问题。在此期间如果遇到不懂得或者是感觉很模糊的地方,及时的上网找相应的博客进行理解。基本上就是在敲代码中学习技术。并且对技术要及时的进行总结,但是我不推荐一个知识点总结一次,这样根本没有那么多的时间,最好的是看完之后,从全局出发,对整个知识进行积累和总结,在总结的过程中,多看一下其他人的博客,集思广益,收获会很大。

        ④Do !  做!做是什么?是理论到实践的必经之路,是你成为大牛的必经之路,找个项目,认真的做完,对一些常用的技巧和方法进行归纳整理,发布到自己的博客上,在做项目的时候,有很多的途径,我最喜欢 的是看视频了,只要你前面没偷懒,认真的学习了,在这个时候你就会发现都是so easy的事情。在做项目的时候,要注意的是,遇到不会的,或者是有新的理解一定要去探索,这样会知道的越来越多,同时为了防止遗忘,及时的对博客进行更新,或许你遇到的问题也可能是别人遇到的,这样你的人气值就上来了!

      比如对Struts2 的学习。其实大约一周前就学完了,但是懒癌犯了,懒得动,一直拖着没整理。因此提醒大家:当日事,当日毕!当日事,当日毕!当日事,当日毕!因为明天还有很多事情要做......

      在没有进行Struts2 的学习之前,我用jsp+Servlet+javaBean+mysql+Jdbc+(bootStrap/EasyUi/Layui)开发了5个说大不大说小不小的狗屁项目,那tm写的叫一个累啊......但是很爽啊,哈哈哈,因为要实现一个方法比如说分页,那基本上就可以从底干到顶,熟悉整个流程。印象很深的一个功能是文件上传和下载,如果使用Struts那简直简单的.....超级爽啊。但是没学这个之前,我tm累的和狗一样,还是学习了别人的博客,自己加以改造,成功实现了数据库mysql存文件名,服务器存储文件,对文件能够进行上传和下载。虽然累但是对这部分功能还是了解的比较好了。框架确实好,用起来很爽。但是我还是喜欢研究基础的东西,这样在学别的框架那就是轻车熟路了。话不多说我们开始对Struts2进行剥皮抽筋的解剖整理。我接下来将主要从以下几个方面进行总结:

    1. Struts2是什么玩意?核心?主要的功能?
    2. Struts2的核心知识;
    3. Struts2牛逼的拦截器,卧槽这才是最牛的核心!
    4. Struts2的值栈和OGNL牛逼啊!
    5. Struts2的标签三大类是什么?
    6. Struts2的国际化有哪些东西啊?
    7. Struts2的验证框架简单吗?
    8. Struts2文件上传和下载为什么如此简单?
    9. Struts2防止重复提交做的努力?
    10. Struts2的小技巧(持久跟新......

              一  Struts2是什么玩意?核心?主要的功能?                 

    Struts2在用户请求、模块化处理方面、页面展示表现的很牛逼。

      应用基本处理流程Web容器在接收到HttpServletRequest请求传递给一个过滤器ActionContextCleanUp,之后经过Otherfiters。接下来调用FilterDispatcher核心控制器,其通过调用ActionMapper确认请求的是哪一个Action.ActionMapper返回一个收集Action详细信息的ActionMaping对象。

    之后ActionProxy获得FliterDispatcher传递来的控制权,ActionProxy调用配置管理器(Configuration Manager)从配置文件struts.xml读取到配置信息。之后创建ActionInvocation对象,ActionInvocation在调用Action之前依次的调用所用的配置拦截器(Interceptor N),一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行Result,同时Result可以调用一些模板(Jsp,FreeMarker,Velocity或者是其他的)来呈现页面。

      在调用拦截器之后,我们进入拦截器(Interceptor N)会被执行(顺序与Action执行之前相反)。之后响应(HttpServletResponse)被返回在web.xml中的配置的那些过滤器和核心控制器(FilterDispatcher)。

      下面我们以一个实际的例子进行讲解。首先我们进行Struts2版本的HelloWorld的实现过程。

    一 新建一个Dynamic web Project项目

    第一步:File->New->Other->在搜索框里面搜索Dynamic Web Project.

     

    第二步:之后新建一个Web的项目(选择Dynamic web module Version2.5) 完成之后finish

    二  引入必须的jar包

    对于使用Struts2需要引入一些核心的jar包,其中的所需的jar包如图1-1所示:

      

    1-1 核心jar包(放在lib文件夹中)

    三 配置过滤器(web.xml文件中)

      web.xml进行配置,主要是配置过滤器,将所有的请求全部交给org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter核心控制器处理。配置内容如下;

     

     1 <filter>
     2     <filter-name>Struts2</filter-name>
     3     <filter-class>
     4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
     5 </filter-class>
     6 </filter>
     7 <filter-mapping>
     8     <filter-name>Struts2</filter-name>
     9     <url-pattern>/*</url-pattern>
    10 </filter-mapping>

     

      通过配置拦截器地址(<filter-mapping></filter-mapping),<url-pattern>/*</url-pattern>将所有的HttpServletReqeust请求全部交给了名字叫做Struts2的拦截器(<filter-name>Struts2</filter-name>)进行处理,在前面的<filter></filter>拦截器,定义的名为Struts2拦截器(<filter-name>Struts2</filter-name>)被捕获,进而调用了定义的拦截器类<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>进行处理。

    四  配置Struts.xml文件

       struts.xml文件中必须的内容:

    1 <?xml version="1.0" encoding="UTF-8" ?>
    2 <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    将struts.xml文件放在默认的src下。如图1-2所示:

    1-2 struts文件存放

     

    五、创建HelloWorldAction类,并在struts中进行配置。

    创建一个HelloWorldAction类,放在yxs.Action包下。在HelloWorldAction类中生成默认的 execute()方法。具体代码如下:

     1  public class HelloWorldAction implements Action{
     2           /* (non-Javadoc)
     3            * @see com.opensymphony.xwork2.Action#execute()
     4 */
     5           @Override
     6           public String execute() throws Exception {
     7               // TODO Auto-generated method stub
     8               System.out.println("执行了Action的默认构造方法!");
     9               return SUCCESS;
    10          }
    11  }

    该类实现了Action接口,execute方法返回SUCCESSstruts.xml中进行配置:

     1 <struts>
     2 <!-- 默认继承自struts-default包 -->
     3     <package name="helloWorld" extends="struts-default">
     4 <!-- 如果前端访问hello方法,就会调用yxs.Action.HelloWorldAction类 -->
     5         <action name="hello" class="yxs.Action.HelloWorldAction">
     6         <!-- HelloWorldAction类如果返回success参数(SUCCESS就是success),就会调用helloWorld.jsp模板进行显示 -->
     7             <result name="success">helloWorld.jsp</result>
     8         </action>
     9     </package>
    10 </struts>

    六 创建helloWorld.jsp,部署tomcat实现HelloWorld

    helloWorld.jsp文件代码如下:

     1 </html>
     2 <%@ page language="java" contentType="text/html; charset=utf-8";pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>struts2 HelloWorld!</title>
     8 </head>
     9 <body>
    10     HelloWorld!struts2超级牛逼啊!
    11 </body></html>

    启动tomcat,在地址栏访问localhost:8080/Struts2Chap01/hello即可显示效果如图1-3

    1-3 显示效果

    七 抽丝剥茧,分析如何运行

      首先在web容器中,发送HttpServletRequest请求(localhost:8080/Struts2Chap01/hello),通过web.xml配置文件,我们的过滤器将所有的请求都交给了org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 核心控制器(期间经过了过滤器ActionContextCleanUp,FilterDispatcher...)处理,通过ActionProxy调用配置管理器(Configuration Manager),读取配置文件struts.xml的配置信息。之后创建ActionInvocation对象,经过配置拦截器调用Action<action name="hello" class="yxs.Action.HelloWorldAction">)方法,让HelloWorldAction类处理,HelloWorldAction类中的execute方法return SUCCESS,执行结果返回结果字符串SUCCESS,ActionInvocation负责查找结果字符串对应的(Result)然后执行Result.<result name="success">helloWorld.jsp</result>,根据返回的结果为success,Result调用HelloWorld.jsp来呈现页面。在页面上显示:   HelloWorld! struts2超级牛逼啊!

    据此我们可以总结一下:

    在使用Struts2的时候,我们需要做的是

    (1)实现Action类,完成struts.xml配置,主要是对前端请求方法安排响应的action处理,根据返回的结果跳转到不同的页面。

    (2)拦截器的配置和使用。

    (3)显示模板的创建。

    个人认使用struts的核心在于拦截器的操作,对拦截器进行配置和使用可以实现很牛逼的操作,而且struts本身默认的拦截器栈中就实现了很多牛逼的功能。

                 二      Struts2的核心知识                           

    一、Struts2 get/set自动获取/设置数据

      比如说我们在Action类中设置了自己的属性,生成了get/set方法。在页面中,如果设置或者获取属性,struts2就会自动调用get()/set()方法对数据处理。例如:

    HelloWorldAction.java文件中代码如下:

     1 package com.java1234.Action;
     2 import com.opensymphony.xwork2.Action;
     3 public class HelloWorldAction implements Action{
     4     private String name;//设置自己的name属性
     5 //生成get set方法
     6     public String getName() {
     7         return name;
     8     }
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12     /* (non-Javadoc)
    13      * @see com.opensymphony.xwork2.Action#execute()
    14      */
    15     @Override
    16     public String execute() throws Exception {
    17         // TODO Auto-generated method stub
    18         System.out.println("调用了Action的默认方法!");
    19         return SUCCESS;
    20     }
    21 }

    ②在struts.xml中的配置如下:

    1 <struts>
    2     <package name="helloWorld" extends="struts-default">
    3         <action name="hello" class="com.java1234.Action.HelloWorldAction">
    4             <result name="success">helloWorld.jsp</result>
    5         </action>
    6     </package>
    7 </struts>

    ③helloWorld.jsp中代码如下:

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10   hello  ${name}
    11 </body>
    12 </html>

    ④在浏览器中访问;

    http://localhost:8080/Struts2Chap02/hello?name=java

    ⑤流程:

    前端访问hello?name=”java”,这个时候会调用HelloWorldAction.java中的setName()方法,将name的值设置为java.之后Jsp页面访问hello ${name},想要获取name元素的值,会调用getName()方法,将name 的输出。

    二 Struts2  Action设置数据

    基本数据类型属性:见:   一、Struts2 get/set自动获取/设置数据

    JavaBean类型属性:

      采用javaBean模式,可以很方便的进行设置数据。例如我们设置一个简单的登录验证系统。

     1 public class User {
     2     private String name;
     3     private String password;
     4     public String getName() {
     5         return name;
     6     }
     7     public void setName(String name) {
     8         this.name = name;
     9     }
    10     public String getPassword() {
    11         return password;
    12     }
    13     public void setPassword(String password) {
    14         this.password = password;
    15     }
    16 }

    Action层的UserAction.java

     1 public class UserAction extends ActionSupport{
     2     private String userName;
     3     private String userPassword;
     4     UserService userService =new UserService();
     5     
     6     public void setUserName(String userName) {
     7         this.userName = userName;
     8     }
     9 
    10     public void setUserPassword(String userPassword) {
    11         this.userPassword = userPassword;
    12     }
    13 
    14     private static final long serialVersionUID = 1L;
    15 
    16     @Override
    17     public String execute() throws Exception {
    18         // TODO Auto-generated method stub
    19         User user=new User();
    20         user.setName(userName);
    21         user.setPassword(userPassword);
    22         if(userService.login(user)){
    23             return SUCCESS;
    24         }else{
    25             return ERROR;
    26         }
    27     }
    28 }

      在这个类中,我们设置了和login.jspuserNameuserPassword一样的属性名,到Action中方便设置和获取属性值。

    Servie验证:

    1 public class UserService {
    2     public boolean login(User user){
    3         if("java".equals(user.getName()) && "123456".equals(user.getPassword())){
    4             return true;
    5         }else{
    6             return false;
    7         }
    8     }
    9 }

    Struts.xml配置:

    1 <struts>
    2     <package name="helloWorld" extends="struts-default">
    3         <action name="user" class="com.java1234.Action.UserAction">
    4             <result name="success">success.jsp</result>
    5             <result name="error">error.jsp</result>
    6         </action>
    7     </package>    
    8 </struts>

      根据返回的结果进行跳转:如果成功进入success.jsp 否则进入error.jsp中。

    Login.jsp文件:

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10   <form action="user" method="get">
    11       用户名:<input type="text" id="userName" name="userName"></input>
    12       密码:  <input type="password" id="userPassword" name="userPassword">
    13         <input type="submit" value="提交">
    14   </form>
    15 </body>
    16 </html>

    Success.jsp

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10 登陆成功!
    11 </body>
    12 </html>

    error.jsp

     1 <%@ page language="java" contentType="text/html; charset=utf-8"
     2     pageEncoding="utf-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     7 <title>Insert title here</title>
     8 </head>
     9 <body>
    10 登录失败!
    11 </body>
    12 </html>
    13 另一种思路:
    14 Login.jsp代码变为:
    15  <form action="user2" method="get">
    16       用户名:<input type="text" id="user.name" ></input>
    17       密码:  <input type="password" id="user.password" >
    18         <input type="submit" value="提交">
    19 </form>

    UserAction代码:

     1 public class UserAction2 extends ActionSupport{
     2 
     3     /**
     4      * javabean模式!
     5      */
     6     private User user;
     7     private UserService userService;
     8     public User getUser() {
     9         return user;
    10     }
    11 
    12     public void setUser(User user) {
    13         this.user = user;
    14     }
    15     private static final long serialVersionUID = 1L;
    16 
    17     @Override
    18     public String execute() throws Exception {
    19         // TODO Auto-generated method stub
    20         if(userService.login(user)){
    21             return SUCCESS;
    22         }else{
    23             return ERROR;
    24         }
    25     }
    26 }

    综合以上的内容:   我们推荐使用对象名.属性名的方式。可以节省Action中的复杂度。

    三 Struts2 处理传入多个值

    (1)处理数目不定的字符串;

    一般来说我们直接在可以使用数组来进行处理。以hobby(爱好来举例子)例如:hobby.jsp中的我们可以选择多个自己喜欢的爱好,那么怎么将这些数据传到后台呢?

    基本流程:Action=hobby------>struts.xml-------->com.java1234.Action.HobbyAction

    hobby.jsp

    1 <form action="hobby" method="post">
    2         爱好的语言:<input type="checkbox" name="hobby" value="java">java
    3                 <input type="checkbox" name="hobby" value="C++">C++
    4                 <input type="checkbox" name="hobby" value="C">C
    5                 <input type="checkbox" name="hobby" value="javaScript">javaScript
    6                 <input type="checkbox" name="hobby" value="scale">scale
    7         <input type="submit" value="提交"> 
    8     </form>

    struts.xml

    1 <struts>
    2     <package name="hobby" extends="struts-default">
    3         <action name="hobby" class="com.java1234.Action.HobbyAction">
    4             <result name="success">success.jsp</result>
    5         </action>
    6     </package>
    7 </struts> 

    com.java1234.Action.HobbyAction代码如下:

     1 public class HobbyAction extends ActionSupport{
     2     private static final long serialVersionUID = 1L;
     3     public String[]hobby;
     4     public String[] getHobby() {
     5         return hobby;
     6     }
     7     public void setHobby(String[] hobby) {
     8         this.hobby = hobby;
     9     }
    10     @Override
    11     public String execute() throws Exception {
    12         for(String h:hobby)  System.out.print(h+" ");
    13         return SUCCESS;
    14     }
    15 }

    (2)处理数目不定的javaBean对象;  

    我们一般使用对象集合处理:List  创建javaBean

    Student.java代码如下:

     1 public class Student {
     2     private String name;   private String sex;    private int age;
     3     public String getName() {
     4         return name;
     5     }
     6     public void setName(String name) {
     7         this.name = name;
     8     }
     9     public String getSex() {
    10         return sex;
    11     }
    12     public void setSex(String sex) {
    13         this.sex = sex;
    14     }
    15     public int getAge() {
    16         return age;
    17     }
    18     public void setAge(int age) {
    19         this.age = age;
    20     }
    21     @Override
    22     public String toString() {
    23         return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    24     }
    25 }

    Student.jsp代码:

     1 <form action="student"method="post">
     2     <table><tr>
     3                 <th>姓名</th>
     4                 <th>性别</th>
     5                 <th>年龄</th>
     6     </tr>
     7 <tr>
     8     <td><input type="text" name="students[0].name"></input></td>
     9     <td><input type="text" name="students[0].sex"></input></td>
    10     <td><input type="text" name="students[0].age"></input></td>
    11 </tr>
    12 <tr>
    13     <td><input type="text" name="students[1].name"></input></td>
    14     <td><input type="text" name="students[1].sex"></input></td>
    15     <td><input type="text" name="students[1].age"></input></td>
    16 </tr>
    17 <tr>
    18     <td colspan="3">
    19         <input type="submit" value="提交">
    20     </td>
    21 </tr>
    22 </table>
    23 </form>

    struts.xml文件:

    1 <struts>
    2     <package name="hobby" extends="struts-default">
    3         <action name="student" class="com.java1234.Action.StudentAction">
    4             <result name="success">success.jsp</result>
    5         </action>
    6     </package>
    7 </struts>

    com.java1234.Action.StudentAction代码如下:

     1 public class StudentAction extends ActionSupport{
     2     private static final long serialVersionUID = 1L;
     3     public List<Student>students;
     4     public List<Student> getStudents() {
     5         return students;
     6     }
     7     public void setStudents(List<Student> students) {
     8         this.students = students;
     9     }
    10     @Override
    11     public String execute() throws Exception {
    12             for(Student student:students) { 
    13                 System.out.println(student);
    14             }
    15         return SUCCESS;
    16     }
    17 }

    四、struts.xml 配置

    这部分主要是对struts.xml文件进行配置,主要内容:

    (1) pageckage 配置 

    name 包名 (可以用来区分不同的模块,在前后端分离的时候可以实现不同的包下面存放不同的类)

     1 <struts>
     2   <package name="foregroud" namespace="/fore" extends="struts-default">
     3     <action name="studentList" class="com.java1234.Action.ForeAction">
     4       <result  name="success"> ${pageContext.request.contextPath}/success.jsp</result>
     5     </action>
     6   </package>
     7   <package name="backgroud" namespace="/back" extends="struts-default">
     8     <action name="studentList" class="com.java1234.Action.BackAction" method="show">
     9         <result name="success">${pageContext.request.contextPath}/success.jsp</result>
    10     </action>
    11   </package>
    12 </struts>

    extends 继承

      extends="struts-default" 默认继承自struts-default包

    namespace 包命名空间

      用来在前台访问地址的的时候进行区分。

    abstract 抽象包

      主要是用作拦截器,让其他的包去继承,实现功能! <package name=”xxx”,abstract=”true”>

    (2) action 配置 

      name action 名  方法名

      class 处理类   处理的类名从包名开始写

      method 方法     规定的处理的方法

    (3) 分模块配置方法 

      可以设定不同的xml文件处理不同的请求。

     1 Struts.xml文件代码:
     2 <struts>
     3         <include file="cheliang.xml"></include>
     4 <include file="zichan.xml"></include>
     5 </struts>
     6 Cheliang.xml 
     7 <struts>
     8 <package name="cheliang" namespace="/cheliang" extends="struts-default">
     9 <action name="cheliang" class="com.java1234.Action.CheLiangAction">
    10     <result name="success">
    11 ${pageContext.request.contextPath}/success.jsp
    12 </result>
    13 </action>
    14 </package>
    15 </struts>

    (4)使用通配符     

    我们以学生和成绩为例,进行分析:

    Struts.xml配置文件:

     1  <struts>
     2     <package name="manage"  namespace="/" extends="struts-default">
     3     <action name="student_*" class="com.java1234.Action.StudentAction" method="{1}">
     4             <result name="success">success.jsp</result>
     5     </action>
     6     <action name="grade_*" class="com.java1234.Action.GradeAction" method="{1}">
     7             <result name="success">success.jsp</result>
     8     </action>    
     9 //合并以上两个操作!需要将地址栏中href=“student_list”首字母大写,因为是//{1}Action.
    10 <!-- <action name="*_*" class="com.java1234.Action.{1}Action" method="{2}">
    11             <result name="success">success.jsp</result>
    12     </action>
    13  -->
    14     </package>
    15 </struts>

    前端页面index.jsp

     1 <body>
     2     <h1>通配符</h1>
     3         <a href="student_list" target="_blank">学生信息查询</a>&nbsp;
     4         <a href="student_add" target="_blank">学生信息添加</a>&nbsp;
     5         <a href="student_update" target="_blank">学生信息修改</a>&nbsp;
     6         <a href="student_delete" target="_blank">学生信息删除</a>&nbsp;
     7     <br/><br/>
     8         <a href="grade_list" target="_blank">班级信息查询</a>&nbsp;
     9         <a href="grade_add" target="_blank">班级信息添加</a>&nbsp;
    10         <a href="grade_update" target="_blank">班级信息修改</a>&nbsp;
    11         <a href="grade_delete" target="_blank">班级信息删除</a>&nbsp;
    12 </body>
    13 </html>

    GradeAction代码:

     1 public class GradeAction extends ActionSupport{
     2     private String name;
     3     public String getName() {
     4         return name;
     5     }
     6     public void setName(String name) {
     7         this.name = name;
     8     }
     9     private static final long serialVersionUID = 1L;
    10     public String list() throws Exception {
    11         System.out.println("班级查找!!");
    12         name="班级查找";
    13         return SUCCESS;
    14     }
    15     public String add()throws Exception{
    16         System.out.println("班级添加");
    17         name="班级添加";
    18         return SUCCESS;
    19     }
    20     public String update()throws Exception{
    21         System.out.println("班级修改");
    22         name="班级修改";
    23         return SUCCESS;
    24     }
    25     public String delete()throws Exception{
    26         System.out.println("班级删除");
    27         name="班级删除";
    28         return SUCCESS;
    29     }
    30 }

    StudentAction代码:

     1 public class StudentAction extends ActionSupport{
     2     private static final long serialVersionUID = 1L;
     3     private String name;
     4     public String getName() {
     5         return name;
     6     }
     7     public void setName(String name) {
     8         this.name = name;
     9     }
    10     public String list()throws Exception{
    11         System.out.println("学生查询!");
    12         name="学生查询";
    13         return SUCCESS;
    14     }
    15     public String add()throws Exception{
    16         System.out.println("学生添加");
    17         name="学生添加";
    18         return SUCCESS;
    19     }
    20     public String update()throws Exception{
    21         System.out.println("学生修改");
    22         name="学生修改";
    23         return SUCCESS;
    24     }
    25     public String delete()throws Exception{
    26         System.out.println("学生删除");
    27         name="学生删除";
    28         return SUCCESS;
    29     }
    30 }

    五、动态方法调用

    Struts.xml配置

     1 <struts>
     2     <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>//启用动态方法
     3     <package name="manage"  namespace="/" extends="struts-default">
     4         <action name="student" class="com.java1234.Action.StudentAction">
     5             <result name="success">success.jsp</result>
     6         </action>
     7         <action name="grade" class="com.java1234.Action.GradeAction" >
     8             <result name="success">success.jsp</result>
     9         </action>
    10     </package>
    11 </struts>

    前端页面index.jsp

     1 <body>
     2     <h1>动态方法调用!</h1>
     3         <a href="student!list" target="_blank">学生信息查询</a>&nbsp;
     4         <a href="student!add" target="_blank">学生信息添加</a>&nbsp;
     5         <a href="student!update" target="_blank">学生信息修改</a>&nbsp;
     6         <a href="student!delete" target="_blank">学生信息删除</a>&nbsp;
     7     <br/><br/>
     8         <a href="grade!list" target="_blank">班级信息查询</a>&nbsp;
     9         <a href="grade!add" target="_blank">班级信息添加</a>&nbsp;
    10         <a href="grade!update" target="_blank">班级信息修改</a>&nbsp;
    11         <a href="grade!delete" target="_blank">班级信息删除</a>&nbsp;
    12 </body>

      使用action名!方法名格式可以简化很多操作。

    六  Result配置

      

    结合实例我们观察一下: 前端index.jsp代码:

    index.jsp代码:

    1 <body>
    2     <a href="hello?name=struts2" target="_blank">默认内部转发!</a>//可以取得参数
    3     <a href="hello!r?name=struts2" target="_blank">redirect重定向转发!</a>//参数丢失
    4     <a href="hello!c?name=struts2" target="_blank">chain链条转发</a>
    5     <a href="hello!ra?name=struts2" target="_blank">重定向到Action</a>
    6     <a href="hello" target="_blank">全局result信息</a>
    7 </body>

    Struts.xml代码:

     1 <struts>
     2  <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
     3     <package name="manage"  namespace="/" extends="struts-default">
     4         <global-results>
     5             <result name="error">error.jsp</result>
     6         </global-results>
     7         <action name="hello" class="com.java1234.Action.HelloAction">
     8             <result name="success">success.jsp</result>
     9             <result name="r" type="redirect">success.jsp</result>
    10             <result name="c" type="chain">hello2</result>
    11             <result name="ra" type="redirectAction">hello2</result>
    12         </action>
    13         <action name="hello2" class="com.java1234.Action.HelloAction2">
    14             <result name="success">success.jsp</result>
    15         </action>
    16     </package>    
    17 </struts>

    HelloAction代码:

     1 public class HelloAction extends ActionSupport{
     2     private String name;
     3     private String error;
     4     public String getName() {
     5         return name;
     6     }
     7     public void setName(String name) {
     8         this.name = name;
     9     }
    10     public String getError() {
    11         return error;
    12     }
    13     public void setError(String error) {
    14         this.error = error;
    15     }
    16     private static final long serialVersionUID = 1L;
    17     public HelloAction() {
    18         System.out.println(this);
    19     }
    20     @Override
    21     public String execute() throws Exception {
    22         // TODO Auto-generated method stub
    23         if("".equals(name)||name==null){
    24             this.error="name为空!";
    25             return ERROR;
    26         }
    27         return SUCCESS;
    28     }
    29     public String r()throws Exception{
    30         return "r";
    31     }
    32     public String c()throws Exception{
    33         return "c";
    34     }
    35     public String ra()throws Exception{
    36         return "ra";
    37     }
    38 }

    HelloAction2代码:

     1 public class HelloAction2 extends ActionSupport{
     2     private String name2;
     3     public String getName2() {
     4         return name2;
     5     }
     6     public void setName2(String name2) {
     7         this.name2 = name2;
     8     }
     9     private static final long serialVersionUID = 1L;
    10 
    11     public HelloAction2() {
    12         this.name2="你好啊!我是Action2";
    13     }
    14 
    15     @Override
    16     public String execute() throws Exception {
    17         // TODO Auto-generated method stub
    18         return SUCCESS;
    19     }
    20 }

    success.jsp代码:

    1 <body>
    2     Name:${name}<br/>
    3     <h4>验证chain和redirectAction,其他的方法不必关注Name2的值</h4>
    4     Name2:${name2}
    5 </body>

    error.jsp代码:

    1 <body>
    2     错误信息: ${error}<br/>
    3 </body>

    观察结果:

    访问index.jsp

      其中默认内部转发:参数可以被获取;

      Redirect重定向转发!参数不能被获取 ;

               

    Chain链条转发,参数可以被带过去,并且name2的值也可以被显示。

     

    重定向Action,参数不会被传递过去,但是name2的值可以被获取。

    全局result,不带任何参数,或调用error.jsp文件。  <global-results>                     <result name="error">error.jsp</result>                     </global-results>       结果:

     

  • 相关阅读:
    继承实战
    工厂设计模式
    接口匿名内部类
    枚举类
    接口.匿名内部类
    学生信息管理系统(bug)
    System类
    1.1 计算机基础知识 & jdk 安装 & 标识符
    DedeCMS 在子栏目或内容页,调用所在顶级栏目的栏目名
    latex 中 section 标题中如何插入特殊符号
  • 原文地址:https://www.cnblogs.com/zyxsblogs/p/10805915.html
Copyright © 2011-2022 走看看