一起学Spring之Web基础篇
概述
在日常的开发中Web项目集成Spring框架,已经越来越重要,而Spring框架已经成为web开发的主流框架之一。本文主要讲解Java开发Web项目集成Spring框架的简单使用,以及使用Spring和不使用Spring框架,两者之间的差异。 仅供学习分享使用,如有不足之处,还请指正。
页面访问流程图
本示例的页面访问流程图如下所示:

不使用Spring框架的开发流程
步骤如下:
1. 新增Service和Dao对应的类及接口实现
如下所示:在Service中对Dao进行了强关联
package com.hex.Dao; /**
* 学生Dao
* @author Administrator
*
*/
public interface IStudentDao {
public String GetStudentById(int id);
}
////////////////////////////////////////
package com.hex.Dao; /**
* 学生Dao
* @author Administrator
*
*/
public class StudentDaoImpl implements IStudentDao { /**
* 查询学生信息
*/
@Override
public String GetStudentById(int id) { return "hex";
} }
////////////////////////////////////////
package com.hex.Service; /**
* 学生服务接口
* @author Administrator
*
*/
public interface IStudentService {
public String GetStudentById(int id);
}
////////////////////////////////////////
package com.hex.Service; import com.hex.Dao.IStudentDao;
import com.hex.Dao.StudentDaoImpl; /**
* 学生服务实现类
* @author Administrator
*
*/
public class StudentServiceImpl implements IStudentService { private IStudentDao studentDao; public void setStudentDao(IStudentDao studentDao) {
this.studentDao = studentDao;
} @Override
public String GetStudentById(int id) {
//studentDao=new StudentDaoImpl();
return studentDao.GetStudentById(id);
} }
2. 新增HomeServlet类,并需要通过new的方式声明studentService对象
如下所示:
package com.hex.servlet; /**
* 访问Servlet实现类
*/
public class HomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L; private IStudentService studentService; /**
* 构造函数 */
public HomeServlet() { } /**
* 初始化时声明studentService对象
*/
@Override
public void init() throws ServletException {
studentService=new StudentServiceImpl();
} /**
* Get方法
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String studentName=studentService.GetStudentById(0);
request.setAttribute("studentName", studentName);
request.getRequestDispatcher("/jsp/Home.jsp").forward(request, response);
} /**
* Post方法,此处和Get方法同
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }
3. 前端页面进行访问即可
如下所示:
<a href="../HomeServlet">点击进入</a>
4. 缺点:
此处形成了强依赖,即HomeServlet需要StudentServiceImpl对象。且StudentServiceImpl需要StudentDao的支持。
采用Spring的方式进行访问
0. Spring框需要的Jar包
Spring框架支持web项目需要的Jar包共7个,如下所示:
//日志包
commons-logging-1.1.1.jar
//spring核心包
spring-aop-4.0.6.RELEASE.jar
spring-beans-4.0.6.RELEASE.jar
spring-context-4.0.6.RELEASE.jar
spring-core-4.0.6.RELEASE.jar
spring-expression-4.0.6.RELEASE.jar
//web包
spring-web-4.0.6.RELEASE.jar
1. 需要在web.xml文件中配置Spring对应的监听器
如下所示:
applicationContext.xml 位于src目录,所以需要加上classpath,是Spring容器的配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml
</param-value>
</context-param>
<!-- 配置spring-web.jar对应的监听器 ,Tomcat启动时,自动初始化IOC容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2. 配置Spring的IOC容器
如下所示:依赖引用对象属性采用ref方式,如果是值对象,则采用value方式。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- Dao依赖于数据库的底层操作,本示例不予深入 -->
<bean id="studentDao" class="com.hex.Dao.StudentDaoImpl"></bean>
<!-- Service层依赖于StudentDao,采用set的方式注入 -->
<bean id="studentService" class="com.hex.Service.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>
</beans>
3. 在Servlet中,引入ApplicationContext对象,将Tomcat容器和Spring的IOC容器进行关联
如下所示:其他方法保持不变,增加studentService对象的getter和setter方法,然后通过容器注入的声明方式产生对象。在StudentServiceImpl中对StudengDao的依赖采用同样方法进行注入。
package com.hex.servlet; /**
* Servlet实现类
*/
public class HomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L; private IStudentService studentService; public IStudentService getStudentService() {
return studentService;
} public void setStudentService(IStudentService studentService) {
this.studentService = studentService;
} /**
* 初始化时获取Sping的IOC容器中的bean对象
*/
@Override
public void init() throws ServletException {
//Web项目获取Spring上下文对象。
ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
studentService=(IStudentService)context.getBean("studentService");
}
}
4. 优势:
此方式将Servlet和Service及Dao之间进行了解耦,灵活扩展性大大增强。
小知识
如果Spring的IOC容器文件有多个,可以采用Import的方式进行引入,如下所示:
<!-- 第二种方式,采用import方式引入其他容器文件 -->
<import resource="applicationContext2.xml"/>
在web.xml中配置servlet的方式,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>FirstWebSpring</display-name>
<servlet>
<description>
</description>
<display-name>HomeServlet</display-name>
<servlet-name>HomeServlet</servlet-name>
<servlet-class>com.hex.servlet.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/HomeServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置容器地址 -->
<!-- 第一种方式如果要加载多个配置文件,可以写多个,如下所示:
<param-value>
classpath:applicationContext.xml,
classpath:applicationContext2.xml
</param-value>
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<!-- 配置spring-web.jar对应的监听器 ,Tomcat启动时,自动初始化IOC容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
备注
绳锯木断,水滴石穿。
一起学Spring之Web基础篇的更多相关文章
- SQL必学必会笔记 —— 基础篇
基础篇 SQL语言按照功能划分 DDL(DataDefinitionLanguage),也就是数据定义语言,它用来定义我们的数据库对象,包括 数据库.数据表和列.通过使用DDL,可以创建,删除和修改数 ...
- 从零开始学spring cloud(四) -------- 基础项目搭建
1.创建一个spring cloud项目 1.1.使用工具创建--idea 点击creat new project,选择spring initializr 点击next,选择下一步 填入自己的Grou ...
- 从零开始学AB测试:基础篇
什么是AB测试? 通俗点理解,AB测试就是比较两个东西好坏的一套方法,这种A和B的比较在我们的生活和人生中非常常见,所以不难理解.具体到AB测试这个概念,它和我们比较哪个梨更大.比较哪个美女更漂亮.比 ...
- MyEclipse配置Spring框架(基础篇)
一.新建项目,添加spring的相关jar包等 二.创建相关类以及属性和方法 Student.java package com.yh; public class Student implements ...
- java-随学随记之基础篇
一.Java是一门高级语言,具有跨平台性(一次编译到处运行) 1.javac.exe命令,编译器 javac 源文件名.java 2.java.exe命令,启动虚拟机 java 类名 二.环境变量 ...
- 58. Spring Boot国际化(i18n)【从零开始学Spring Boot】
国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换言之,应用程序的功能和代码设计考虑在不 ...
- Linux系统文件系统及文件基础篇
学习Linux,重难点在于掌握不同类别的文件系统及其作用.通过对Linux系统的安装,我们首先来了解下Linux系统里各个目录文件夹下的大致功能:主要的目录树的有/./root./home./usr. ...
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...
- 50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
如果你使用的是spring boot 1.4.0版本的话,那么你可能需要配合以下文章进行学习 90.Spring Boot 1.4 使用log4j错误[从零开始学Spring Boot] Log4j是 ...
随机推荐
- day 35 协程 IO多路复用
0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...
- 在centos7上进行hadoop-3.1.2的伪分布搭建
第一步:配置网络(静态IP) vi /etc/sysconfig/network-scripts/ifcfg-ens33(网卡名称可能不同) 1. 修改: 将该配置文件中的ONBOOT=no修改为ye ...
- Linux的awk命令详解
awkawk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再 ...
- Ubuntu 一键伪装成Win 10,Kali Linux 2019 kali-undercover软件嫁接;
今天,下午刷手机的时候,突然看到kali出了一个非常新颖的主题:该主题可以使得kali系统伪装成windows 10而变得低调起来:就像下面这样: 具体新闻链接:https://www.freebuf ...
- CCNA 之 十一 NAT 子网地址转换
NAT 网络地址转换 全称:Network Address Translation 为什么需要NAT? 因为公网IP(IPv4)地址紧缺,内容地址通过NAT转换成一个公有地址去访问公网资源: 如下图展 ...
- C语言|博客作业10
问题 回答 C语言 博客作业10 这个作业要求在哪里 作业要求 我在这个课程的目标是 熟练循环语句的用法 这个作业在哪个具体方面帮助我实现目标 pta作业 参考文献 <C语言程序设计> 1 ...
- 【JMX】jmx结合jmx_exporter实现promethues监控
JMX JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Lev ...
- C#程序编写高质量代码改善的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...
- 下一代容器架构已出,Docker何去何处?看看这里的6问6答!!
我猜很多人一看这个标题已经感觉很懵逼了,什么?下一代容器都出来了,我还没学Docker呢!!! 咳咳~~在这里我给大家做一个保证,下一代容器目前也只是各个公司在测试阶段,Github上面也有很多Iss ...
- 失去循环标签的Python,我这样实现跳出外层循环
不完美的Python 自从各类Python大火,感觉天上地下哪儿都有Python的一席之地,Python功夫好啊-但python有些细节上缺少其他语言的便利.今天我们就来举几个例子. 跳出外层循环 大 ...