【Struts2笔记整理四】Servlet的API的访问

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106677358







在实际开发中,经常会用到 Servlet 的 API。比如登录时,会将用户的信息保存到 Session 中,有的时候需要向页面输出一些内容,会用到 Response 对象。这就涉及到了 Servlet 的 API 的访问了。

本篇博客主要讲解如何通过 Struts2 框架使用 Servlet 的 API 访问,在 Struts2 框架中使用 Servlet 的 API 访问有三种方式:

  1. 完全解耦合方式;
  2. 使用 Servlet 的 API 原生方式;
  3. 接口注入方式。

一、完全解耦合的方式

1、编写 JSP

<body>
	<h3>方式一:完成解耦合的方式</h3>
	<form action="${ pageContext.request.contextPath }/requestDemo1.action" method="post">
		姓名:<input type="text" name="name"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="提交">
	</form>
</body>

2、编写 Action 类

// 该类的访问路径是:/requestDemo1.action
public class RequestDemo1 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// 一、接收参数
		// 利用 Struts2 中的对象 ActionContext 对象 
		ActionContext context = ActionContext.getContext();
		// 调用 ActionContext 中的方法
		// 类似于 Map<String,String[]> 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));
		}
		
		// 二、向域对象中存入数据
		context.put("reqName", "reqValue");   // 相当于 request.setAttribute();
		context.getSession().put("sessName", "sessValue");   // 相当于 session.setAttribute();
		context.getApplication().put("appName", "appValue");   // 相当于 application.setAttribute();
		
		return SUCCESS;
	}
}

注意: 这种方式只能获得 request、session、application 数据的 Map 集合或往进存值,但不能操作这些对象本身的方法。



二、使用 Servlet 的 API 原生方式

1、编写 JSP

<body>
	<h3>方式二:使用原生的方式访问</h3>
	<form action="${ pageContext.request.contextPath }/requestDemo2.action" method="post">
		姓名:<input type="text" name="name"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="提交">
	</form>
</body>

2、编写 Action 类

// 该类的访问路径是:/requestDemo2.action
public class RequestDemo2 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// 一、接收参数
		// 直接获得 request 对象,通过 ServletActionContext
		HttpServletRequest request = ServletActionContext.getRequest();
		Map<String,String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			String[] values = (String[]) map.get(key);
			System.out.println(key + "  " + Arrays.toString(values));
		}

		// 二、向域对象中存入数据
		// 向 request 中保存数据
		request.setAttribute("reqName", "reqValue2");
		// 向 session 中保存数据
		request.getSession().setAttribute("sessName", "sessValue2"); 
		// 向 application 中保存数据
		ServletActionContext.getServletContext().setAttribute("appName", "appValue2");
		
		System.out.println(request.getServletContext() == ServletActionContext.getServletContext());   // true
		
		return SUCCESS;
	}
}


三、接口注入方式

1、编写 JSP

<body>
	<h3>方式三:使用接口注入的方式</h3>
	<form action="${ pageContext.request.contextPath }/requestDemo3.action" method="post">
		姓名:<input type="text" name="name"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="提交">
	</form>
</body>

2、编写 Action 类

// 该类的访问路径是:/requestDemo3.action
public class RequestDemo3 extends ActionSupport implements ServletRequestAware,ServletContextAware {
	private HttpServletRequest request;
	private ServletContext servletContext;

	@Override
	public String execute() throws Exception {
		// 一、接收参数
		// 直接获得 request 对象,通过 ServletActionContext
		HttpServletRequest request = ServletActionContext.getRequest();
		Map<String,String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			String[] values = (String[]) map.get(key);
			System.out.println(key + "  " + Arrays.toString(values));
		}

		// 二、向域对象中存入数据
		// 向 request 中保存数据
		request.setAttribute("reqName", "reqValue3");
		// 向 session 中保存数据
		request.getSession().setAttribute("sessName", "sessValue3"); 
		// 向 application 中保存数据
		servletContext.setAttribute("appName", "appValue3");
		
		return SUCCESS;
	}

	@Override
	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
}

Servlet 是单例的,多个程序访问同一个 Servlet 只会创建一个 Servlet 的实例。Action 是多例的,一次请求,创建一个 Action 的实例(不会出现线程安全的问题)。



博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/106677358