Struts2 2
访问Servlet
- ActionContext类:是action执行的上下文对象
方法 | 描述 |
---|---|
void put(String key, Object value) | 模拟HttpServletRequest的setAttribute()方法 |
Object get(String key) | 获取参数key对应的值 |
Map<String,Object> getApplication() | 返回一个Application级的Map对象 |
static ActionContext getContext() | 获取当前线程的ActionContext对象,对应request |
Map<String,Object> getParamrters() | 返回一个包含所有HttpServletRequest参数信息的Map对象 |
Map<String,Object> getSession() | 获取一个Map类型的HttpSessionn对象 |
void setApplication(Map<String,Object> appliction) | 设置Application上下文 |
void setSession(Map<String,Object> session) | 设置一个Map类型的session值 |
//获取对应request的actionContext对象
ActionContext actionContext = ActionContext.getContext();
...
//获取对应application的对象
actionContext.getApplication();
//获取session对象
actionContext.getSession()
- 以上方法通过ActionContext类访问Sevlet API,但是无法直接获得Servlet API实例,struts2提供了以下一系列接口
- SercletRequestAware:实现该接口的Action类可以直接访问web应用的HttpServletRequest实例
- ServletResponseAware:实现该接口的Action可以直接访问web应用的HttpServletResponse实例
- SessionAware:实现该接口的Action可以直接访问web应用的HttpSession实例
- ServletContextAware:实现该接口的Action可以直接访问web应用的HttpSession实例
public class RequestDemo2Action extends ActionSupport implements ServletRequestAware{
HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
@Override
public String execute() throws Exception{
...
}
}
- ServletActionContext的静态方法
- HttpServletRequst getRequest():获取web应用的HttpServletRequest对象
- HttpServletResponse getResponse():获取HttpServletResponse
- ServletContext getServletContext():获取servletContext对象
- PageContext getPageContext():获取PageContext对象
public String execute() throws Exception{ HttpServletRequest request = ServletActionContext.getRequest(); ... request.setAttribute(...); request.getSession().setAttribute(..); //向application中存值 ServletContext.getServletContext().setAttribute(...); }
结果页面的配置
-
struts.xml的result标签
-
name属性:指定逻辑视图的名称,默认是SUCCESS
-
type属性:指定返回的视图资源的类型,默认是dispatcher
- 在struts-default包中,包在struts2-core-2.3.24.jar
属性 说明 chain 用来处理action链,被跳转的action中仍然能获取上个页面的值,如request信息 dispatcher 用来转向页面,通常处理JSP,是默认的结果类型 freemarker 用来整个freemarker模板结果类型 httpheader 用来处理特殊的http行为结果类型 redirect 重定向,被跳转的页面丢失传递的信息 redirectAction 重定向到一个action,跳转的页面丢失传递的信息 stream 向浏览器发送InputStream对象,通常用来处理文件下载,还可用与ajex数据 velocity 用来整合velocity结果类型 xslt 用来整合XML/XSLT结果类型 plainText 显示原始文件内容,例如文件源代码 postback 使得当前请求参数以表单形式提交 -
全局结果页面配置:这个包下的所有返回相同字符串的值都可以向这个页面来进行跳转
<global-results>
<result name = "success">/....jsp</result>
</global-results>
- 局部结果:在某个Action中返回的字符串的值会向这个页面跳转
<action name="request" class="类全路径"> //也就是配置在action内 <result name="success" type="dispatcher">...jsp</result> </action>
数据封装
- 将接收的数据封装以向业务层进行传递
- 一般封装到JavaBean中
- 数据的封装分成两大类:属性驱动、模型驱动
属性驱动
- 直接在action中定义各种java基本数据类型的字段,使得字段与表单数据相对应,并利用这些字段进行数据传递
ActionDemo1 extend ActionSupport{ private String name; private Integer age; private Date birthday; private Double salary; public void setName(String name){ this.name = name; } ... ... ... @Override public String execute() throws Exception{ ... } }
- 页面提供表达式方式
- 页面编写
<input type ="text" name="user.name"/> ...
- Action编写
public class ActionDemo2 extends ActionSupport{ private User user; public User getUser(){ return user; } public void setUser(User user){ this.user = user; } @Override public String execute() throws Exception{ ... } }
模型驱动
- 通过实现ModelDriven接口来接收请求参数,重写getMode()方法,这个方法返回的就是Action所使用的数据模型对象
- 模型驱动通过JavaBean模型进行数据传递,只要是普通的JavaBean,就可以充当模型部分
public class ActionDemo extends ActionSupport implements ModelDriven<User>{ private User user = new User(); @Override public User getModel(){ return user; } @Override public String execute() throws Exception{ ... } }
- 优先使用模型驱动,因为struts2内部很多结果都是围绕模型驱动设计的,但是如果页面向多个对象中封装,就需要使用属性驱动的方式2了
封装集合类型的数据
封装到List集合中
public class demo extends ActionSupport{
private List<User> list;
public List<USer> getList(){
return list;
}
public void setList(List<User> list){
this,list = list;
}
@Override
public String execute() throws Exception{
for(User user:list){
....
}
....
}
}
封装到Map集合
public class demo extends ActionSupport{
private Map<String,User> map;
public Map<String,User> getmap(){
return list;
}
public void setmap(Map<String,User> map){
this.map = map;
}
@Override
public String execute() throws Exception{
for(String key:map.keySet()){
....
}
....
}
}