Struts2是web层框架,主要有两个方面的作用:
1 . 获取前端的客户端输入
2 . 响应后端输出
常常使用到 Servlet API 中相应的方法。
通常有以下三种方式获取 request,response,session,application 对象信息。
1 . Action 通过 ActionContext() 类访问Servlet API
2 . Action 通过实现 XxxAware 接口直接访问 Servlet API
3 . 使用 ServletActionContext 直接访问 Servlet API
所有的Struts2 文章,都已经在web.xml 中添加了StrutsPrepareAndExecuteFilter 过滤器
<!-- 配置struts2的过滤器 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
一. 获取Servlet API 对象
一.一 通过 ActionContext() 类访问 Servlet API
一.一.一 ActionContext 类的主要方法
一.一.二 写Demo验证一下
一.一.二.一 编写Action 类 ActionContextDemo
public class ActionContextDemo extends ActionSupport{ private static final long serialVersionUID = 1L; // 前端传入一个参数 为 name private String name; /* * 通过此方法,展示一下,将数据放置到 request域,session域,application域的用法。 * */ public String showData(){ ActionContext actionContext=ActionContext.getContext(); //获取 application 作用域 Map<String, Object> applicationData=actionContext.getApplication(); //获取application的值 Integer count=(Integer)applicationData.get("count"); if(count==null){ count=1; }else{ count=count+1; } //设置application的值 applicationData.put("count", count); //获取session 作用域 Map<String,Object> sessionData=actionContext.getSession(); //放置到session域 sessionData.put("loginName",name); if("两个蝴蝶飞".equals(sessionData.get("loginName"))){ //放置到request域 actionContext.put("msg","第一种方式 :欢迎您,"+sessionData.get("loginName")); //返回success return SUCCESS; } //放置到request域 actionContext.put("msg","服务器提示:登录失败"); return ERROR; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
一.一.二.二 配置 struts.xml 文件
<package name="hello" extends="struts-default" namespace="/"> <!-- 配置第一种方式 --> <action name="actionContextDemo" class="com.yjl.web.action.ActionContextDemo" method="showData"> <result name="success">/WEB-INF/content/success1.jsp</result> <result name="error">/WEB-INF/content/error.jsp</result> </action> </package>
一.一.二.三 编写前端文件
success1.jsp 里面的内容为:
<body> 本站访问次数:${applicationScope.count} <br/> ${sessionScope.loginName},您已经成功登录<br/> ${requestScope.msg}<br/> </body>
error.jsp 里面的内容为:
<body> ${requestScope.msg}<br/> </body>
一.一.二.四 重启服务器,进行验证
当输入网址为: http://localhost:8080/Struts_API/actionContextDemo 时,没有name值,提示登录失败
当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=两个蝴蝶飞,name正确,提示登录成功
当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=老蝴蝶,name值错误,提示登录失败
可以正常的传输数据。
这种方式,只能往request,session和applicaiton中进行存数据,取数据,只能对数据进行维护,不能像真正的request,response对象提供的那些方法一样强大。 如获取客户端ip,添加cookie 等, 用这种方法就无法实现了。
一.二 通过实现XxxAware 接口实现Servlet API 对象
Struts2针对Servlet 的API 对象,提供了三种接口, HttpServletRequestAware 接口,HttpServletResponseAware接口, ServletContextAware 接口。 其中,session对象可以通过request对象进行获取,所以就没有提供关于session的接口。
一.二.一 XxxAware 接口提供的方法
ServletRequestAware 接口提供了一个 setServletRequest() 方法,用于获取request对象
public abstract interface ServletRequestAware { public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest); }
ServletResponseAware 接口提供了一个 setServletResponse() 方法,用于获取response对象
public abstract interface ServletResponseAware { public abstract void setServletResponse(HttpServletResponse paramHttpServletResponse); }
ServletContextAware 接口提供了一个 setServletContext()方法,用于获取application对象
public abstract interface ServletContextAware { public abstract void setServletContext(ServletContext paramServletContext); }
一.二.二 写Demo验证一下
一.二.二.一 编写Action 类 AwareDemo
public class AwareDemo extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{ private static final long serialVersionUID = 1L; private String name; //接收 application private ServletContext application; //接收request private HttpServletRequest request; //接收response private HttpServletResponse response; //session可以通过 request 进行获取 private HttpSession session; @Override public void setServletContext(ServletContext application) { this.application=application; } @Override public void setServletResponse(HttpServletResponse response) { this.response=response; } @Override public void setServletRequest(HttpServletRequest request) { this.request=request; this.session=request.getSession(); } public String showData(){ //获取application的值 Integer count=(Integer)application.getAttribute("count"); if(count==null){ count=1; }else{ count=count+1; } //设置application的值 application.setAttribute("count",count); //放置到session域 session.setAttribute("loginName",name); if("两个蝴蝶飞".equals(session.getAttribute("loginName"))){ //放置到request域 request.setAttribute("msg","第二种方式:欢迎您,"+session.getAttribute("loginName")); //展示ip 地址 request.setAttribute("ip",request.getLocalAddr()); //通过response 对象,设置cookie Cookie cookie=null; try { cookie = new Cookie("userName", URLEncoder.encode(session.getAttribute("loginName").toString(),"UTF-8")); } catch (UnsupportedEncodingException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } cookie.setMaxAge(60*60); cookie.setPath("/"); response.addCookie(cookie); //返回success return SUCCESS; } //放置到request域 request.setAttribute("msg","服务器提示:登录失败"); return ERROR; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
里面多提供了 request获取客户端ip和 response添加 cookie的操作
一.二.二.二 配置struts.xml 文件
<!-- 配置第二种方式 --> <action name="awareDemo" class="com.yjl.web.action.AwareDemo" method="showData"> <result name="success">/WEB-INF/content/success2.jsp</result> <result name="error">/WEB-INF/content/error.jsp</result> </action>
一.二.二.三 编写前端界面
success2.jsp, 内容主要是:
<!--引入jquery文件,网络版的 --> <script src="http://code.jquery.com/jquery-latest.js"></script> <body> 本站访问次数:${applicationScope.count} <br/> ${sessionScope.loginName},您已经成功登录<br/> ${requestScope.msg}<br/> ip:${requestScope.ip}<br/> cookie值:<span id="cookieValue"></span> <script> $(function(){ var username = decodeURIComponent("${cookie.userName.value}");//如果为空,使用解码后为空字符串 if(!username.length==0){ $("#cookieValue").text(username); } }) </script> </body>
一.二.二.四 重启服务器,进行验证
输入网址: http://localhost:8080/Struts_API/awareDemo?name=两个蝴蝶飞
ip地址和cookie 均可以正常获取。
用js 脚本,解决了 cookie 中文乱码的问题。
这种方式,还需要实现接口,重写里面的方法,如果需要同时获取request,response,application对象,那么需要实现三个接口,太复杂。