Action类访问servlet
Action类有三种方式servlet:
(1)间接的方式访问Servlet API ---使用ActionContext对象
(2) 实现接口,访问Action时完成注入
(3)直接通过ServletActionContext获得Servlet的API
下面我来讲第一种:
(1)间接的方式访问Servlet API ---使用ActionContext对象
Struts2中提供了一个ActionContext类(当前Action的上下文对象),通过这个类可以访问Servlet API。下面是该类中提供的几个常用方法:
1.public static ActionContext getContext() :获得当前Action的ActionContext实例。 |
2.public Object get(Object key) :此方法类似于调用HttpServletRequest的getAttribute(String name)方法。 |
3.public void put(Object key, Object value) :此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。 |
4. public Map getParameters() :获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。 |
5. public Map getSession() :返回一个Map对象,该Map对象模拟了HttpSession实例。 |
6. public void setSession(Map session) : 直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。 |
7. public Map getApplication() :返回一个Map对象,该对象模拟了该应用的ServletContext实例。 |
8. public void setApplication(Map application) :直接传入一个Map实例,将该Map实例里 的key-value对转换成application的属性名- 属性值对。 |
1 import java.util.Map 2 import com.opensymphony.xwork2.ActionContext; 3 import com.opensymphony.xwork2.ActionSupport; 4 public class LoginAction1 extends ActionSupport{ 5 6 public String login() throws Exception{ 7 //获取ActionContext 8 ActionContext actionContext =ActionContext.getContext(); 9 //1.获取表单的请求参数 10 Map<String, Object> parameters=actionContext.getParameters(); 11 //因为用户名username可能有多个,所以返回数组 12 String [] values =(String[]) parameters.get("username"); 13 System.out.println("用户名是:"+values[0]); 14 15 //2.存取request 的Attribute 16 actionContext.put("company", "雨点的名字"); //相当于request.setAttribute("",""); 17 System.out.println(actionContext.get("company")); 18 19 //3.存取session 的Attribute 20 Map<String, Object> sessionMap=actionContext.getSession(); 21 sessionMap.put("age", 11);//相当于session.setAttribute("",""); 22 System.out.println(sessionMap.get("age")); 23 24 //4.存取application的Attribute 25 Map<String, Object> applicationMap=actionContext.getApplication(); 26 applicationMap.put("info", "下周考试第二阶段"); 27 System.out.println(applicationMap.get("info")); 28 return SUCCESS; 29 } 30 }
(2) 实现接口,访问Action时完成注入
如果是实现结构注入一般需要实现3个接口
(1)ServletContextAware: 实现此接口的Action可直接访问Web应用的ServletContext实例; |
(2)ServletRequestAware: 实现此接口的Action可直接访问Web应用的HttpServletRequest实例; |
(3)ServletResponseAware: 实现此接口的Action可直接访问Web应用的HttpServletResponset实例 |
1 import java.util.Map; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.ServletResponse; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 import org.apache.struts2.interceptor.RequestAware; 8 import org.apache.struts2.interceptor.ServletRequestAware; 9 import org.apache.struts2.interceptor.ServletResponseAware; 10 import org.apache.struts2.util.ServletContextAware; 11 12 import com.opensymphony.xwork2.ActionContext; 13 import com.opensymphony.xwork2.ActionSupport; 14 15 public class LoginAction2 extends ActionSupport implements ServletRequestAware, 16 ServletContextAware,ServletResponseAware { 17 18 private HttpServletRequest request; 19 20 private ServletContext context; 21 22 private HttpServletResponse response; 23 24 public String login() throws Exception{ 25 //1.获取表单的请求参数 26 System.out.println(request.getParameter("username")); 27 28 //2.存取request 的Attribute 29 request.setAttribute("company","hzgg" ); 30 31 //3.存取session 的Attribute 32 request.getSession().setAttribute("age", 50); 33 34 //4.存取application的Attribute 35 context.setAttribute("info", "今天下午你们可以出去玩"); 36 37 return SUCCESS; 38 39 } 40 //实现ServletRequestAware接口必须实现的方法 41 public void setServletRequest(HttpServletRequest request) { 42 this.request=request; 43 } 44 //实现ServletContextAware接口必须实现的方法 45 public void setServletContext(ServletContext context) { 46 this.context=context; 47 } 48 //实现ServletResponseAware接口必须实现的方法 49 public void setServletResponse(HttpServletResponse response) { 50 this.response=response; 51 } 52 53 }
(3)使用ServletActionContext工具类访问Servlet API
在ServletActionContext工具类中常用的几个方法(都是静态方法):
(1)PageContext getPageContext(): 取得应用的PageContext对象; |
(2)HttpServletRequest getRequest(): 取得该应用的HttpServletRequest对象; |
(3)HttpServletRequest getResponse(): 取得该应用的HttpServletResponse对象; |
(4)ServletContext getServletContext(): 取得该应用的ServletContext对象。 |
1 import org.apache.struts2.ServletActionContext; 2 import com.opensymphony.xwork2.ActionSupport; 3 4 public class LoginAction3 extends ActionSupport { 5 6 public String login() throws Exception { 7 // 1.获取表单的请求参数 8 String username= ServletActionContext.getRequest().getParameter("username"); 9 System.out.println(username); 10 11 // 2.存取request 的Attribute 12 ServletActionContext.getRequest().setAttribute("company", "haha"); 13 14 // 3.存取session 的Attribute 15 ServletActionContext.getRequest().getSession().setAttribute("age", 40); 16 17 // 4.存取application的Attribute 18 ServletActionContext.getServletContext().setAttribute("info", "今天下课你们可以约会去了"); 19 20 return SUCCESS; 21 } 22 }
下面我来写一个用第三种方法实现访问servlet,从jsp到struts.xml在到Action类,最后从页面显示结果供大家学习:
jsp界面:
start.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> </head> <body> <form action="${pageContext.request.contextPath }/hello.action"> 姓名:<input type="text"> <input type="submit" value="提交"> </form> </body> </html>
struts.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <package name="default" extends="struts-default"> 7 <action name="hello" class="com.guigu.struts.action2.LoginAction3" method="login"> 8 <result>/result.jsp</result> 9 </action> 10 </package> 11 </struts>
result.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> </head> <body> <p>${company}</p> <p>${age}</p> <p>${info}</p> </body> </html>
运行结果如下:
当点击提交的时候
发现数据已经从Action类中转发到了界面
这篇文章就讲到这里,欢迎大家指点和点评!