Spring总结五:小结 使用spring访问servlet
使用spring访问servlet
首先先建一个web项目,并在pom.xml中引入依赖包:spring-context和jsp servlet相关包,以及tomcat插件
其次建一个spring的配置文件applicationContext.xml,并在配置中开启注解扫描:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--开启扫描-->
<context:component-scan base-package="com.zy"></context:component-scan>
</beans>
注意我们先演示一个有问题的方式:
我们模拟从index.jsp 访问 LoginServlet:
UserService
public interface UserService {
public boolean login();
}
@Service("userService")//使用注解
public class UserServiceImpl implements UserService {
public UserServiceImpl() {
System.out.println("userService 构造方法...");
}
@Override
public boolean login() {
System.out.println("service login...");
return true;
}
}
index.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>Hello World!</h2>
<a href="${pageContext.request.contextPath}/HelloServlet">helloservlet</a>
</body>
</html>
LoginServlet
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = ac.getBean("userService", UserService.class);//spring容器创建service对象
boolean isOk = service.login();
response.setContentType("text/html;charset=utf-8");
if (isOk) {
response.getWriter().print("登录成功,3秒跳转index页面");
response.setHeader("refresh", "3;url=" + request.getContextPath() + "/index.jsp");
}else {
response.getWriter().print("登录失败");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
运行tomcat点击了两次index页面上的超链接(访问了两次LoginServlet),后台输出为:

前台页面也显示登录成功,可以看出访问servlet是成功了,但是有一个问题:
问题是每次访问servlet都会重新创建UserService对象,现在我们只有一个对象,如果以后有很多个对象,那每次访问servlet的时候,
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
这句代码都会把对象创建出来,会很浪费资源,那么怎么解决这个问题呢?
现在我们演示正确的方式:
添加监听器,用来监听程序启动,当启动的时候,把所有的对象都创建出来,以后再用的之后直接用,不再创建:
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>
<!--告诉监听器spring配置文件是谁-->
<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> <servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.zy.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
上面配置监听器的ContextLoaderListener,需要在pom.xml中引入下面这个包:
<!--web.xml中需要配置监听器,这里就需要导入这个包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
这次我们加上dao层:
public interface UserDao {
public boolean login();
}
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public UserDaoImpl() {
System.out.println("userDao 构造方法...");
}
@Override
public boolean login() {
System.out.println("dao login...");
return true;
}
}
service:
public interface UserService {
public boolean login();
}
@Service("userService")
public class UserServiceImpl implements UserService {
@Value("#{userDao}")//注入UserDao
private UserDao userDao;
public UserServiceImpl() {
System.out.println("userService 构造方法...");
}
@Override
public boolean login() {
System.out.println("service login...");
return userDao.login();
}
}
配置完成以后,LoginServlet中获取ApplicationContext的方式改变一下:
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//使用下面的方法 从工具类中获取ApplicationContext 需要把当前servlet的ServletContext当做参数传进去
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
UserService service = ac.getBean("userService", UserService.class);
boolean isOk = service.login();
response.setContentType("text/html;charset=utf-8");
if (isOk) {
response.getWriter().print("登录成功,3秒跳转index页面");
response.setHeader("refresh", "3;url=" + request.getContextPath() + "/index.jsp");
} else {
response.getWriter().print("登录失败");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
当程序启动的时候,两个实现类都被创建出来了:

这样,每次访问LoginServlet的时候,就不会重复创建对象了,只会调用对象的方法(访问了两次):

Spring总结五:小结 使用spring访问servlet的更多相关文章
- Spring(五):Spring&Struts2&Hibernate整合后,实现查询Employee信息
背景: 基于之前两篇文章<Spring(三):Spring整合Hibernate>.<Spring(四):Spring整合Hibernate,之后整合Struts2>,了解了如 ...
- Spring Boot2(五):使用Spring Boot结合Thymeleaf模板引擎使用总结
一.Thymeleaf概述 一般来说,常用的模板引擎有JSP.Velocity.Freemarker.Thymeleaf . SpringBoot推荐的 Thymeleaf – 语法更简单,功能更强大 ...
- 学习spring第五天 mybatis+spring的整合(maven多模块数据查询使用了分页和连接池),以及aop
mybatis+spring的整合: 导入的依赖:1.数据库连接:mysql-connector-java 2.连接池:druid 3.servlet:javax.servlet-api 4.jstl ...
- Spring第五弹—–配置Spring管理的bean的作用域和生命周期
singleton (默认方式) 在每个Spring IoC容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init=“true” ...
- Spring ( 五 )Spring之数据访问与事务管理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Spring之数据访问 1.Spring数据访问工程环境搭建 jdbc.properties配置 ...
- spring的webutils包。适用于访问httpservletrequest和httpservletresponse
WebUtils位 于 org.springframework.web.util 包中的 WebUtils 是一个非常好用的工具类,它对很多 Servlet API 提供了易用的代理方法,降低了访问 ...
- 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】
一.Spring整合Hibernate 1.如果一个DAO 类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了:如果一个DAO类没有 ...
- Java框架之Spring(五)
本文主要介绍Spring中, 1 Spring JDBC 2 使用注解方式管理事务的传播行为 3 采用XML 方式配置事务 4 SH 整合 5 SSH 整合 一.Spring JDBC 1) 导包 , ...
- 【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问
作者:ssslinppp 参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnb ...
随机推荐
- 可视化CNN神经网路第一层参数
在上Andrew Ng的课的时候搜集到了课程里面自带的显示NN参数的代码,但是只能显示灰度图,而且NN里的参数没有通道的概念.所以想要获得可视化CNN的参数,并且达到彩色的效果就不行了. 所以就自己写 ...
- php小练习——实现几种不同的金字塔
首先,从简单的着手,打印出金字塔的右半部分,代码如下 <?php $n=5; //金字塔行数 //外层的for循环控制层数 for($i=1;$i<=$n;$i++){ //内层的for循 ...
- [转载] ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame
一.AVPacket /** * AVPacket 作为解码器的输入 或 编码器的输出. * 当作为解码器的输入时,它由demuxer生成,然后传递给解码器 * 当作为编码器的输出时,由编码器生成,然 ...
- UI多线程调用:线程间操作无效: 从不是创建控件"Form1"的线程访问它.
有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数. 问题原因是.net2.0以后拒绝多 ...
- keycloak && docker安装 &&spring boot 集成使用
1. 基础依赖 a. docker mysql b. dokcer keycloak-mysql 2. 安装 mysql (注意实际使用最好使用本地数据卷) docker run --na ...
- 也谈TDD,以及三层架构、设计模式、ORM……没有免费的午餐,选择了,必付出代价
想在园子里写点东西已经很久了,但一直没有落笔,忙着做 一起帮 的开发直播,还有些软文做推广,还要做奶爸带孩子,还要……好吧,我承认,真正的原因是: 太特么的难写了! 但再难写也要写啊,要等到“能写好了 ...
- (转)TextView 设置背景和文本颜色的问题
在做一个项目,突然遇到如下问题 比如:在color.xml中定义了几个颜色 <color name="white">#FFFFFF</color> < ...
- mybatis+druid+springboot 注解方式配置多个数据源
1\数据库配置 #test数据源 spring.datasource.test.url=jdbc:mysql:///db?useUnicode= spring.datasource.test.user ...
- lua语法基本
lua的下载 http://luabinaries.sourceforge.net/点击所要下载的版本比如我下的是5.3.3https://sourceforge.net/projects/luabi ...
- fragment用法
简单用法: 1.新建布局.新建fragment类 2.在activity_main.xml中添加fragment <LinearLayout...... <fragment android ...