Struts2中Action获取JSP页面传参的方法,及Action获取request的每个方法的区别

在网上找了好久,发现都是这里抄这里,这里转这里。。。资料特别少,且分散。

作为一个小白,一个不懂的,问度娘解决了一个问题,下一个问题又不懂,又要问度娘。

好多大神管杀不管埋,文章标题之不可描述(不通俗),好文章都藏得很深

干脆直接整理下,便于连贯的复习。


Action获取JSP页面传参的方法

在jsp页面request.setAttribute(),Action实现request的方法,request.getAttribute()

一、get( )提交 ,及URL地址/name?=xiaoming 的传参

实现获得request的方法(下面),

String name = request.getParameter("name");


二、post( )提交,具体为三种

① 直接在Action中定义参数,set、get 方法。接收少量参数

注意:在JSP的页面传递参数的方式:name = "name",和属性名一一对应 ,自动调用set();

<span style="font-size:18px;"><strong>public class TestAction {
	private String name ;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}</strong></span>

② 创建一个实体类,封装需要获得的参数,接收多个参数。

注意:在JSP的页面传递参数的方式:name = "student.name",和对象的属性名一一对应,自动调用set();

<strong><span style="font-size:18px;">public class Student {
	private String name ;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}</span></strong>
public class TestAction {
	private Student student ;

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}
}

③ 实现接口 ModelDriven<T>

注意:在JSP的页面传递参数的方式:name = "name",和泛型对象的属性名一一对应Model自动new一个对象,实现接口方法,return 对象 。

<span style="font-size:18px;"><strong>public class TestAction implements ModelDriven<Student>{
	private Student student ;

	@Override
	public Student getModel() {
		// TODO Auto-generated method stub
		return student;
	}	
}</strong></span>

====================

拓展

Preparable 接口

Preparable接口中有一个void prepare() throws Exception方法,实现该接口的Action类,将在执行这个action所以方法之前执行prepare(),称为action准备方法。详情点击打开链接

还可以回显表单,再详情点击打开链接

====================

注意:提交方式为get,在参数传递时会遇到中文乱码的问题,一个简单的解决方法是,将接受到的字符串先转换成一个byte数组,再用String构造一个新的编码格式的String,如:

String name=request.getParameter("name");
name=new String(name.getBytes("iso-8859-1"),"GB2312");


如果form表单的提交方式为post,解决乱码问题的简单办法是,使用 request.setCharacterEncoding("GB2312");设置request的编码方式。

为什么会出现中文乱码问题呢?因为Tomcat服务器默认的系统编码方式为iso-8859-1,你传递参数给服务器时,使用的是默认的iso-8859-1的编码方式,但是服务器向你返回信息时,是按page指令中设置的编码方式,如:<%@page language="Java" import="java.util.*" pageEncoding="GB2312"%>,这样就混合了两种编码方式,所以会出现乱码,所以解决之道就是统一传递和接收的编码方式。

Action向JSP页面传参的方法(收集中...)




获取request的每个方法的区别

区别原因:单元测试在开发中是非常重要的一个环节
程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的
Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常容易了
比如HttpServletRequest对象,它是由Tomcat容器给我们提供的,我们自己产生不出来
若Action中充斥者ServletAPI,哪怕仅一个,那么一般意义上的JUnit单元测试便无法进行
若Action中耦合了ServletAPI,可以采用apache的Cactus对它进行测试,这要稍微麻烦些
另外也可以采用Mock,它本身是模拟的Servlet的API的一些相关的对象
然后用模拟出来的对象代替容器中产生的对象,来实现对应用程序的访问
而Struts2的Action已经脱离了ServletAPI,所以无需这两种方式,便可直接用JUnit测试


Struts2和Struts1.X中关于Action的测试
Struts1.X的Action依赖于ServletAPI,比如HttpServletRequest、HttpServletResponse对象
这些类都是和容器结合的,所以必须启动Tomcat服务器之后才能获得容器里面的对象
所以测试时比较麻烦。而Apache提供了可以捆绑到Eclipse上专门用于独立测试的项目
它为我们模拟了一系列的HttpServlet对象,使用它之后就可以脱离Tomcat独立测试
Struts2的Action不依赖容器,它和容器无关,所以能够脱离容器进行单独测试
换句话说,我们可以直接在Action里面写一个main()方法进行测试,这是没问题的
这在Struts1.X中是不可想象的,它必须要么启动Tomcat然后去测试,要么装插件再进行测试


