Struts2的Servlet的API的访问

在使用Struts2的框架的过程中,发现Struts2ServletAPI是解耦合的。在实际开发中,经常使用到Servlet的API,比如进行登录,将用户的信息保存到session中,有的时候需要向页面输出一些内容,用到response对象。涉及到Servlet的API的访问。

1 完全解耦合的方式

1.1 编写Action

public class ServletAPIActionDemo extends ActionSupport{	
//完全解耦合的方式
    public String executeByStruts2ActionContext() throws Exception{
		//利用Struts2中的对象的ActionContext对象
		ActionContext context = ActionContext.getContext();
		//调用ActionContext中的方法
		//类似于request.getParameterMap();
		Map<String, Object> map = context.getParameters();
		for(String key : map.keySet()) {
			String[] values = (String[]) map.get(key);
			System.out.println(key+" "+Arrays.toString(values));
		}
		System.out.println(map);
		//向域对象中存入数据
		//相当于request.setAttribute();
		context.put("reqName", "ykd");
		//相当于session.setAttribute();
		context.getSession().put("sessName", "James");
		//相当与application.setAttribute();
		context.getApplication().put("appName","Kobe");
		return SUCCESS;		
	}
}

1.2 Action的配置 

在struts.xml中配置好action,并在web.xml中配置核心过滤器

<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo1" extends="struts-default" namespace="/">
		<action name="servletAPIAction_*" class="com.itykd.web.action.ServletAPIActionDemo" method="{1}">
		    <result name="success">/demo/demo2.jsp</result>
		</action>
	</package>
</struts>

1.3 jsp页面编写

1.3.1 demo1.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>
    <h3>完全解耦合的方式</h3>
    <form action="${pageContext.request.contextPath }/servletAPIAction_executeByStruts2ActionContext" method="post">
    	用户名:<input type="text" name="name"><br/>
    	密码:<input type="password" name="password"><br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

1.3.2 demo2.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>
<h3>Struts2获得Servlet的API</h3>
<h4>显示数据</h4>
${reqName}
${sessName}
${appName}
</body>
</html>

注意:这种方式只能获得代表requestsessionapplication的数据的Map集合,不能操作这些对象的本身的方法(只能获得对应域对象(如request)的参数,也就是说只能操作它的map中的值,不能获得对应的域对象)。

2 使用Servlet的API的原生方式(***)

action的配置和jsp页面基本一样,只需要把demo1.jsp中的action提交的路径改一下即可

public class ServletAPIActionDemo extends ActionSupport{
    public String executeByOriginalServletActionContext() throws Exception{
		HttpServletRequest request = ServletActionContext.getRequest();
		Map<String, String[]> map = request.getParameterMap();
		for(String key : map.keySet()) {
			String[] values = map.get(key);
			System.out.println(key+" "+Arrays.toString(values));
		}
		//向域对象中保存数据
		request.setAttribute("reqName", "ykd");
		request.getSession().setAttribute("sessName", "James");
		ServletActionContext.getServletContext().setAttribute("appName", "Kobe");
		return SUCCESS;		
		
	}
}

注意:这种方式可以操作域对象的数据,同时也可以获得对象的方法

3 使用接口注入的方式(不常用)

要实现ServletRequestAware等接口,重写setServletRequest方法,并增加相应的成员变量

package com.itykd.web.action;

import java.util.Arrays;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;

public class ServletAPIActionDemo2 extends ActionSupport implements ServletRequestAware,ServletContextAware{

	private ServletContext context;
	private HttpServletRequest request;
	public String executeByInterfaceInjection() {
		Map<String, String[]> map = request.getParameterMap();
		for(String key : map.keySet()) {
			String[] values = map.get(key);
			System.out.println(key+" "+Arrays.toString(values));	
		}
		//向域对象中存数据
		request.setAttribute("reqName", "ykd");
		request.getSession().setAttribute("sessName", "James");
		context.setAttribute("appName", "Kobe");
		
		return SUCCESS;
	}
	
	@Override
	public void setServletContext(ServletContext context) {
		// TODO Auto-generated method stub
		this.context = context;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request = request;
		
	}

}

猜你喜欢

转载自blog.csdn.net/W2612888/article/details/85041538