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 }