• struts2 基础2 类型转换器


    struts2常用常量的定义与意义

    每一次请求都会创建一个新的action,所以struts2的action是线程安全的

    拆分struts

    为应用指定多个struts配置文件
    src 下为各应用配置的(.xml)struts配置文件,都需在struts.xml进行调用
    <include file="customer.xml"></include>

    配置错误页

    配置 package范围的错误页  只在当前package范围内有效
        <package name="customer" namespace="/customer" extends="struts-default">
            <global-results>
                <result type="dispatcher" name="error">/customer/error.jsp</result>
            </global-results>
            <action name="addCustomer" class="cn.gs.wwg.CustomerAction" method="addcustomer">
                <result type="dispatcher" name="success">/customer/success.jsp</result>
            </action>
            <action name="updateCustomer" class="cn.gs.wwg.CustomerAction" method="updatecustomer">
                <result type="dispatcher" name="success">/customer/success.jsp</result>
            </action>
        </package>    
        
    配置全局错误页
        <package name="mypackage" extends="struts-default">
            <global-results>
                <result type="dispatcher" name="error">/customer/error.jsp</result>
            </global-results>
        </package>
        需要处理错误的package, 都继承mypackage

     动态方法调用: +方法名,

    可以访问同一action中另一方法 http://localhost:8080/struts2day02/customer/addCustomer!updatecustomer本来

    应该执行“添加方法” 动态调用变成访问“修改方法”(开发中禁止使用) 

    使用通配符

    1     <package name="orders" namespace="/orders" extends="mypackage">
    2     <action name="orders_*" class="cn.itcast.action.OrdersAction" method="{1}">
    3             <result type="dispatcher" name="success">/orders/success.jsp</result>
    4     </action>
    5     </package>
    接收请求参数
     2      使用post。正常接收
     3      使用get提交会出现乱码,解决方式:在加载 struts2 过滤器之前加入 编码过滤器
       解决乱码:
     5      web.xml中注册
     6     <!-- 过滤器配置开始 -->
     7         <filter>
     8             <description>全站乱码过滤器</description>
     9             <filter-name>EncodeFilter</filter-name>
    10             <filter-class>com.zj.filter.EncodeFilter</filter-class>
    11         </filter>
    12         <filter-mapping>
    13             <filter-name>EncodeFilter</filter-name>
    14             <url-pattern>/*</url-pattern>
    15         </filter-mapping>
       解决乱码的另一方法
    17     <!-- 全站参数配置 -->
    18     <context-param>
    19         <description>全站编码配置</description>
    20         <param-name>encode</param-name>
    21         <param-value>utf-8</param-value>
    22     </context-param>

     自定义类型转换器:
      input:当数据类型转换及数据验证出现错误信息时,框架自动转向result 属性 name=input 所指定的页面,
      <result type="dispatcher" name="input">/customer/add.jsp</result>

      1、继承DefaultTypeConverter类

      2、覆盖掉其中的convertValue方法

     1 package cn.gs.ly.converter;
     2 
     3 import java.text.DateFormat;
     4 import java.text.ParseException;
     5 import java.text.SimpleDateFormat;
     6 import java.util.Date;
     7 import java.util.Map;
     8 
     9 import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    10 
    11 public class DateConverter extends DefaultTypeConverter{
    12     /**
    13      *  1.继承DefaultTypeConverter类
    14      *  2.重写  convertValue 方法。写逻辑。在里面进行数据转型 
    15      *  3.注册类型转换器 
    16      *     1局部类型转换器--只对当前action有效
    17      *              在action类所在的包下放置ActionClassName(动作类名)-conversion.properties文件
    18      *             内容如下:要验证的字段=类型转换器的全类名(既包名.类名)(例:birthday = cn.gs.ly.converter.DateConverter)   
    19      *     2全局类型转换器--对所有的action都有效  
    20      *        WEB-INF/classes目录下(即工程src根目录下) 建立一个名称为:xwork-conversion.properties"的配置文件
    21      *        内容如下:待转换的类型=类型转换器的全类名(例:java.util.Date = cn.gs.ly.converter.DateConverter) 
    22      *        
    23      */
    24     
    25     
    26     @Override
    27     public Object convertValue(Map<String, Object> context, Object value, Class toType) {
    28         /**
    29          * context:OGNL 表达式上下文
    30          * value: 实际的值,用户输入的字符串,是一个数组
    31          * toType:目标类型
    32          * */
    33         
    34         DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    35         DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
    36         //if(value.toString().split("//").length>1){  //  按"/"拆分大于1个,即输入是yyyy/MM/dd形式的,if对各形式进行转换格式
    37             if(toType==Date.class){  //是否为Date类型  // 当字符串向Date类型转换时
    38                 try {
    39                     // yyyy/MM/dd-->date
    40                     String strVal = ((String [])value)[0];  //取用户输入的第一个字符串                
    41                     return df.parse(strVal);  
    42                     
    43                 } catch (ParseException e) {
    44                     e.printStackTrace();
    45                 }                
    46             }else{
    47                 // date-->yyyy/MM/dd   // 当Date转换成字符串时
    48                 Date dVal = (Date)value;
    49                 return df.format(dVal);
    50             }
    51         //}    
    52         return null;
    53     }
    54     
    55 }

      3、注册类型转换器 

     1.局部类型转换器:只对当前action有效
            在动作类相同的包下,建立一个名称是:"动作类名-conversion.properties"的配置文件
            内容:要验证的字段=验证器类全名(birthday=cn.gs.ly.converter.DateConverter)
     2.全局类型转换器:对所有action都有效
           WEB-INF/classes目录下(src) 建立一个名称为"xwork-conversion.properties"的配置文件
           内容: 目标类型全名=验证器类全名 (java.util.Date = cn.gs.ly.converter.DateConverte)

    访问或添加request/session/application

     1 package cn.gs.ly;
     2 
     3 import java.util.Map;
     4 
     5 import com.opensymphony.xwork2.ActionContext;
     6 import com.opensymphony.xwork2.ActionSupport;
     7 /**
     8  *     域范围
     9  *     向各大域范围存放点数据
    10  * */
    11 public class ScopeAction extends ActionSupport {
    12     @Override
    13     public String execute() throws Exception {
    14         ActionContext ac = ActionContext.getContext();
    15         Map<String, Object> map = ac.getApplication(); //这个就是ServletContext对象中维护的那个Map
    16         // ServletContext.setAttribute(key,object);
    17         map.put("message", "application test"); //servletContext 范围 
    18         // HttpSession.setAttribute(key,object);
    19         ac.getSession().put("message", "session test"); //session 范围
    20         //相当于ServletRequest.setAttribute(key,obj); 
    21         ac.put("message", "request test"); //request 范围
    22         
    23         return SUCCESS;  //或  其父类     return super.execute();
    24           
    25     }
    26 }

    在jsp中可以得到

    applicationScope生存周期是整个应用 
    sessionScope生存周期是整个会话 
    requestScope生存周期是一次请求

    1 <body>
    2     APPLICATION:${applicationScope.message}   <br/>
    3     SESSION:${sessionScope.message}   <br/>
    4     REQUEST:${requestScope.message}   <br/>
    5 </body>

    常用servlet对象的获取

    方式一:ServletActionContext

    1     public String execute1() {
    2         HttpSession se = ServletActionContext.getRequest().getSession();
    3         System.out.println(se);
    4 //        ServletRequest request = ServletActionContext.getRequest();
    5 //        System.out.println(request);
    6         return SUCCESS;
    7     }

    方式二:实现指定接口,由struts框架运行时注入

     1 package cn.gs.ly;
     2 
     3 import javax.servlet.ServletContext;
     4 import javax.servlet.ServletRequest;
     5 import javax.servlet.ServletResponse;
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 import javax.servlet.http.HttpSession;
     9 
    10 import org.apache.struts2.ServletActionContext;
    11 import org.apache.struts2.interceptor.ServletRequestAware;
    12 import org.apache.struts2.interceptor.ServletResponseAware;
    13 import org.apache.struts2.util.ServletContextAware;
    14 
    15 import com.opensymphony.xwork2.ActionSupport;
    16     /**
    17      *     获取应用中常用对象的引用方法
    18      *         1.ServletActionContext
    19      *         2.实现 ***Aware 接口。实现指定接口,由struts框架运行时注入
    20      * */
    21 public class webAction extends ActionSupport implements Serializable,ServletContextAware,ServletRequestAware,ServletResponseAware {
    22     private ServletContext context;
    23     private HttpServletRequest request;
    24     private HttpServletResponse response;
    25     
    26     public String execute2(){
    27         System.out.println(context);
    28         System.out.println(request);
    29         System.out.println(response);
    30         return SUCCESS;
    31     }
    32     public void setServletContext(ServletContext context) {//如果动作类实现了ServletContextAware接口,就会自动调用该方法
    33         this.context = context;
    34     }
    35     public void setServletRequest(HttpServletRequest request) {
    36         this.request = request;
    37     }
    38     public void setServletResponse(HttpServletResponse response) {
    39         this.response = response;
    40     }
    41 }
  • 相关阅读:
    每个程序员都应该了解的内存知识
    关于CPU Cache -- 程序猿需要知道的那些事
    【转载】十分钟搞清字符集和字符编码
    初学 Java Web 开发,请远离各种框架,从 Servlet 开发
    XML
    接口比对象更加抽象
    【转载】Dom4j的使用(全而好的文章)
    BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
    BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
    BZOJ1259:[CQOI2007]矩形rect(DFS)
  • 原文地址:https://www.cnblogs.com/liuyangv/p/8344106.html
Copyright © 2020-2023  润新知