Struts2没有与任何的Servlet API耦合
这样可以不依赖于Web容器【如Tomcat】轻松测试Action
Struts2为我们提供了三种方式,使得我们可以轻松获得Servlet的API
ActionContext
ServletActionContext
实现特定接口
由于com.opensymphony.xwork2.ActionContext已经与Servlet的API完全解耦
所以建议首选ActionContext次之采用ServletActionContext最不推荐使用接口


第一种com.opensymphony.xwork2.ActionContext类
首先通过ActionContext类的静态getContext()方法获得当前线程相关的一个ActionContext实例
然后就可以通过该实例调用它的众多方法得到Servlet的一些API
public Object get(Object key)方法,就相当于HttpServletRequest.getAttribute()
public void put(Object key, Object value)对应HttpServletRequest.setAttribute()
public Map<String, Object> getParameters()对应HttpServletRequest.getParameterMap()
public Map<String, Object> getSession()方法对应javax.servlet.http.HttpSession
session.put(Object key, Object value)对应Servlet编程中的HttpSession.setAttribute(…)
也就是说,ActionContext能够获得三个Map类型的Request, Session, Application对象
ActionContext有一个好处,就是它已经将底层的Servlet进行了转化,比如它将session转化成Map
这样在测试时,Struts2便可脱离Servlet容器进行单纯的JUnit测试


第二种org.apache.struts2.ServletActionContext类
ServletActionContext.getRequest()对应javax.servlet.http.HttpServletRequest
ServletActionContext.getResponse()对应javax.servlet.http.HttpServletResponse
ServletActionContext.getServletContext()对应javax.servlet.ServletContext
它的方法全都是static的。另外它所获得的ServletContext对象,就相当于Application
因为它的生命周期与Application生命周期是一样的,只要服务器不关闭,就都是有效的
ServletActionContext可以获得和容器绑定Request, Response, ServletContext对象
这里获得的都不是Map对象,所以在测试的时候,就必须要启动Tomcat服务器


第三种org.apache.struts2.util.ServletContextAware接口
它仅有个void setServletContext(javax.servlet.ServletContext context)方法
通过该方法获得的ServletContext就相当于Application,二者生命周期都是相同的
以及org.apache.struts2.interceptor.ServletRequestAware接口
同样有个void setServletRequest(javax.servlet.http.HttpServletRequest request)方法
以及org.apache.struts2.interceptor.ServletResponseAware接口
同样有个void setServletResponse(javax.servlet.http.HttpServletResponse response)方法
使用方式及示例代码,如下所示
此时需设置一个跟Servlet容器耦合HttpServletRequest类型request成员变量
当执行完setServletRequest()方法,成员变量就被它的HttpServletRequest参数赋值了
该方法是由Struts2自动调用的,显然这是一种非常非常典型的依赖注入DI
由Struts2自动将容器产生的HttpServletRequest对象set到我们应用中的变量上
这样成员变量request就变成了容器所产生的HttpServletRequest对象了
接下来就可以正常的使用request了,使用方法与在Servlet中的使用方式是一样的

[java]  view plain copy print ?
  1. public class DecoupleAction implements ServletRequestAware {  
  2.     private HttpServletRequest request;  
  3.     public void setServletRequest(HttpServletRequest arg0) {  
  4.         this.request = arg0;  
  5.     }  
  6. }  


补充org.apache.struts2.interceptor.RequestAware接口
示例代码如下

[java]  view plain copy print ?
  1. public class DecoupleAction implements RequestAware, SessionAware, ApplicationAware {  
  2.     Map request;  
  3.     Map session;  
  4.     Map application;  
  5.     public void setRequest(Map arg0) {  
  6.         this.request = arg0;  
  7.     }  
  8.     public void setSession(Map arg0) {  
  9.         this.session = arg0;  
  10.     }  
  11.     public void setApplication(Map arg0) {  
  12.         this.application = arg0;  
  13.     }  
  14. }  
这里用到了 IoC模式 ,即将三个Map变量初始化的权利交给了调用者,即容器
容器会自动的利用这三个 setXxx() 方法将三个 Map变量 的值从外面 注入 进来
而我们在Action中不需要new出来Map对象,也不需要做任何的初始化操作
然后就可以直接使用 request, session, application 三个对象了


小结
与Servlet容器解耦非IoC方法:com.opensymphony.xwork2.ActionContext类
与Servlet容器解耦的   IoC方法:RequestAware、SessionAware、ApplicationAware接口
与Servlet容器耦合非IoC方法:org.apache.struts2.ServletActionContext类
与Servlet容器耦合的   IoC方法:ServletRequestAware、ServletResponseAware接口




转载一

转载二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值