本文主要包括以下内容

  1. struts2常用常量的定义与意义
  2. struts2处理流程
  3. 拆分struts
  4. 动态方法调用,使用通配符
  5. 接收请求参数
  6. 中文编码问题
  7. 自定义类型转化器
  8. 访问或添加request/session/application
  9. 常用servlet对象的获取

struts2常用常量的定义与意义

struts2处理流程

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

拆分struts

动态方法调用

(不建议使用)动态方法调用:http://localhost:8080/struts2day02/customer/addCustomer!updateCustomer(应该执行addCustomer,使用!updateCustomer,在请求addCustomer就执行了updateCustomer)
关闭动态调用的功能:

struts.enable.DynamicMethodInvocation = false  

使用通配符

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

接收请求参数

采用基本类型接收请求参数(get/post)

在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。
请求路径http://localhost:8080/test/view.action?id=100

public class ProductAction{
private Integer id;
public void setId(Integer id){//struts2通过反射技术调用与请求参数同名的属性的settter方法来获取请求参数值
this.id = id;
}
public Integer getId(){return id;}
}

采用复合类型接收请求参数

请求路径:http://localhost:8080/test/view.action?product.id=78

public class ProductAction{
private Product product;
public void setProduct(Product product){this.product = product;}
public Product getProduct(){return product;}
}

struts2首先通过反射技术调用Product的默认构造函数创建product对象,然后再通过反射技术调用product中与请求参数同名的属性的setter方法来获取请求参数值

中文乱码问题

过滤器实现

