传值方式有以下三种:
- 完全解耦
- 使用Servlet原生API
- 使用接口注入
一、完全解耦(ActionContext)
①、index.jsp
<h3>方式一:完全解耦</h3> <form action="${pageContext.request.contextPath}/request1.action" method="post"> name:<input type="text" name="name" /><br /> password:<input type="password" name="password" /><br /> <input type="submit" value="submit" /> </form>
②、success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> ${reqName} ${sessName} ${appName} </body> </html>
③、struts.xml
<struts> <include file="com/xxx/web/action/struts_request.xml"></include> </struts>
④、Request1Action
public class Request1Action extends ActionSupport { @Override public String execute() throws Exception { ActionContext context=ActionContext.getContext(); //一、获取表单提交数据 Map<String, Parameter> map=context.getParameters(); for (Parameter value : map.values()) { System.out.println(value.getName()+" "+value.getValue()); } //二、向域对象中存入数据 context.put("reqName", "reqValue");//相当于request.setAttribute(); context.getSession().put("sessName", "sessValue");//相当于session.setAttribute(); context.getApplication().put("appName", "appValue");//相当于application.setAttribute(); return super.execute(); } }
⑤、struts_request.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="strutsdemo" extends="struts-default" namespace="/"> <action name="request1" class="com.xxx.web.action.Request1Action"> <result>success.jsp</result> </action> </package> </struts>
注意:这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。
二、使用Servlet的原生API(通过ServletActionContext对象获取域对象(request对象、session对象、application对象))
①、index.jsp
<h3>方式二:使用Servlet的原生API</h3> <form action="${pageContext.request.contextPath}/request2.action" method="post"> name:<input type="text" name="name" /><br /> password:<input type="password" name="password" /><br /> <input type="submit" value="submit" /> </form>
②、Request2Action
public class Request2Action extends ActionSupport { @Override public String execute() throws Exception { HttpServletRequest request= ServletActionContext.getRequest(); //一、获取表单提交数据 Map<String, String[]> map=request.getParameterMap(); for (String key : map.keySet()) { System.out.println(key+" "+Arrays.toString(map.get(key))); } //二、向域对象中存入数据 request.setAttribute("reqName", "reqValue"); request.getSession().setAttribute("sessName", "sessValue"); ServletActionContext.getServletContext().setAttribute("appName", "appValue"); return super.execute(); } }
③、struts_request.xml
<action name="request2" class="com.xxx.web.action.Request2Action"> <result>success.jsp</result> </action>
注意:这种方式可以操作域对象的数据,同时也可以获得对象的方法。
三、接口注入
通过实现接口的方式实现域对象的实例化
①、index.jsp
<h3>方式三:接口注入</h3> <form action="${pageContext.request.contextPath}/request3.action" method="post"> name:<input type="text" name="name" /><br /> password:<input type="password" name="password" /><br /> <input type="submit" value="submit" /> </form>
②、Request3Action
public class Request3Action extends ActionSupport implements ServletRequestAware, ServletContextAware { private HttpServletRequest request; private ServletContext context; @Override public void setServletContext(ServletContext context) { this.context = context; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } @Override public String execute() throws Exception { HttpServletRequest request= ServletActionContext.getRequest(); //一、获取表单提交数据 Map<String, String[]> map=request.getParameterMap(); for (String key : map.keySet()) { System.out.println(key+" "+Arrays.toString(map.get(key))); } //二、向域对象中存入数据 request.setAttribute("reqName", "reqValue"); request.getSession().setAttribute("sessName", "sessValue"); context.setAttribute("appName", "appValue"); return super.execute(); } }
③、struts_request.xml
<action name="request3" class="com.xxx.web.action.Request3Action"> <result>success.jsp</result> </action>
四、结果页面配置
①、全局结果页面
在包中配置一次的值,包中所有action(没有配置局部结果页面)返回值与配置值一致,都跳转同一页面
<struts> <package name="strutsdemo" extends="struts-default" namespace="/"> <!-- 全局结果页面配置 --> <global-results> <!-- <result name="默认值success"> --> <result>success.jsp</result> </global-results> <action name="request1" class="com.xxx.web.action.Request1Action"> </action> <action name="request2" class="com.xxx.web.action.Request2Action"> </action> <action name="request3" class="com.xxx.web.action.Request3Action"> </action> </package> </struts>
②、局部结果页面
只对当前action有效,配置在action标准中
<struts> <package name="strutsdemo" extends="struts-default" namespace="/"> <global-results> <result>success.jsp</result> </global-results> <action name="request1" class="com.xxx.web.action.Request1Action"> <result>success.jsp</result> </action> <action name="request2" class="com.xxx.web.action.Request2Action"> <result>success.jsp</result> </action> <action name="request3" class="com.xxx.web.action.Request3Action"> <result>success.jsp</result> </action> </package> </struts>
- result标签用于配置页面的跳转。在result标签上有两个属性:
- name属性 :逻辑视图的名称。默认值:success
- type属性 :页面跳转的类型。
- dispatcher :默认值,请求转发。(Action转发JSP)
- redirect :重定向。(Action重定向JSP)
- chain :转发。(Action转发Action)
- redirectAction :重定向。(Action重定向Action)
- stream :Struts2中提供文件下载的功能。