1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上。 * 提供JSP注册的页面,演示下面这三种方式 <h3>注册页面</h3> <form action="${ pageContext.request.contextPath }/xxx.action" method="post"> 姓名:<input type="text" name="username" /><br/> 密码:<input type="password" name="password" /><br/> <input type="submit" value="注册" /> </form> 2. 完全解耦合的方式(完全不需要Servlet的api)(使用的核心类为:
ActionContext类)
* 如果使用该种方式,Struts2框架中提供了一个类,ActionContext类,该类中提供一些方法,通过方法获取Servlet的API
* 一些常用的方法如下 * static ActionContext getContext() -- 获取ActionContext对象实例
(ActionContext是上下文,也就是明星和经纪人的关系,action相当于明星,什么都不用准备,而actionContext就相当于经纪人(上下文),经纪人去拿action需要的东西。)
* java.util.Map<java.lang.String,java.lang.Object> getParameters() -- 获取请求参数,相当于request.getParameterMap();
* java.util.Map<java.lang.String,java.lang.Object> getSession() -- 获取的代表session域的Map集合,就相当于操作session域。
* java.util.Map<java.lang.String,java.lang.Object> getApplication() -- 获取代表application域的Map集合
* void put(java.lang.String key, java.lang.Object value) -- 注意:向request域中存入值。(直接使用put是向request域中存放数据)
例:
1.创建一个Action(demo1Action),内容如下:
import java.util.Arrays; import java.util.Map; import java.util.Set; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /* * 完全解耦合方式,使用servlet的api */ public class demo1Action extends ActionSupport{ @Override public String execute() throws Exception { //完全解耦合方式 ActionContext context=ActionContext.getContext(); //封装所有参数到一个map集合中 Map<String, Object> map=context.getParameters(); //再写一个表单来获取参数表单为index.jsp //遍历获取数据 Set<String> keys=map.keySet(); for(String key:keys){ //因为从一个标签中获得的值不止一个,如爱好可能有多个,所以这里我们使用数组 String[] values=(String[]) map.get(key); //姓名和密码只有一个,所以这里我们又强转为了字符串 System.out.println(key+"..."+Arrays.toString(values)); } //如果向request对象中存入值 context.put("msg", "jack");//向request域中存放数据 request只有在请求转发时才有效 context.getSession().put("msg", "rose");//向session中存放数据。通过getSession获得Session域对象 context.getApplication().put("msg", "tom");//向应用域中存放数据。通过getAppication获得整个应用 return SUCCESS; } }
2.再写一个表单来获取参数表单为index.jsp,将获取到的数据存储到map集合中:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <h3>完全解耦合的方式使用servlet的api</h3> <form action="${ pageContext.request.contextPath }/demo1Action.action" method="post"> 姓名<input type="text" name="username"/><br/> 密码<input type="text" name="password"/><br/> <input type="submit" value="登录"> </form> </body> </html>
3.最后demo1Action返回值为SUCCESS,跳转到suc界面,所以书写suc.jsp文件,suc.jsp文件中的内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> 使用el表达式获取值<br/> ${requestScope.msg}<br/> ${sessionScope.msg}<br/> ${applicationScope.msg}<br/> </body> </html>
4.为了访问Action,需要对其进行配置,struts.xml文件的内容如下:
<?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 name="default" namespace="/" extends="struts-default"> <action name="demo1Action" class="com.huida.action.demo1Action"> <result name="success">/suc.jsp</result><!-- 从demo1Action中跳转到suc.jsp页面,默认的方式为请求转发的方式。如果在result标签中设定转发类型为重定向redirect,那么在request域中就不能通过put获取到值 --> </action> </package> </struts>
运行index.jsp后,在浏览器中的表单中输入姓名以及密码,然后点击提交。
在控制台输出如下内容,说明通过ActionContext的getparameters已经获取到表单中的数据:
同时浏览器跳转到suc.jsp页面中,浏览器显示内容如下,说明request域、session域、应用域已经获得了在action中放的数据:
通过配置文件我们可以看到,直接从action跳转到suc.jsp页面中,然后获得request域中的内容。而request只存在于请求转发过程中,所以从demo1Action中 跳转到suc.jsp页面,默认的方式为请求转发方式。如果在result标签中设定转发类型为重定向redirect,那么在request域中就不能通过put获取到值。
3. 使用原生Servlet的API的方式(通过ServletActionContext得到request)(核心类为ServletActionContext类)
* Struts2框架提供了一个类,ServletActionContext,该类中提供了一些静态的方法
* 具体的方法如下
* getPageContext()
* getRequest()
* getResponse()
* getServletContext()