三、Struts2部分标签
1)<package>:用来组织模块的。比如用户模块,订单模块等。通常它的extends属性要继承struts-default(struts-default.xml)。必须要有一个name属性,可以让其它包应用它。
2)<action>:一个Struts2的请求就是一个action。其name属性 对应一个struts请求的名字。
3)一个<action>标签中可以有一个或多个<result>子节点。这些子节点通过<result>的name属性来区分,name的属性值和action的返回值对应。<result>还有个type的属性,表示结果的类型,默认是dispatcher(转发)。
四、Action概述
1.action和Action类
1)action:一个Struts2请求就是一个action。
2)Action类:能够处理Struts2的请求的类。
注:a.Action类的属性的名字必须遵循与javabean属性名相同的命名规则,属性类型可以是任意的。
b.必须带有一个空的构造器(反射创建实例)
c.至少有一个struts执行时action调用的方法
d.可以包含多个action方法
2.通过ActionContext获取WEB资源
1)WEB资源:HttpServletRequest、HttpSession、SessionContext等原生Servlet API。在B/S中的Controller必定访问WEB资源。
2)访问WEB资源的方式
a.和Servlet API解耦的方式
只能访问到有限个Servlet API对象也只能访问有限的方法。
>使用ActionContext(Action的上下文对象)
开始页面:
<a href="actionContextTest.action?name=yaorange">actionContext测试</a>
Action类:
publicString execute(){
ActionContextactionContext=ActionContext.getContext();
//actioncontext 通过ActionContext对象中的getApplication()方法来获取application对象的Map对象。
Map<String,Object> applicationMap = actionContext.getApplication();
//设置属性值。
applicationMap.put("application","application value");
//session
Map<String,Object> sessionMap = actionContext.getSession();
//设置属性值。
sessionMap.put("session","sessionvalue");
//request actionContext中没有直接获取request对应的Map的方法,需要有get()方法手动调用。
Map<String,Object>requestMap= (Map<String,Object>)actionContext.get("request");
//下面的值 获取不到。
requestMap.put("request","request value");
//parameter
Map<String,Object> parameters = actionContext.getParameters();
System.out.println(((String[])parameters.get("name"))[0]);
return"success";
}
测试页面:
<h4>actionContext测试</h4>
<br>
actionContext:${applicationScope.application}
<br>
session:${sessionScope.session}
<br>
request:${requestScope.request}
<br>
parameters:${parameters.name}
>实现XxxAware接口(Action类分别实现ApplicationAware,SessionAware,RequestAware,ParameterAware接口)
首页:
<a href="awareTest.action?name=yaorange">aware测试</a>
Action类:
private Map<String, Object> applicationMap;
private Map<String, Object> sessionMap;
private Map<String, Object> requestMap;
private Map<String, String[]> parametersMap;
public String execute(){
//application
applicationMap.put("application","application value");
//session
sessionMap.put("session","session value");
//request
requestMap.put("request", "request value");
//paremeter
String name=((String[])parametersMap.get("name"))[0];
System.out.println(name);
return "success";
}
@Override
public void setApplication(Map<String, Object> applicationMap) {
this.applicationMap=applicationMap;
}
@Override
public void setSession(Map<String, Object> sessionMap) {
this.sessionMap=sessionMap;
}
@Override
public void setRequest(Map<String, Object> requestMap) {
this.requestMap=requestMap;
}
@Override
public void setParameters(Map<String, String[]> parametersMap) {
this.parametersMap=parametersMap;
}
测试页面:
<h3>aware测试</h3>
application:${applicationScope.application}
<br>
session:${sessionScope.session}
<br>
request:${requestScope.request}
注:若一个Action类中,多个action方法需要调用域对象的map或parameters,一般实现XxxAware接口
b.和Servlet API耦合的方式
可以访问更多的Servlet API对象,可以调用原生的方法。
>使用ServletActionContext
首页:
<ahref="servletActionContextTest.action">servletActionContext测试</a>
Action类
public String execute(){
//获取application->ServletActionContext.getServletContext()。
ServletContextservletContext = ServletActionContext.getServletContext();
//获取session -> 先获取request再获取session ServletActionContext.getRequest().getSession()。
HttpSessionsession = ServletActionContext.getRequest().getSession();
//获取request-> ServletActionContext.getRequest()。
HttpServletRequestrequest = ServletActionContext.getRequest();
System.out.println("成功获取");
return"success";
}
-------->打印“成功获取则表明获取成功”
>实现ServletXxxAware接口(ServletRequestAware,ServletContextAware)
首页:
<ahref="servletAwareTest.action">servletAwaretext测试</a>
Action类:
private ServletContext servletContext;
privateHttpServletRequest request;
publicString execute(){
//application
System.out.println("application:"+servletContext);
//session
System.out.println("session:"+request.getSession());
//request
System.out.println("request:"+request);
return"success";
}
@Override
public voidsetServletContext(ServletContext servletContext) {
this.servletContext=servletContext;
}
@Override
public voidsetServletRequest(HttpServletRequest request) {
this.request=request;
}