版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106677358
文章目錄
在實際開發中,經常會用到 Servlet 的 API。比如登錄時,會將用戶的信息保存到 Session 中,有的時候需要向頁面輸出一些內容,會用到 Response 對象。這就涉及到了 Servlet 的 API 的訪問了。
本篇博客主要講解如何通過 Struts2 框架使用 Servlet 的 API 訪問,在 Struts2 框架中使用 Servlet 的 API 訪問有三種方式:
- 完全解耦合方式;
- 使用 Servlet 的 API 原生方式;
- 接口注入方式。
一、完全解耦合的方式
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 的實例(不會出現線程安全的問題)。