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本来

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

使用通配符

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

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

  1、继承DefaultTypeConverter类

  2、覆盖掉其中的convertValue方法

 package cn.gs.ly.converter;

 import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class DateConverter extends DefaultTypeConverter{
/**
* 1.继承DefaultTypeConverter类
* 2.重写 convertValue 方法。写逻辑。在里面进行数据转型
* 3.注册类型转换器
* 1局部类型转换器--只对当前action有效
* 在action类所在的包下放置ActionClassName(动作类名)-conversion.properties文件
* 内容如下:要验证的字段=类型转换器的全类名(既包名.类名)(例:birthday = cn.gs.ly.converter.DateConverter)
* 2全局类型转换器--对所有的action都有效
* WEB-INF/classes目录下(即工程src根目录下) 建立一个名称为:xwork-conversion.properties"的配置文件
* 内容如下:待转换的类型=类型转换器的全类名(例:java.util.Date = cn.gs.ly.converter.DateConverter)
*
*/ @Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
/**
* context:OGNL 表达式上下文
* value: 实际的值,用户输入的字符串,是一个数组
* toType:目标类型
* */ DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
//if(value.toString().split("//").length>1){ // 按"/"拆分大于1个,即输入是yyyy/MM/dd形式的,if对各形式进行转换格式
if(toType==Date.class){ //是否为Date类型 // 当字符串向Date类型转换时
try {
// yyyy/MM/dd-->date
String strVal = ((String [])value)[]; //取用户输入的第一个字符串
return df.parse(strVal); } catch (ParseException e) {
e.printStackTrace();
}
}else{
// date-->yyyy/MM/dd // 当Date转换成字符串时
Date dVal = (Date)value;
return df.format(dVal);
}
//}
return null;
} }

  3、注册类型转换器

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

访问或添加request/session/application

 package cn.gs.ly;

 import java.util.Map;

 import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 域范围
* 向各大域范围存放点数据
* */
public class ScopeAction extends ActionSupport {
@Override
public String execute() throws Exception {
ActionContext ac = ActionContext.getContext();
Map<String, Object> map = ac.getApplication(); //这个就是ServletContext对象中维护的那个Map
// ServletContext.setAttribute(key,object);
map.put("message", "application test"); //servletContext 范围
// HttpSession.setAttribute(key,object);
ac.getSession().put("message", "session test"); //session 范围
//相当于ServletRequest.setAttribute(key,obj);
ac.put("message", "request test"); //request 范围 return SUCCESS; //或 其父类 return super.execute(); }
}

在jsp中可以得到

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

 <body>
APPLICATION:${applicationScope.message} <br/>
SESSION:${sessionScope.message} <br/>
REQUEST:${requestScope.message} <br/>
</body>

常用servlet对象的获取

方式一:ServletActionContext

     public String execute1() {
HttpSession se = ServletActionContext.getRequest().getSession();
System.out.println(se);
// ServletRequest request = ServletActionContext.getRequest();
// System.out.println(request);
return SUCCESS;
}

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

 package cn.gs.ly;

 import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware; import com.opensymphony.xwork2.ActionSupport;
/**
* 获取应用中常用对象的引用方法
* 1.ServletActionContext
* 2.实现 ***Aware 接口。实现指定接口,由struts框架运行时注入
* */
public class webAction extends ActionSupport implements Serializable,ServletContextAware,ServletRequestAware,ServletResponseAware {
private ServletContext context;
private HttpServletRequest request;
private HttpServletResponse response; public String execute2(){
System.out.println(context);
System.out.println(request);
System.out.println(response);
return SUCCESS;
}
public void setServletContext(ServletContext context) {//如果动作类实现了ServletContextAware接口,就会自动调用该方法
this.context = context;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}

struts2 基础2 类型转换器的更多相关文章

  1. struts2基础---->自定义类型转换器

    这一章,我们开始struts2中自定义类型转换器的学习. 自定义类型转换器

  2. struts2自己定义类型转换器

    1.1.  struts2自己定义类型转换器 1)        自定类型转换类,继承DefaultTypeConverter类 package com.morris.ticket.conversio ...

  3. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  4. struts2自定义日期类型转换器

    在java web表单中提交的数据难免会有日期类型,struts2支持的日期类型是yyyy-MM-dd,如果是其他格式,就需要自己进行转换.比如yy-MM-dd 要完成自己定义的转换需要完成. 主要的 ...

  5. 自己定义struts2中action类型转换器

    DateAction.java中代码例如以下: package com.itheima.action; import java.util.Date; public class DateAction { ...

  6. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器   如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString   注 ...

  7. struts2类型转换器、 类型转换错误 以及INPUT view

    1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...

  8. struts2自定义类型转换器

    首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机 ...

  9. Struts2的类型转换器

    Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注册类型转 ...

随机推荐

  1. 新手使用GIT 上传文件到github

    手把手教你如何使用 Git # 初始化一个新的Git仓库 1.方式一: mkdir(make directory) test或者直接进入文件夹中再打开git 方式二:cd /文件夹 cd(change ...

  2. tortoise svn回滚常用命令

    一.revert to this version 和 revert changes from this version的区别 假设SVN已有版本4814-4854:1.基于4837版本执行[rever ...

  3. 【GDOI2016模拟3.10】习用之语

    前言 这道题看上去很水,结果我在比赛上浪费了N多时间在上面,但还是没AC.比赛结束后发现:实际上这道题还是是大水. 题目 分析 设字符串c1c2c3c4,其中c1.c2.c3.c4={'0'~'9', ...

  4. hdu 4609: 3-idiots (FFT)

    题目链接 题意:从N个数中,选出三个两两不同的数,求这三个数能够作为一个三角形的三边长的概率. 题解:用一个数组num[]记录大小为 i 的数出现的次数,通过 num[] 卷 num[] 得到 num ...

  5. 【leetcode】1129. Shortest Path with Alternating Colors

    题目如下: Consider a directed graph, with nodes labelled 0, 1, ..., n-1.  In this graph, each edge is ei ...

  6. k-means原理和python代码实现

    k-means:是无监督的分类算法 k代表要分的类数,即要将数据聚为k类; means是均值,代表着聚类中心的迭代策略. k-means算法思想: (1)随机选取k个聚类中心(一般在样本集中选取,也可 ...

  7. 代理修饰词weak/assign/strong的区别

    基于项目报错: WebViewJavascriptBridgeBase 中定义:@property (assign) id <WebViewJavascriptBridgeBaseDelegat ...

  8. 解决json不能解析换行问题

    今天遇到一个问题,当我读取数据库中某条带换行的数据时,解析错误. 解决方法是在存入数据库时对数据做处理,把换行换成其他字符.代码如下: remark = remark.replace(/\n/g,&q ...

  9. luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  10. 【RabbitMQ】Centos7安装RabbitMQ

    介绍 RabbitMQ  是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务 ...