版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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 的实例(不会出现线程安全的问题)。