Spring学习笔记:spring整合web之spring-web架包的引用(WebApplicationContextUtils注入容器)
WebApplicationContextUtils
一、Spring整合web之前
案例:给部门列表添加新部门
import org.apache.log4j.Logger; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.servlet.annotation.WebServlet; @WebServlet(name = "DeptServlet", urlPatterns = "/DeptServlet") public class DeptServlet extends javax.servlet.http.HttpServlet { private static Logger logger = Logger.getLogger(DeptServlet.class); @Override protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { request.setCharacterEncoding("UTF-8"); String action = request.getParameter("action"); String deptname = request.getParameter("name"); int id = Integer.parseInt(request.getParameter("id")); ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); IDeptService deptService = (IDeptService) context.getBean("deptService"); Dept dept = new Dept(); dept.setDeptname(deptname); int i = deptService.addDept(dept); logger.debug("执行"+i+"条数据!"); logger.debug(action+"\n"+deptname+id); if (i>0){ request.getRequestDispatcher("success.jsp").forward(request,response); }else{ response.sendRedirect("index.jsp"); } } @Override protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { this.doPost(request, response); } }
<html> <head> <base href="<%=basePath%>"> <title>添加部门</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta name="Content-Type" content="text/html; charset=utf-8"/> <%--<link rel="stylesheet" type="text/css" href="style.css">--%> </head> <body> <h2>添加部门</h2> <form action="/DeptServlet?action=add" method="post"> 部门:<input type="text" name="name"/> 序号:<input type="number" name="id"/> <input type="submit" value="添加"/> </form> <h2>修改部门</h2> <form action="/empServlet?action=modify" method="post"> 部门:<input type="text" name="name"/> 部门新名称:<input type="text" name="newname"/> <input type="submit" value="修改"/> </form> </body> </html>
二、发现问题(资源浪费)
tips:有什么办法可以只创建一次ApplicationContext对象吗?在这里可以使用监听器,在系统启动时创建一个ApplicationContext对象,
之后servlet引用对象即可:::::
三、使用监听器管理ApplicationContext对象(整合Spring)
1.系统添加spring-web整合架包
<!--Web整合--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.2.RELEASE</version> </dependency>
2.在web.xml文件中配置监听器
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--Servlet共享applicationContext--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--配置上下文监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
3.Servlet方法中使用WebApplicationContextUtils创建ApplicationContext对象
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
修改案例:
import org.apache.log4j.Logger;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "DeptServlet", urlPatterns = "/DeptServlet")
public class DeptServlet extends javax.servlet.http.HttpServlet {
private static Logger logger = Logger.getLogger(DeptServlet.class);
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
request.setCharacterEncoding("UTF-8");
String action = request.getParameter("action");
String deptname = request.getParameter("name");
int id = Integer.parseInt(request.getParameter("id"));
//ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
IDeptService deptService = (IDeptService) context.getBean("deptService");
Dept dept = new Dept();
dept.setDeptname(deptname);
int i = deptService.addDept(dept);
logger.debug("执行"+i+"条数据!");
logger.debug(action+"\n"+deptname+id);
if (i>0){
request.getRequestDispatcher("success.jsp").forward(request,response);
}else{
response.sendRedirect("index.jsp");
}
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
this.doPost(request, response);
}
}
使用框架编写程序,也是一个资源整合和优化的过程。