zoukankan      html  css  js  c++  java
  • struts2的占位符*在action中的配置方法

    转自:https://blog.csdn.net/u012546338/article/details/68946633

    在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <action name="*user" class="com.zzjmay.action.UserAction" method="{1}">  
    2. //这种通配是针对的是同一个action中,响应不同的方法  
    3.   
    4. 在jsp页面中调用的时候  
    5. <form action="loginuser.action" method="post">  
    6.     <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->  
    7.         用户名:<input type="text" name="username" id="username"><br>  
    8.         密     码:<input type="password" name="password" id="password">  
    9.         <br>  
    10.         <input type="submit" value="提交">  
    11.           
    12.     </form>  

    注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理:

    一、struts2的工作原理

     

    1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

    2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

    3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

    4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

    5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;

    6、ActionProxy创建一个ActionInvocation的实例。

    7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

    8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

     

    二、部署一个struts2项目的一般步骤

        1)在Myeclipse中创建一个web项目,并将struts2需要的jar包导入进项目中,如下图

     

        2)在项目中的web.xml中进行配置struts2的框架,在web.xml中需要包含在<filter></filter>,在该节点下可以包含<filter-name>和<filter-mapin

     

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    5.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
    6.     <display-name></display-name>  
    7.     <welcome-file-list>  
    8.         <welcome-file>index.jsp</welcome-file>  
    9.     </welcome-file-list>  
    10.   
    11.     <filter>  
    12.         <filter-name>struts2</filter-name>  
    13.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    14.     </filter>  
    15.     <filter-mapping>  
    16.         <filter-name>struts2</filter-name>  
    17.         <url-pattern>*.action</url-pattern>  
    18.     </filter-mapping>  
    19.     <filter-mapping>  
    20.         <filter-name>struts2</filter-name>  
    21.         <url-pattern>*.jsp</url-pattern>  
    22.     </filter-mapping>  
    23.       
    24. </web-app>  

      3)编写Action类

       4)创建好了Action类中要对action进行配置struts.xml,注意该配置文件的位置要在src的根目录下

     

        5)创建jsp的文件,进行测试

    三、struts.xml的配置初探

    先来看看struts的基本配置的大概情况

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.       
    6. <struts>  
    7.     <package name="user" namespace="/"  extends="struts-default">  
    8.         <action name="*user" class="com.zzjmay.action.VaildateAction" method="{1}">  
    9.             <result name="success">/success.jsp</result>  
    10.             <result name="input">/{1}.jsp</result>  
    11.         </action>  
    12.     </package>  
    13. </struts>  


    从上面的代码中可以看出,xml中包含的再根节点下<struts></struts>下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取

     

    在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。

    四、struts.xml中的package的配置

    看着前面的代码可以很清晰的看到package的属性

    属性有:

    1.     name:逻辑上的包名

    2.     namespace:命名空间,用来区分同意struts下的相同action(注意是一种逻辑上的的路径)

    3.     extends: 继承某个配置文件

    4.     abstract

    具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如:

    <s:form action="db/login.action" method="post">

    此代码说明的就是将会去调用db命名空间下的login对应的action

    还需要注意的是:

    <result>标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下

        <result name="success">/login/error.jsp</result>

     

    五、struts.xml中的action的配置

     

    六、struts.xml中的result的配置

         对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置

    属性有:

    1.     name:Action类的映射名称

    2.     class:Action类的完整路径

    3.     method:默认使用的execute()方法,如果要自定义触发方法,需要使用method自定义

    七、struts.xml配置过程中的注意信息

         在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中<include>

    struts.xml

     

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <include file="struts-user.xml"></include>  
    8. </struts>  


    struts-user.xml

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <constant name="struts.ui.theme" value="simple"></constant>  
    8.     <package name="user" namespace="/ss" extends="struts-default">  
    9.         <action name="login" class="com.zzjmay.action.UserAction"  
    10.             method="execude2">  
    11.     <!--result下的路径是物理路径 -->  
    12.             <result name="success">/login/success.jsp</result>  
    13.             <result name="error">/login/error.jsp</result>  
    14.         </action>  
    15.     </package>  
    16.     <!-- 包名不能相同 -->  
    17.     <package name="user123" namespace="/db" extends="struts-default">  
    18.         <action name="login" class="com.zzjmay.action.UserAction"  
    19.             method="execude2">  
    20.     <!--result下的路径是物理路径 -->  
    21.             <result name="success">/login/error.jsp</result>  
    22.             <result name="error">/login/success.jsp</result>  
    23.         </action>  
    24.     </package>  
    1. </struts
     
     
     
     

    一、Action的创建方法

       1)实现Action接口

       2)继承ActionSupport类,覆写其中的方法

       3)不继承任何类都可以实现,关键是在struts.xml中进行配置

    二、Action动态方法的调用

      在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担

    第一种方法:   在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)

    第二种方法: jsp页面中指定你要调用的那个方法

                           <form action=”login!myfun.action”,method=”post”>

                            在客户端请求中进行动态的配置:映射名!方法名.action

    这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置

    第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)

    在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <action name="*user" class="com.zzjmay.action.UserAction" method="{1}">  
    2. //这种通配是针对的是同一个action中,响应不同的方法  
    3.   
    4. 在jsp页面中调用的时候  
    5. <form action="loginuser.action" method="post">  
    6.     <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->  
    7.         用户名:<input type="text" name="username" id="username"><br>  
    8.         密     码:<input type="password" name="password" id="password">  
    9.         <br>  
    10.         <input type="submit" value="提交">  
    11.           
    12.     </form>  

    注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法

         

      通过通配符实现,不同的类响应不同的类中的方法:

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

        <result >/{2}.jsp</result>

    </action>

    三、 Action的动态结果的配置

    含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。

    UserAction.Java

    public class UserAction extends ActionSupport {

        private String nextResult;

        ...

    }

    Struts2.xml

    <action name="user" class="action.UserAction">

        <result>/{nextResult}</result>

    </action>


    四、接收用户数据(推荐使用的实现ModelDriven的接口)

         在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。

    实现ModelDriven接口

    步骤:

    u    实现用户登录功能

    u    创建User.java类

    Ø          声明用户登录信息

    Ø          创建无参构造

    u   创建Action类

    Ø          实现com.opensymphony.xwork2.ModelDriven接口

    Ø          声明User类对象并实例化

    Ø         实现getModel ()方法,返回User类对象

    u    创建JSP页面

    Ø         表单元素使用”属性”设置name属性

    注意:

    1)  首先,action要实现ModelDriven的接口,默认实现getModel()方法

    2)  要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的

    3)  比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来

    UserAction.java

     

    [java] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. public class UserAction implements ModelDriven<User>  {  
    2.     //要实例化  
    3.     private User user=new User();  
    4.       
    5.     public User getUser() {  
    6.         return user;  
    7.     }  
    8.   
    9.     public void setUser(User user) {  
    10.         this.user = user;  
    11.     }  
    12.     public String myfun() throws Exception {  
    13.         System.out.println("username="+user.getUsername());  
    14.         System.out.println("password="+user.getPassword());  
    15.         System.out.println("myfun.....");  
    16.         //用来进行处理  
    17.         if(user.getUsername().equals(user.getPassword())){  
    18.             return "success";  
    19.         }else{  
    20.             return "error";  
    21.         }  
    22.           
    23.           
    24.     }  
    25.   
    26.     public User getModel() {  
    27.         // TODO Auto-generated method stub  
    28.         return user;  
    29.     }  
    30.       
    31.       
    32.   
    33. }  
    login.jsp

     

    [html] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. <form action="loginuser.action" method="post">  
    2.     <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->  
    3.         用户名:<input type="text" name="username" id="username"><br>  
    4.         密     码:<input type="password" name="password" id="password">  
    5.         <br>  
    6.         <input type="submit" value="提交">  
    7.           
    8.     </form>  

    五、在Action中访问Servlet API

       访问Servlet API的实际项目中有两种的方法访问Servlet API

         1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)

     

    [java] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{  
    2.   
    3.     private User user = new User();  
    4.       
    5.     private Map<String, Object> requestMap;  
    6.     private Map<String, Object> sessionMap;  
    7.     private Map<String, Object> applicationMap;  
    8.       
    9.       
    10.     public void setApplication(Map<String, Object> applicationMap) {  
    11.         this.applicationMap=applicationMap;  
    12.           
    13.     }  
    14.   
    15.     public void setSession(Map<String, Object> sessionMap) {  
    16.         this.sessionMap=sessionMap;  
    17.     }  
    18.   
    19.     public void setRequest(Map<String, Object> requestMap) {  
    20.             this.requestMap=requestMap;  
    21.           
    22.     }  
    23.   
    24.   
    25.     public User getUser() {  
    26.         return user;  
    27.     }  
    28.   
    29.     public void setUser(User user) {  
    30.         this.user = user;  
    31.     }  
    32.   
    33.     public String myfun() throws Exception {  
    34.         System.out.println("username=" + user.getUsername());  
    35.         System.out.println("password=" + user.getPassword());  
    36.         System.out.println("myfun2.....");  
    37.         // 用来进行处理  
    38.         if (user.getUsername().equals(user.getPassword())) {  
    39.   
    40.             sessionMap.put("Succ", "成功的哇2!!!");  
    41.             Bookbiz bookbiz=new Bookbiz();  
    42.               
    43.             applicationMap.put("books",bookbiz.getBooks());  
    44.               
    45.             return "success";  
    46.         } else {  
    47.   
    48.             requestMap.put("errorMsg", "登陆失败了2");  
    49.             return "error";  
    50.         }  
    51.   
    52.     }  
    53.   
    54.   
    55.     public User getModel() {  
    56.         // TODO Auto-generated method stub  
    57.         return user;  
    58.     }  

    注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象

     

         2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象

        

    [java] view plain copy
     
     
     
     
     在CODE上查看代码片派生到我的代码片
    1. public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{  
    2.   
    3.     private User user = new User();  
    4.       
    5.     private HttpServletRequest request;  
    6.     private HttpSession session;  
    7.     private ServletContext application;  
    8.   
    9.     public void setServletContext(ServletContext application) {  
    10.         this.application = application;  
    11.   
    12.     }  
    13.   
    14.     public void setServletRequest(HttpServletRequest request) {  
    15.         this.request = request;  
    16.   
    17.     }  
    18.   
    19.     public User getUser() {  
    20.         return user;  
    21.     }  
    22.   
    23.     public void setUser(User user) {  
    24.         this.user = user;  
    25.     }  
    26. ………………  

    注意:在实现接口中只实现了request和application的获取

    在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();

     
  • 相关阅读:
    计算几何
    HDU 4267
    HDU 4277
    NYOJ 123(插线问点)
    Set
    HDU 1792
    从文本文件读取数据到用vector实现的二维数组中
    为什么计算机采用二进制而不是八进制或者十六进制
    Google C++编程风格指南1
    编程中的命名设计
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/9797001.html
Copyright © 2011-2022 走看看