以前の春の学習では、実際のサーブレットを使用せずにWebレイヤーをシミュレートしてきました。次に、Tomcatサーバーを起動し、サーブレット/ jsp座標をインポートして、使い慣れた実際のWeb環境に入ります。
Web環境はおなじみのservletContext / Session / Requestドメインをもたらします-それについて考えてapp
ください、Springコンテナ()はどのドメインに配置されるべきですか?
理解:SpringコンテナとservletContextドメイン
new
アプリがあるたびに明らかな欠点があります。構成ファイルが複数回読み込まれ、コンテナー(コンテキストオブジェクト)が複数回作成されます。
私たちが慣れ親しんでいるWeb環境に入ると、この問題を解決するための新しいアイデアがあります。
servletContextドメインは最大のドメインであり、Webプロジェクトが開始されるたびに1回だけロードされます。したがって、ServletContextListenerを使用してWebプロジェクトを監視します。Webプロジェクトが開始されると、アプリが作成され、servletContextドメインに保存されます。アプリを使用する必要があるたびに、アプリをドメインから削除します。
つまり、Springコンテナは、Webプロジェクトの開始時に1回だけ作成されます。new
複数回使用して作成する問題が解決されました。
実装:アプリをservletContextドメインに手動で統合します
①手書きのContextLoaderListenerリスナー
public class ContextLoaderListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 1.在web项目启动时创建app上下文对象
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.将app上下文对象存储到最大的域(ServletContext域)中
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute("app", app);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
②web.xmlでリスナーを設定します
<!-- 配置监听器 -->
<listener>
<listener-class>com.samarua.listener.ContextLoaderListener</listener-class>
</listener>
③使用(ドメインからアプリを削除)
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletContext域
ServletContext servletContext = req.getServletContext();
// 从域中取出Spring容器
ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
// 用一下试试 >_<
UserService userService = app.getBean(UserService.class);
userService.sayHi();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
実装:Springが提供するリスナークラスとツールクラスを使用する
①web.xmlで設定する
<!-- 全局初始化参数(这是因为在Spring写好的监听器中,xml配置文件的名称不是写死的,而是在这里指定) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置监听器(这次,我们使用Spring写好的监听器) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
②使用(WebApplicationContextUtilsツールクラスからアプリを取り出します)
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// // 获取servletContext域
ServletContext servletContext = req.getServletContext();
// 从工具类中取出app
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
// 用一下试试 >_<
UserService userService = app.getBean(UserService.class);
userService.sayHi();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}