【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 的實例(不會出現線程安全的問題)。



博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章