• struts2从请求取值的三种方式


    Struts2作为WEB框架,必不可少的需要请求中取值。(我在这里说是从请求中取值对于一些读者可能有些晦涩,其实如果我说从页面取值可能就好理解一点了,但除了从已经存在的页面里面能够给后台传值,在地址栏里也可以传,甚至在java代码里也是可以的。)

    这里就谈谈struts如何从请求中取值。

    我介绍三种方式:

    三种取值方式:
    1,使用默认的action的传递方式。
    2,自定义一个vo,在action中使用这个vo
    3,使用ModelDriven的方式。



    一、使用默认的action的传递方式

    如果我们的请求里面带有两个参数userName和passWord的话,我们只需要在Action里有这两个私有属性就可以了。

    请看我的Action:

    Java代码  收藏代码
    1. package study.getValue;  
    2.   
    3. import com.opensymphony.xwork2.Action;  
    4.   
    5. /** 
    6.  
    7. * 在Action中定义请求里面传过来的值, 
    8.  
    9. * 并且定义所有的Setter和Getter 
    10.  
    11. * 这样可以直接在功能方法里面直接使用这些值。 
    12.  
    13. * @author  arne3166 
    14.  
    15. * @version  [0100, 2010-9-30] 
    16.  
    17. */  
    18.   
    19. public class LoginAction  
    20.   
    21. {  
    22.   
    23.     private String userName;//页面里面的userName  
    24.   
    25.     private String passWord;//页面里面的passWord  
    26.   
    27.     //必须的setter和getter方法  
    28.   
    29.     public String getUserName();  
    30.   
    31.     public void setUserName(String userName);  
    32.   
    33.     public String getPassWord();  
    34.   
    35.     public void setPassWord(String passWord);      
    36.   
    37.     //业务逻辑     
    38.   
    39.     public String execute()  
    40.   
    41.     {  
    42.   
    43.         if (null!= userName && null != passWord  
    44.   
    45.             && userName.equals("arne3166") && passWord.equals("111111"))  
    46.   
    47.         {  
    48.   
    49.             return Action.SUCCESS;  
    50.   
    51.         }  
    52.   
    53.         else  
    54.   
    55.         {  
    56.   
    57.             return Action.ERROR;  
    58.   
    59.         }  
    60.   
    61.     }  
    62.   
    63. }  


    复制代码在struts .xml里面的配置

    Xml代码  收藏代码
    1. <action name="loginput" >  
    2.   
    3.         <result>/page/getValue/login_input.jsp</result>  
    4.   
    5. </action>  
    6.   
    7. <action name="login" class="study.getValue.LoginAction">  
    8.   
    9.         <result name="success">/page/getValue/success.jsp</result>  
    10.   
    11.         <result name="error">/page/getValue/fail.jsp</result>  
    12.   
    13. </action>  


    复制代码看jsp是怎么写的:

    Java代码  收藏代码
    1. <form action="login.action"><!-- name="userName" 和 name="passWord"同Action里面的私有属性对上 -->  
    2.   
    3. 用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>  
    4.   
    5. <input type="submit" value="提交"/>  
    6.   
    7. </form>  


    二、自定义一个vo,在action中使用这个vo

    区别于以上的方式,Struts2中允许将页面的值封装起来,放到一个ValueObject(VO)中。就比如上面的例子中的userName和passWord,完全可以放到一个User类中。这样做的好处是,避免如果Action中如果有好多这样的值的话,太多的setter和getter会使得Action看起来比较臃肿的毛病。

    看看我们是怎么做的

    首先定义User

    Java代码
    Java代码  收藏代码
    1. package study.getValue.vo;     
    2. public class User     
    3. {     
    4.     //页面中的值的封装     
    5.     private String userName;     
    6.     private String passWord;     
    7.     //所有的setter和getter     
    8.     public String getUserName();     
    9.     public void setUserName(String userName);     
    10.     public String getPassWord();     
    11.     public void setPassWord(String passWord);     

    12.  


    再看Action被简化成了什么样子
    Java代码

    Java代码  收藏代码
    1. package study.getValue;     
    2. import com.opensymphony.xwork2.Action;     
    3. import study.getValue.vo.User;     
    4. /**   
    5. *   
    6. * 在Action中定义请求里面传过来Vo,   
    7. * 并且定义VO的Setter和Getter   
    8. * 使用页面参数的时候像使用Vo的属性一样。   
    9. * @author  arne3166   
    10. * @version  [0100, 2010-9-30]   
    11. */    
    12. public class VoLoginAction     
    13. {     
    14.     //将vo作为私有属性     
    15.     private User u;     
    16.     //setter和getter必不可少     
    17.    public User getU();     
    18.     public void setU(User u);     
    19.     public String execute()     
    20.     {     
    21.         String userName = u.getUserName();     
    22.         String passWord = u.getPassWord();     
    23.         if (null!= userName && null != passWord     
    24.             && userName.equals("arne3166") && passWord.equals("111111"))     
    25.         {     
    26.             return Action.SUCCESS;     
    27.         }     
    28.         else    
    29.         {     
    30.             return Action.ERROR;     
    31.         }     
    32.     }     
    33. }    
    34.   

    这样做了,页面任然用原来的当然是不行的,注意到Action中的user对象的引用是u,那么,在页面里面userName也需要修改成u.userName,passWord也应当修改成u.passWord

    Html代码
    Java代码  收藏代码
    1. <!--login_input_vo.jsp name="u.passWord"和name="u.passWord"是对Action中User对象进行映射 -->    
    2. <form action="loginvo.action">    
    3. 用户名:<input name="u.userName" type="text"/>用户密码<input name="u.passWord" type="password"/>    
    4. <input type="submit" value="提交"/>    
    5. </form>    
    6.   


    再看看配置文件

    Xml代码
    Java代码  收藏代码
    1. <action name="loginputvo" >    
    2.     <result>/page/getValue/login_input_vo.jsp</result>    
    3. </action>    
    4. <action name="loginvo" class="study.getValue.VoLoginAction">    
    5.     <result name="success">/page/getValue/success.jsp</result>    
    6.     <result name="error">/page/getValue/fail.jsp</result>    
    7. </action>    
    8.   
    9. <action name="loginputvo" >  
    10.         <result>/page/getValue/login_input_vo.jsp</result>  
    11. </action>  
    12. <action name="loginvo" class="study.getValue.VoLoginAction">  
    13.         <result name="success">/page/getValue/success.jsp</result>  
    14.         <result name="error">/page/getValue/fail.jsp</result>  
    15. </action> 成功失败后的页面没有什么好修改的。  



    三、使用模型驱动(ModelDriven)的方式。

    上面的例子中在页面要写上u.userName,按照习惯前面的“u.”是不是可以不要呢,同时又能保持第二种方式里Action的“纯洁”,Struts2的模型驱动就可以做到。

    从实现方式上面需要Action实现模型驱动的接口,先来看Action是怎么写的:

    Java代码  收藏代码
    1. package study.getValue;     
    2. import study.getValue.vo.User;     
    3. import com.opensymphony.xwork2.Action;     
    4. import com.opensymphony.xwork2.ModelDriven;     
    5. /**   
    6. *   
    7. * Action实现ModelDriven接口。   
    8. * 在Action里定义一个私有变量User,这个User应该被new出来,   
    9. * 不过里面的值是Strus来设置的   
    10. * 不需要Setter和Getter方法   
    11. * @author  arne3166   
    12. * @version  [0100, 2010-9-30]   
    13. */    
    14. public class ModelDrivenLoginAction implements ModelDriven<User>     
    15. {     
    16.     //需要将user对象new出来;     
    17.     private User u = new User();     
    18.     //实现的接口方法     
    19.     @Override    
    20.     public User getModel()     
    21.     {     
    22.         return u;     
    23.     }     
    24.     public String execute()     
    25.     {     
    26.         String userName = u.getUserName();     
    27.         String passWord = u.getPassWord();     
    28.         if (null!= userName && null != passWord     
    29.             && userName.equals("arne3166") && passWord.equals("111111"))     
    30.         {     
    31.             return Action.SUCCESS;     
    32.         }     
    33.         else    
    34.         {     
    35.             return Action.ERROR;     
    36.         }     
    37.     }     
    38. }    
    39.   


    下面回到Sturts的配置文件



    Xml代码
    Java代码  收藏代码
    1. <action name="loginputmodeldriven" >    
    2.     <result>/page/getValue/login_input_modeldriven.jsp</result>    
    3. </action>    
    4. <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">    
    5.     <result name="success">/page/getValue/success.jsp</result>    
    6.     <result name="error">/page/getValue/fail.jsp</result>    
    7. </action>    
    8.   
    9. <action name="loginputmodeldriven" >  
    10.         <result>/page/getValue/login_input_modeldriven.jsp</result>  
    11. </action>  
    12. <action name="loginmodeldriven" class="study.getValue.ModelDrivenLoginAction">  
    13.         <result name="success">/page/getValue/success.jsp</result>  
    14.         <result name="error">/page/getValue/fail.jsp</result>  
    15. </action>   


    再看表单的页面

    Java代码  收藏代码
    1.    
    2. <!--又回到原始简单的样式了O(∩_∩)O-->     
    3. <form action="loginmodeldriven.action">     
    4. 用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>     
    5. <input type="submit" value="提交"/>     
    6. </form>    
    7.   
    8. <!--又回到原始简单的样式了O(∩_∩)O-->  
    9. <form action="loginmodeldriven.action">  
    10. 用户名:<input name="userName" type="text"/>用户密码<input name="passWord" type="password"/>  
    11. <input type="submit" value="提交"/>  
    12. </form>   

    这里注意一下,

    这是必须的
    //需要将user对象new出来;
    private User u = new User();

    如果不将user new出来的话,会在页面给你一个异常吃吃


    Java代码  收藏代码
    1. Struts Problem Report     
    2. Struts has detected an unhandled exception:      
    3.     
    4. Messages:       
    5. File: study/getValue/ModelDrivenLoginAction.java      
    6. Line number: 23      
    7.     
    8.     
    9. --------------------------------------------------------------------------------     
    10.     
    11. Stacktraces     
    12. java.lang.NullPointerException      
    13.     study.getValue.ModelDrivenLoginAction.execute(ModelDrivenLoginAction.java:23)     
    14.     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     
    15.     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     
    16.     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     
    17.     java.lang.reflect.Method.invoke(Method.java:597)    
  • 相关阅读:
    iOS开发UI篇—字典转模型
    使用python编写批量卸载android应用的脚本
    CircularProgressBar
    Custom-Progress-Dialog-Android
    picasso jar
    swift
    Python编程
    H264分析工具
    Android Websites
    AnATools
  • 原文地址:https://www.cnblogs.com/tgxblue/p/4217343.html
Copyright © 2020-2023  润新知