使用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的更多相关文章

  1. Spring(五):Spring&Struts2&Hibernate整合后,实现查询Employee信息

    背景: 基于之前两篇文章<Spring(三):Spring整合Hibernate>.<Spring(四):Spring整合Hibernate,之后整合Struts2>,了解了如 ...

  2. Spring Boot2(五):使用Spring Boot结合Thymeleaf模板引擎使用总结

    一.Thymeleaf概述 一般来说,常用的模板引擎有JSP.Velocity.Freemarker.Thymeleaf . SpringBoot推荐的 Thymeleaf – 语法更简单,功能更强大 ...

  3. 学习spring第五天 mybatis+spring的整合(maven多模块数据查询使用了分页和连接池),以及aop

    mybatis+spring的整合: 导入的依赖:1.数据库连接:mysql-connector-java 2.连接池:druid 3.servlet:javax.servlet-api 4.jstl ...

  4. Spring第五弹—–配置Spring管理的bean的作用域和生命周期

    singleton (默认方式) 在每个Spring IoC容器中一个bean定义只有一个对象实例.默认情况下会在容器启动时初始化bean,但我们可以指定bean节点的lazy-init=“true” ...

  5. Spring ( 五 )Spring之数据访问与事务管理

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Spring之数据访问 1.Spring数据访问工程环境搭建 ​ jdbc.properties配置 ...

  6. spring的webutils包。适用于访问httpservletrequest和httpservletresponse

    WebUtils位 于 org.springframework.web.util 包中的 WebUtils 是一个非常好用的工具类,它对很多 Servlet API 提供了易用的代理方法,降低了访问 ...

  7. 【Java EE 学习 53】【Spring学习第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【问题:整合hibernate之后事务不能回滚】

    一.Spring整合Hibernate 1.如果一个DAO 类继承了HibernateDaoSupport,只需要在spring配置文件中注入SessionFactory就可以了:如果一个DAO类没有 ...

  8. Java框架之Spring(五)

    本文主要介绍Spring中, 1 Spring JDBC 2 使用注解方式管理事务的传播行为 3 采用XML 方式配置事务 4 SH 整合 5 SSH 整合 一.Spring JDBC 1) 导包 , ...

  9. 【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问

    作者:ssslinppp       参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html  http://www.cnb ...

随机推荐

  1. HAWQ取代传统数仓实践(十一)——维度表技术之维度合并

    有一种合并维度的情况,就是本来属性相同的维度,因为某种原因被设计成重复的维度属性.例如,在销售订单示例中,随着数据仓库中维度的增加,我们会发现有些通用的数据存在于多个维度中.客户维度的客户地址相关信息 ...

  2. Epoll 实例

    服务端调试: [test@cs2 epoll]$ g++ epoll_server.cpp -o epoll_server -lpthread [test@cs2 epoll]$ ./epoll_se ...

  3. struts2.5框架使用通配符指定方法,某一个匹配不到

    在学习struts框架时经常会使用到通配符调用方法,如下:但奇怪的是,在validateName请求老报404,其他的都是ok的,开始以为是配置错了,检查好久才知道: <action name= ...

  4. hexo多主题切换

    今天看到一个朋友在github上面的issue 大概问题就是怎么在不同的电脑上面使用 git有个这么个东西Submoudle中文叫做子模块 具体使用教程看这里Git-工具-子模块 这里只说怎么搞hex ...

  5. CentOS虚拟机中安装VMWare Tools

    1.单击VMWare的[虚拟机]菜单,选择[安装VMWare Tools]命令 2.接着CentOS系统会自动挂载VMWare  Tools,并自动打开,如果没有打开可以自己去图形界面打开VMWare ...

  6. 【ASP.NET Web API2】Digest认证

    Digest摘要认证 对于Basic认证方案来说,被传输的认证凭证仅仅采用Base64编码,所以包含密码的认证凭证基本上可以视为明文传输.Digest认证在此基础上进行了改善,在一定程度上提高了安全系 ...

  7. rtrim,dirname,魔术常量用法

    $str = "Hello World!!!"; echo $str . "<br>"; echo rtrim($str,"!d" ...

  8. jq添加和移除事件的方法,prop和attr

    会在写条件判断的时候遇到,今天在判断没有剩余产品的时候,移除事件.当有产品的时候添加事件: 移除onClick事件: $("a").removeAttr("onclick ...

  9. Java-Maven-Runoob:Maven教程

    ylbtech-Java-Maven-Runoob:Maven教程 1.返回顶部 1. Maven 教程 Maven 翻译为"专家"."内行",是 Apache ...

  10. Py修行路 python基础(一)初识

    编译:把铭文代码执行前,先转成二进制,再执行,这个过程就叫编译. 编译型c,c++go特点:运行效率高依赖编译平台,linux 操作系统 跟CPU交互的接口,与windows不是完全一样不能跨平台,开 ...