package com.zj.filter;import java.io.IOException;
import java.util.Map;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class EncodeFilter implements Filter {private FilterConfig config=null;private ServletContext context=null;private String encode=null;@Overridepublic void destroy() {// TODO 自动生成的方法存根}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO 自动生成的方法存根//响应乱码解决arg1.setCharacterEncoding(encode);arg1.setContentType("text/html;charset="+encode);//请求乱码解决arg2.doFilter(new MyHttpServletRequest((HttpServletRequest) arg0), arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO 自动生成的方法存根this.config=arg0;this.context=arg0.getServletContext();this.encode=context.getInitParameter("encode");}private class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request=null;private boolean isNotEncode=true;public MyHttpServletRequest(HttpServletRequest request) {super(request);// TODO 自动生成的构造函数存根this.request=request;}@Overridepublic String getParameter(String name) {// TODO 自动生成的方法存根return getParameterValues(name)==null?null:getParameterValues(name)[0];}@Overridepublic Map<String, String[]> getParameterMap() {// TODO 自动生成的方法存根try{if(request.getMethod().equalsIgnoreCase("post")){request.setCharacterEncoding(encode);return request.getParameterMap();}else if(request.getMethod().equalsIgnoreCase("GET")){Map<String,String[]> map=request.getParameterMap();if(isNotEncode){for(Map.Entry<String, String[]> entry:map.entrySet()){String []vs=entry.getValue();for(int i=0;i<vs.length;i++){vs[i]=new String(vs[i].getBytes("iso8859-1"),encode);}}isNotEncode=false;}return map;}else{return request.getParameterMap();}//return super.getParameterMap();}catch(Exception e){e.printStackTrace();throw new RuntimeException();}}@Overridepublic String[] getParameterValues(String name) {// TODO 自动生成的方法存根return getParameterMap().get(name);}}}

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>

自定义类型转化器,解决输入Date类型的问题

1、编写一个类,继承
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter

2、覆盖掉其中的convertValue方法

public Object convertValue(Map<String, Object> context, Object value,Class toType)context:OGNL表达式的上下文value:实际的值。用户输入的都是字符串,但他是一个String数组。toType:目标类型public class DateConvertor extends DefaultTypeConverter {/*context:ognl表达式的上下文value:用户输入的值( 保存数据时)或者模型中的属性。用户输入的值是String数组toType:目标类型*/@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {DateFormat df = new SimpleDateFormat("yyyy/MM/dd");if(toType==Date.class){//2013/05/31----->java.util.Date 保存数据时String strValue = ((String[])value)[0];try {return df.parse(strValue);} catch (ParseException e) {throw new RuntimeException(e);}}else{//java.util.Date----->2013/05/31 获取数据时Date dValue = (Date)value;return df.format(dValue);}}}

3、注册类型转换器
3.1局部类型转换器:只对当前的Action有效

    具体做法:在动作类相同的包中,建立一个名称是“动作类名-conversion.properties”的配置文件,    文件中增加以下内容:要验证的字段=验证器的类全名         birthday=cn.itcast.convertor.DateConvertor

3.2全局类型转换器:对所有的Action都有效

    具体做法:在WEB-INF/classes目录下,建立一个名称为"xwork-conversion.properties"的配置文件,  文件中增加以下内容:目标类型全名=验证器的类全名         java.util.Date=cn.itcast.convertor.DateConvertor

注意:如果转换失败,Struts2框架会寻找name=input的结果页面

访问或添加request/session/application

/*** */
package cn.itcast.action;import java.io.Serializable;
import java.util.Map;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/*** @author wzhting**/
//域范围
public class ScopeAction extends ActionSupport implements Serializable {//向各大域范围存放点数据@Overridepublic String execute() throws Exception {ActionContext ac = ActionContext.getContext();Map<String,Object> applicationMap = ac.getApplication();//这个就是ServletContext对象中维护的那个MapapplicationMap.put("p", "application_p");// ServletContext.setAttribute(key,object);Map<String,Object> sessionMap = ac.getSession();//这个就是HttpSession对象中维护的那个MapsessionMap.put("p", "session_p");// HttpSession.setAttribute(key,object);ac.put("p", "request_p");//相当于ServletRequest.setAttribute(key,obj);  return super.execute();}}

在jsp中可以得到

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

 <body>应用范围:${applicationScope.p}<br/>  会话范围:${sessionScope.p}<br/>请求范围:${requestScope.p}<br/></body>

### 常用servlet对象的获取

### 方式一:通过ServletActionContext直接获取

 //方式一public String execute1(){ServletContext sc = ServletActionContext.getServletContext();System.out.println(sc);ServletRequest request = ServletActionContext.getRequest();System.out.println(request);return SUCCESS;}

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

 public class WebObjectAction 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基础知识相关推荐

  1. Struts2基础知识(三)

    本文主要包括以下内容 OGNL表达式 标签 防止表单重复提交 使用第三方插件 tomcat启动时struts2容器做的事 OGNL表达式 OGNL是Object Graphic Navigation ...

  2. Struts2基础知识(二)

    本文主要包括以下内容 文件上传,多文件上传 自定义拦截器 用户输入验证 国际化 文件上传 将头设置为enctype="multipart/form-data" <body&g ...

  3. JavaScript基础知识与脚本语言总结

    1 Aptana插件安装 1.Aptana插件安装 <1>Aptana是一个非常强大,开源,JavaScript-focused的AJAX开发IDE. <2>它的特点包括: J ...

  4. JavaWeb——基础知识

    Java Web开发的基础内容: Servlet:增加了几个限制的Java类,所以开发一个Servlet并不复杂:然后就是把Servlet部署到web服务器上(Tomcat这个老人家现在身体依然硬朗! ...

  5. Java进阶基础知识

    Java进阶基础知识 1.Java 基础 Java类设计的原则就是内聚性,一致性和封装性是Java设计的基本原则 1.1 Java基础理论 Java基础理论知识 1.2继承的优缺点 1.2.1优点 : ...

  6. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  7. 嵌入式Linux的OTA更新,基础知识和实现

    嵌入式Linux的OTA更新,基础知识和实现 OTA updates for Embedded Linux, Fundamentals and implementation 更新的需要 一旦嵌入式Li ...

  8. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  9. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

最新文章

  1. linux rpm找不到命令_linux环境下 python环境import找不到自定义的模块
  2. python中序列和列表区别细菌真菌病毒_python是哪种动物_动物的分类
  3. 【知识图谱】关于知识图谱,我们接下来该研究什么?斯坦福教授们给出了答案...
  4. 再述Spring AOP 应用场景
  5. P3690-[模板]Link Cut Tree(动态树)【Splay】
  6. 多亏了这篇文章,我的开发效率远远领先于我的同事
  7. 前端学习(2968):完善登录页面
  8. linux不能上网如何配置
  9. voc2007目标检测数据集制作
  10. 5分钟快速安装ASP.NET Core 网站运行环境
  11. 软考软件测评师学习笔记(一)
  12. tensorflow各个版本的CUDA以及Cudnn版本对应关系(重点)
  13. 11个值得珍藏的4K高清壁纸网站推荐
  14. Django建立一个音乐网站(一)
  15. 信息收集--Nmap
  16. 【Word】如何折叠Word文档中的段落
  17. 2_嵌入式软件开发简介
  18. 超融合架构 — Hyper Converged Infrastructure
  19. ConcurrentModificationException 并发修改异常剖析及解决方案
  20. 爬虫实现百度贴吧的图片爬取

热门文章

  1. 90TB显存!英伟达发布新一代SuperPod超算,AI算力新巅峰!
  2. 深度学习平台的未来:谁会赢得下半场?
  3. 我的开源项目——Jerry
  4. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
  5. 如何在终端编译C++代码
  6. 嵌入式系统之操作系统篇
  7. git编译安装与常见问题解决
  8. 第二次冲刺每日站立会议03
  9. HDU 5510 Bazinga 暴力匹配加剪枝
  10. SQL Server--通过存储过程生成表数据的脚本