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>       结果:

     

  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/zyxsblogs/p/10805915.html
Copyright © 2011-2022 走看看