SpringMVC学习
SpringMVC入门基础
商品订单业务
a.需求分析
通过商品订单业务学习SpringMVC相关的功能(利用之前的表格数据进行操作)
主要测试内容:简单实现商品的查询列表功能
b.搭建开发环境
Mysql 5.7
Jdk1.8
Spring5.0.8
- 导入相关的jar包(在之前的项目的基础上添加spring-webmvc jar包)
pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-version>5.0.8.RELEASE</spring-version>
<logging-version>1.2</logging-version>
<mysql-version>5.1.6</mysql-version>
<c3p0-version>0.9.5.2</c3p0-version>
<druid-version>1.1.10</druid-version>
<dbcp-version>1.4</dbcp-version>
<jstl-version>1.2</jstl-version>
</properties>
<dependencies>
<!-- spring框架相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring数据库连接相关: mysql数据库连接、druid数据库连接池-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<!-- springMVC框架相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${logging-version}</version>
</dependency>
<!-- jstl表达式相关 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
</dependencies>
<build>
<finalName>Spring_Day04</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
c.springMVC流程配置
<1>配置web.xml文件(前端控制器)
在src/main/webapp/WEB-INF下的web.xml中配置Spring的前端控制器
配置形式:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>指定名称</servlet-name>
<!-- org.springframework.web.servlet.DispatcherServlet -->
<servlet-class>DispatcherServlet类全名</servlet-class>
<!-- 通过设置contextConfigLocation属性指定加载配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>指定名称</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
<2>配置springmvc.xml的文件
- 在resource目录下创建springmvc.xml文件,引入spring-mvc的命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
......配置内容
</beans>
- 在springmvc.xml中主要需要配置如下内容
- 配置处理器映射器
- 配置处理器适配器
- 配置处理器
- 配置视图解析器
<!--
1.配置处理器映射器:BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping表示将定于的Bean的名字作为请求的url,
需要将编写的controller在spring中进行配置并且需要指定bean的name为请求的url
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--
2.配置处理器适配器:SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter即简单控制器处理器适配器,
所有实现了Controller接口的Bean作为SpringMVC的后端控制器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--
3.配置处理器:ItemsController(自定义开发的处理器)
自定义处理器实现Controller接口,传送数据到指定视图
-->
<bean id="处理器id" name="指定名称作为访问路径" class="处理器类全名"></bean>
<!-- 4.配置视图解析器:InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
处理器的开发(Handler) Controller
ItemsController.java:
public class ItemsController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 模拟数据库实现数据的封装
Items item1 = new Items();
item1.setId(1);
item1.setName("宏碁笔记本");
item1.setPrice(8000f);
item1.setCreatetime(new Date());
item1.setDetail("宏碁笔记本超级无敌卡的");
Items item2 = new Items();
item2.setId(2);
item2.setName("联想笔记本");
item2.setPrice(6000f);
item2.setCreatetime(new Date());
item2.setDetail("联想笔记本也是超级无敌卡的");
Items item3 = new Items();
item3.setId(3);
item3.setName("苹果笔记本");
item3.setPrice(10000f);
item3.setCreatetime(new Date());
item3.setDetail("宏碁笔记本超级好用");
List list = new ArrayList();
list.add(item1);
list.add(item2);
list.add(item3);
// 创建ModelAndView对象,将数据转发到指定页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("list",list);
modelAndView.setViewName("WEB-INF/jsp/list.jsp");
// 返回该ModelAndView对象
return modelAndView;
}
}
<3>完成开发视图
list.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring入门程序测试</title>
</head>
<body>
<table border="1">
<tr>
<th>产品id</th>
<th>产品名称</th>
<th>产品价格</th>
<th>生产日期</th>
<th>详细描述</th>
<th>具体操作</th>
</tr>
<c:forEach var="item" items="${list }">
<tr>
<td>${item.id }</td>
<td>${item.name }</td>
<td>${item.price }</td>
<td>${item.createtime }</td>
<td>${item.detail }</td>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
<4>发布项目到tomcat进行测试
访问地址:(与上述处理器配置的访问地址相关)
http://localhost:8080/SpringMVC_Base/queryItems.action
DispatcherServlet
DispatcherServlet.properties:(简单参考)
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
非注解方式的HandlerMapping处理器映射器
HandlerMapping负责根据requst请求找到对应的Handler处理器
在上述案例的基础上进行修改相应的springmvc.xml文件
<1>BeanNameUrlHandlerMapping
<2>SimpleUrlHandlerMapping
上述两种处理器映射方式是可以同时并存的,哪一个路径对应哪个映射,就执行哪个映射来确定具体的Handler
非注解方式的HandlerApater处理器适配器
<1>SimpleControllerHandlerAdapter
对应的controller实现:
<2>HttpRequestHandlerAdapter
对应的controller实现:
不同的处理器适配器对应着不同的处理器,根据实际需求去完成相关配置即可
<3>最终的配置文件springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
1.配置处理器映射器:BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping表示将定于的Bean的名字作为请求的url,
需要将编写的controller在spring中进行配置并且需要指定bean的name为请求的url
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 配置处理器映射器形式2:SimpleUrlHandlerMapping -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems2.action">itemsController</prop>
<prop key="/queryItems3.action">itemsController</prop>
<prop key="/queryItems4.action">itemsController2</prop>
</props>
</property>
</bean>
<!--
2.配置处理器适配器:SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter即简单控制器处理器适配器,
所有实现了Controller接口的Bean作为SpringMVC的后端控制器
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--
配置处理器适配器方式2:HttpRequestHandlerAdapter
其控制器相应地需要实现HttpRequestHandler接口
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!--
3.配置处理器:ItemsController(自定义开发的处理器)
自定义处理器实现Controller接口,传送数据到指定视图
-->
<bean id="itemsController" name="/queryItems.action" class="com.guigu.springmvc.a_quickstart.ItemsController"></bean>
<bean id="itemsController2" class="com.guigu.springmvc.a_quickstart.ItemsController2"></bean>
<!-- 4.配置视图解析器:InternalResourceViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
上述配置使得下列url均能正确访问数据
http://localhost:8080/SpringMVC_Base/queryItems.action
http://localhost:8080/SpringMVC_Base/queryItems2.action
http://localhost:8080/SpringMVC_Base/queryItems3.action
http://localhost:8080/SpringMVC_Base/queryItems4.action
注解方式的映射器和适配器
采用注解方式配置映射器和适配器,在Controller不需要实现任何接口,只需要使用@ResultMapping(“控制器名称”)进行注解即可,但需要在springmvc.xml中配置组件扫描器,用以扫描指定的包下的文件
- 注解方式的映射器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
- 注解方式的适配器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
Springmvc.xml配置如下:
对应Controller层代码编写如下所示:
测试结果:
访问链接:http://localhost:8080/SpringMVC_Base/queryItems.action
mvc:annotation-driven(重点掌握)
将上述所有内容进一步简化,通过使用springMVC的mvc标签完成数据的自动配置,springmvc.xml中的配置如下,controller层编写代码参考上述即可
数据正常访问
http://localhost:8080/SpringMVC_Base/queryItems.action