原作者:尚硅谷-佟刚
基本配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--
package:包,struts2使用package 来组织模块
name:用于其他包应用当前的包
extends:所继承的包(包括:所有配置)
namespace:默认值 "/" 非默认 值:http://localhost:8080/contextPath/namespace/actionName.ac tion
-->
<package name="helloworld" namespace="/atguigu" extends="struts-default">
<!-- 配置一个action: 一个struts2的请求就是一个action
name:对应一个struts2的请求的名字,不包含"/"和扩展名
默认:class:com.opensymphony.xwork2.ActionSupport
method:execute
默认:result:结果
name:success
type:dispatcher(转发)
-->
<action name="product-input"
class="com.opensymphony.xwork2.ActionSupport"
method="execute">
<result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result>
</action>
</package>
</struts>
与Servlet API解耦的访问方式
package com.atguigu.struts2.action;
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContextAction {
public String execute(){
//获取ActionContext对象
//ActionContext是Action的上下文,可以从中获取到当前Action需要的一切信息
ActionContext actionContext = ActionContext.getContext();
//1.获取application对应的Map ,并向其中添加一个属性
Map<String, Object> applicationMap = actionContext.getApplication();
//设置属性
applicationMap.put("applicationKey","applicationValue");
//获取属性
Object date = applicationMap.get("date");
System.out.println("date:"+date);
//2.session
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey","sessionValue");
System.out.println(sessionMap.getClass());
if(sessionMap instanceof SessionMap){
SessionMap<String,Object> sm=(SessionMap) sessionMap;
sm.invalidate();
System.out.println("session失效了....");
}
//3.request
//ActionContext中并没有提供getRequest方法来获取request对应的Map
//需要手工调用get()方法,传入request字符串来获取
Map<String,Object> requestMap=(Map<String, Object>) actionContext.get("request");
requestMap.put("requestKey","requestValue");
//4.获取请求参数对应的Map,并获取指定的参数值
//键:请求参数的名字,值:请求参数的值对应的字符串数组
//注意:1.getParameters()返回值为Map<String,Object> 而不是 Map<String,String[]>
// 2.parameters这个Map只能读,不能写入数据,如果写入,但不出错,但也不起作用!
Map<String,Object> parameters = actionContext.getParameters();
String[] names=(String[]) parameters.get("name");
System.out.println(names[0]);
parameters.put("age",100);
return "success";
}
}
package com.atguigu.struts2.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class TestAwareAction implements ApplicationAware,SessionAware,RequestAware,ParameterAware{
public String execute(){
//1.向application中加入一个属性:applicationKey2 - applicationValue2
application.put("applicationKey2","applicationValue2");
//2.从application中读取属性date,并打印
System.out.println(application.get("date"));
//3.session
session.put("sessionKey2","sessionValue2");
//4.request
request.put("requestKey2", "requestValue2");
String[] vals = parameters.get("name");
System.out.println(vals[0]);
parameters.put("age", new String[]{"33"});
return "success";
}
private Map<String,Object> application;
private Map<String,String[]> parameters;
private Map<String,Object> request;
private Map<String,Object> session;
@Override
public void setApplication(Map<String, Object> application) {
this.application=application;
}
@Override
public void setParameters(Map<String, String[]> parameters) {
this.parameters=parameters;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request=request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
}
与 Servlet 耦合的访问方式
package com.atguigu.struts2.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
public class TestServletActionContextAction {
/**
* ServletActionContext:可以从中获取到当前Action对象需要的一切Servlet API相关的对象.
*
* 常用方法:
* 1. 获取HttpServletRquest:ServletActionContext.getRequest();
* 2. 获取HttpSession:ServletActionContext.getRequest().getSession()
* 3. 获取ServletContext:ServletActionContext.getServletContext()
*
*/
@SuppressWarnings("unused")
public String execute(){
HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=ServletActionContext.getRequest().getSession();
ServletContext servletContext=ServletActionContext.getServletContext();
System.out.println("execute....");
return "success";
}
}
package com.atguigu.struts2.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
/**
*通过实现ServletXxxAware接口的方式可以由Struts2注入
*需要的Servlet相关的对象
* ServletRequestAware:注入HttpSevletRequest对象(比较常用)
* SevletContextAware:注入ServletContext对象 (比较常用)
* ServletResponseAware:注入HttpServletResponse对象
*/
public class TestServletAwareAction implements ServletRequestAware,ServletContextAware,ServletResponseAware{
@Override
public void setServletResponse(HttpServletResponse response) {
System.out.println(response);
}
private ServletContext context;
@Override
public void setServletContext(ServletContext context) {
this.context=context;
System.out.println(context);
}
@Override
public void setServletRequest(HttpServletRequest request) {
System.out.println(request);
}
public String execute(){
System.out.println("ServletContext:" +context);
return "success";
}
}
配置结果响应类型
<!--
result:表示结果的响应类型
-->
<action name="testResult" class="com.atguigu.struts2.action.TestResultAction">
<result name="success" type="dispatcher">/success.jsp</result>
<result name="login" type="redirect">/login.jsp</result>
<!-- 重定向到一个Action
-->
<result name="index" type="redirectAction">
<param name="actionName">testAction</param>
<param name="namespace">/atguigu</param>
</result>
<!-- 通过redirect 的响应类型也可以便捷的实现redirectAction的功能!
<result name="index" type="redirect">/atguigu/testAction.do</result>
-->
<!-- 转发到一个Action
-->
<result name="test" type="chain">
<param name="actionName">testAction</param>
<param name="namespace">/atguigu</param>
</result>
<!-- 不能通过type="dispatcher" 的方式转发到一个Action
<result name="test" type="dispatcher">/atguigu/testAction.do</result>
-->
</action>
</package>
<package name="testPackage" namespace="/atguigu" extends="struts-default">
<action name="testAction" class="com.atguigu.struts2.action.TestAction">
<result>/success.jsp</result>
</action>
</package>
通配符*的使用(极大地简化了配置文件)
<action name="UserAction-*" class="com.atguigu.struts2.action.UserAction"
method="{1}">
<result name="{1}-success">/success.jsp</result>
</action>
代替:
<action name="UserAction-save" class="com.atguigu.struts2.action.UserAction"
method="save">
<result name="save-success">/success.jsp</result>
</action>
<action name="UserAction-test" class="com.atguigu.struts2.action.UserAction"
method="test">
<result name="test-success">/success.jsp</result>
</action>
<action name="UserAction-update" class="com.atguigu.struts2.action.UserAction"
method="update">
<result name="update-success">/success.jsp</result>
</action>
<action name="UserAction-delete" class="com.atguigu.struts2.action.UserAction"
method="delete">
<result name="delete-success">/success.jsp</result>
</action>
<action name="UserAction-query" class="com.atguigu.struts2.action.UserAction"
method="query">
<result name="query-success">/success.jsp</result>
</action>