首页 > 代码库 > springMVC课程01
springMVC课程01
springMVC
一、springMVC体系介绍:
1、javaee体系结构:
2、为什么要使用MVC开发模式?
3、springMVC的强大之处:
①.Spring MVC 实现了即用的 MVC 的核心概念。它为控制器和处理程序提供了大量与此模式相关的功能。并且当向 MVC 添加反转控制(Inversion of Control,IoC)时,它使应用程序高度解耦,提供了通过简单的配置更改即可动态更改组件的灵活性。Spring MVC 为您提供了完全控制应用程序的各个方面的力量。②.Spring 的 Web MVC 模块是围绕 DispatcherServlet 而设计的。DispatcherServlet 给处理程序分派请求,执行视图解析,并且处理语言环境和主题解析,此外还为上传文件提供支持。③.DispatcherServlet 通过使用处理程序映射来决定哪一个处理程序应当处理传入的请求。处理程序映射只是用于标识使用哪一个处理程序来处理特定 URL 模式的映射。处理程序是只有一种方法 ModelAndView handleRequest(request,response) 的控制器接口的实现。Spring 还有一些可用的高级处理程序实现;其中一个重要的高级处理程序实现是 SimpleFormController,它提供了将命令对象绑定到表单、对其执行验证等功能。④.您已经在本系列教程的先前教程中使用了 DispatcherServlet 和简单的处理程序。在下一个部分中,将使用 SimpleFormController 并说明 Spring MVC 提供的各种即用功能。
4、springMVC的优势
①、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。②、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;③、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;④、和Spring 其他框架无缝集成,是其它Web框架所不具备的;⑤、可适配,通过HandlerAdapter可以支持任意的类作为处理器;⑥、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;⑦、功能强大的数据验证、格式化、绑定机制;⑧、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;⑨、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。⑩、强大的JSP标签库,使JSP编写更容易。………………还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。
5、springMVC的架构
6、 MVC(Model-View-Controller)三元组的概念:
7、struts2的MVC流程
8、springMVC的运行流程
①、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;②、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;③、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;④、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);⑤、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;⑥、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;⑦、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
9、组件说明:
u DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
u HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
u Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
u HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
u View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
u View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。 需要用户开放的组件有handler、view |
二、springMVC基本配置
1、组件扫描器(打开spring的注解开关)
使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan>自动扫描标记@controller的控制器类,配置如下:
<!-- 扫描controller注解,多个包中间使用半角逗号分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller"/>
2、RequestMappingHandlerMapping
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。
从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。
配置如下:
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
注解描述:
@RequestMapping:定义请求url到处理器功能方法的映射
3、RequestMappingHandlerAdapter
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。
配置如下:
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
4、<mvc:annotation-driven>
springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
5、视图解析器
在springmvc.xml文件配置如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> |
InternalResourceViewResolver:支持JSP视图解析
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包。此属性可以不设置,默认为JstlView。
prefix 和suffix:查找视图页面的前缀和后缀,最终视图的址为:
前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址 “WEB-INF/jsp/hello.jsp”
6、DispatcherServlet核心代码分析、
//前端控制器分派方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
int interceptorIndex = -1;
try {
ModelAndView mv;
boolean errorView = false;
try {
//检查是否是请求是否是multipart(如文件上传),如果是将通过MultipartResolver解析
processedRequest = checkMultipart(request);
//步骤2、请求到处理器(页面控制器)的映射,通过HandlerMapping进行映射
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
//步骤3、处理器适配,即将我们的处理器包装成相应的适配器(从而支持多种类型的处理器)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 304 Not Modified缓存支持
//此处省略具体代码
// 执行处理器相关的拦截器的预处理(HandlerInterceptor.preHandle)
//此处省略具体代码
// 步骤4、由适配器执行处理器(调用处理器相应功能处理方法)
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// Do we need view name translation?
if (mv != null && !mv.hasView()) {
mv.setViewName(getDefaultViewName(request));
}
// 执行处理器相关的拦截器的后处理(HandlerInterceptor.postHandle)
//此处省略具体代码
}
catch (ModelAndViewDefiningException ex) {
logger.debug("ModelAndViewDefiningException encountered", ex);
mv = ex.getModelAndView();
}
catch (Exception ex) {
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
mv = processHandlerException(processedRequest, response, handler, ex);
errorView = (mv != null);
}
//步骤5 步骤6、解析视图并进行视图的渲染
//步骤5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))
步骤6 视图在渲染时会把Model传入(view.render(mv.getModelInternal(), request, response);)
if (mv != null && !mv.wasCleared()) {
render(mv, processedRequest, response);
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Null ModelAndView returned to DispatcherServlet with name ‘" + getServletName() +
"‘: assuming HandlerAdapter completed request handling");
}
}
// 执行处理器相关的拦截器的完成后处理(HandlerInterceptor.afterCompletion)
//此处省略具体代码
catch (Exception ex) {
// Trigger after-completion for thrown exception.
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex) throw ex;
}
catch (Error err) {
ServletException ex = new NestedServletException("Handler processing failed", err);
// Trigger after-completion for thrown exception.
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
throw ex;
}
finally {
// Clean up any resources used by a multipart request.
if (processedRequest != request) {
cleanupMultipart(processedRequest);
}
}
}
三、入门程序:
1、首先在web.xml里面配置springmvc的加载
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化加载springmvc配置文件 -->
<!-- 方法一:
命名规范:<servlet-name>-servlet.xml=========>springmvc-servlet.xml
路径规范:/WEB-INF/springmvc-servlet.xml(必须把配置文件放在WEB-INF路径下)
-->
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2、springmvc-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 开启spring注解扫描 -->
<context:component-scan base-package="com.itcast"></context:component-scan>
<!-- 处理器映射器:寻找执行类controller,返回controller对象 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" ></bean>
<!-- 处理器适配器 :执行controller对象方法,返回执行结果-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" ></bean>
<!-- 返回物理视图就不用配置视图解析器 -->
<!-- 逻辑视图使用视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="WEB-INF/jsp/" ></property>
<property name="suffix" value=".jsp" ></property>
</bean>
</beans>
3、测试程序:
@Controller
public class UserController {
/**
* 需求:springmvc入门案例
* 组件:
* 1.web.xml : 控制层 DispatherServlet
* 2,处理器映射器: RequestMappingHandlerMapping
* 3,处理器适配器:RequestMappingHandlerAdapter
* 4,创建controller执行类
* 5,@RequestMapping:请求映射 根据浏览器请求进行匹配映射
*/
@RequestMapping("hello")
public ModelAndView showHello(){
//创建模型和视图对象
ModelAndView mv = new ModelAndView();
//设置数据
mv.addObject("hello","张三丰好帅");
//指定返回试图页面,直接设计物理视图
//mv.setViewName("/WEB-INF/jsp/hello.jsp");
mv.setViewName("hello");//逻辑视图,用视图解析器
return mv;
}
}
4、扩展:
①、自定义配置文件的文件名和路径
②、返回字符串视图
/**
* 需求:返回string类型的逻辑视图
* springmvc:封装参数方法:所有参数都放置方法中,这些参数将会自动被创建对象
* model:model其实是request域
*/
@RequestMapping("hello2")
public String showHello2(Model model){
//放入数值
model.addAttribute("hello", "峨嵋派周芷若");
//返回逻辑视图
return "hello";
}
③、注解驱动使用
5、参数的接收
①、跳转参数页面
/**
* 需求:跳转参数封装页面
*/
@RequestMapping("param")
public String showParam(){
//返回逻辑视图:页面名称
return "param";
}
②、int类型参数的传递
<form action="${pageContext.request.contextPath}/receiveInt.do">
<input type="text" name="id" id="id" >
<input type="submit" value="提交表单" >
</form>
/**
* 需求:接受int类型参数
* springmvc参数封装方法:
* 基于方法进行封装,参数变量都写在方法中,参数将会自动被创建对象,接受页面 参数
*/
@RequestMapping("receiveInt")
public String receiveInt(int id){
System.out.println(id);
//封装成功
return "success/success";
}
③、boolean类型参数的传递
- <form action="${pageContext.request.contextPath}/receiveBoolean.do">
trueFlag:<input type="radio" name="flag" value="true" >
<br>falseFlag:<input type="radio" name="flag" value="false" >
<br><input type="submit" value="提交表单" >
</form>
/**
* 需求:接受boolean类型参数
*/
@RequestMapping("receiveBoolean")
public String receiveBoolean(boolean flag){
System.out.println(flag);
//封装成功
return "success/success";
}
④、接收String类型参数(中文乱码的解决)
<form action="${pageContext.request.contextPath}/receiveStr.do">
姓名:<input type="text" name="username" id="username" >
<br><input type="submit" value="提交表单" >
</form>
@RequestMapping("receiveStr")
public String receiveStr(String username){
System.out.println(username);
//封装成功
return "success/success";
}
修改tomcat服务器编码(server.xml)<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
@RequestMapping("receiveStr")
public String receiveStr(String username){
try {
username=new String(username.getBytes("iso8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(username);
//封装成功
return "success/success";
}
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
⑤、数组类型参数接收
<form action="${pageContext.request.contextPath}/receiveArray.do" method="post" >
<input type="checkbox" name="ids" value="1" >篮球
<br><input type="checkbox" name="ids" value="2" >足球
<br><input type="checkbox" name="ids" value="3" >乒乓球
<br><input type="submit" value="提交表单" >
</form>
/**
* 接收数组参数类型
* 批量删除
*/
@RequestMapping("receiveArray")
public String receiveArray(Integer[] ids){
System.out.println(Arrays.toString(ids));
//封装成功
return "success/success";
}
⑥、pojo类型传递(Date类型的格式)
<form action="${pageContext.request.contextPath}/receiveUser.do" method="post" >
姓名:<input type="text" name="username" id="username">
<br>性别:<input type="text" name="sex" id="sex">
<br>年龄:<input type="text" name="age" id="age">
<br>生日:<input type="text" name="birthday" id="birthday">
<br>地址:<input type="text" name="address" id="address">
<br><input type="submit" value="提交表单" >
</form>
/**
* 需求:接受pojo类型参数
*/
@RequestMapping("receiveUser")
public String receiveUser(User user){
System.out.println(user);
//封装成功
return "success/success";
}
u默认的Date格式为1998/02/02
⑦、传递包装类型参数
<form action="${pageContext.request.contextPath}/receiveVo.do" method="post" >
姓名:<input type="text" name="user.username" id="username">
<br>性别:<input type="text" name="user.sex" id="sex">
<br>年龄:<input type="text" name="user.age" id="age">
<br>生日:<input type="text" name="user.birthday" id="birthday">
<br>地址:<input type="text" name="user.address" id="address">
<br><input type="submit" value="提交表单" >
</form>
/**
* 需求:接受包装类型参数
* 包装类型包装user对象
*/
@RequestMapping("receiveVo")
public String receiveVo(QueryVo queryVo){
System.out.println(queryVo.getUser());
//封装成功
return "success/success";
}
⑧、集合参数的接收
<form action="${pageContext.request.contextPath}/receiveList.do" method="post" >
姓名:<input type="text" name="uList[0].username" id="username">
<br>地址:<input type="text" name="uList[0].address" id="address">
<br>姓名:<input type="text" name="uList[1].username" id="username">
<br>地址:<input type="text" name="uList[1].address" id="address">
<br><input type="submit" value="提交表单" >
</form>
/**
* 需求:接受集合类型参数
* 集合类型包装user对象
*/
@RequestMapping("receiveList")
public String receiveList(QueryVo queryVo){
System.out.println(queryVo.getuList());
//封装成功
return "success/success";
}
⑨、自定义参数的封装
/**
* 需求:时间类型参数,如果和当前系统时间类型不匹配,传递不成功
* 解决方案:使用注解
*/
@InitBinder
public void dateRegister(WebDataBinder binder){//true表示可以为空
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
package com.itcast.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
public class DateConvert implements Converter<String, Date>{
public Date convert(String source) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//转换
Date parse=null;
try {
parse = sdf.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return parse;
}
}
<mvc:annotation-driven conversion-service="conversion" ></mvc:annotation-driven>
<bean id="conversion" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" >
<property name="converters">
<bean class="com.itcast.utils.DateConvert" ></bean>
</property>
</bean>
四、springmvc和mybatis整合
1、web.xml的配置
<!-- 1,编码过滤器 -->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 2,加载spring配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<!-- 3,加载springmvc配置文件 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化加载springmvc配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2、dao层配置:
<?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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1,数据源 -->
<!-- 整合持久层框架 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 2,sqlSessionFactory工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="typeAliasesPackage" value="com.itheima.domain"></property>
<property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
</bean>
<!-- 3,Mapper接口代理开发扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.mapper"></property>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:映射文件开始标签,标签中封装所有sql语句 namespace: 1,命名空间,唯一标识一个映射文件,名称自定义 2,如果是接口代理开发,namespace有特殊含义,不能随便定义 -->
<mapper namespace="com.itheima.mapper.ItemMapper">
<!-- 需求:查询所有商品,展示商品列表 -->
<select id="findAllItems" resultType="item">
select * from items
</select>
</mapper>
public interface ItemMapper {
/**
* 需求:查询所有商品,列表展示
*
*/
public List<Item> findAllItems();
}
3、service层配置
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 一,把service交给spring管理 -->
<context:component-scan base-package="com.itheima.service"></context:component-scan>
<!-- 二,事物管理 -->
<!-- 1,事物管理平台 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2,事物管理策略,通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 3,事物切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.itheima.service.*.*(..))"/>
</aop:config>
</beans>
@Service
public class ItemServiceImpl implements ItemService{
@Autowired
private ItemMapper itemMapper;
@Override
public List<Item> findAllItems() {
List<Item> list = itemMapper.findAllItems();
return list;
}
}
4、controller层配置
@Controller
public class ItemController {
//注入service服务对象
@Autowired
private ItemService itemService;
/**
* 需求:查询所有商品,列表展示
* 请求:itemsList.do
*/
@RequestMapping("itemsList")
public String itemsList(Model model){
//调用service服务方法,查询商品数据
List<Item> itemList = itemService.findAllItems();
//页面回显
model.addAttribute("itemsList", itemList);
return "itemsList";
}
}
<?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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 1,扫描,把controller交给spring管理 -->
<context:component-scan base-package="com.itheima.controller"></context:component-scan>
<!-- 2,注解驱动 -->
<mvc:annotation-driven/>
<!-- 3,视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
注意:@AutoWired和@Resource(name="")都不需要set方法,直接就能注入
springMVC课程01