zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/liuyangv/p/8344106.html
Copyright © 2011-2022 走看看