SpringMVC 入门
SpringMvc 是什么?
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:
springMVC有个核心处理servlet DispatcherServlet 这个servlet 接受前端的请求接受处理后的结果给jsp
HelloWorld
1 .导包
配置springmvc 的核心servlet 类 ,DispatcherServlet 以及spring 配置文件xml的位置 :
<!-- 前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 默认找的是web-inf servlet 的名称 - servlet.xml这个文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 1. /* 拦截所有,jsp js png jpg 全部拦截 建议不适用 2.*.action *.do 拦截结尾的 能用 ERP 3./ 拦截所有(不包含jsp) (包含js,png,css) 强烈建议使用 前台面向消费者 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
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:context="http://www.springframework.org/schema/context" 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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 扫描controller 和service 的注解 --> <context:component-scan base-package="com.itheima"></context:component-scan>
4.书写controller
@RequestMapping(value="/item/itemList.action") public ModelAndView itemList(){ List<Items> list = new ArrayList<Items>(); list.add(new Items(1, "1华为 荣耀8", 2399f, new Date(), "质量好!1")); list.add(new Items(2, "2华为 荣耀8", 2399f, new Date(), "质量好!2")); list.add(new Items(3, "3华为 荣耀8", 2399f, new Date(), "质量好!3")); list.add(new Items(4, "4华为 荣耀8", 2399f, new Date(), "质量好!4")); list.add(new Items(5, "5华为 荣耀8", 2399f, new Date(), "质量好!5")); list.add(new Items(6, "6华为 荣耀8", 2399f, new Date(), "质量好!6")); ModelAndView mav = new ModelAndView() ; mav.setViewName("/WEB-INF/jsp/itemList.jsp"); // 添加数据 mav.addObject("itemList",list); return mav; }
5. 用逆向工程创建pojo然后模拟数据发送给前台
6.请求数据
springmvc架构说明
架构结构图
架构流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户
组件说明
u DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
u HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
u Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
u HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
下图是许多不同的适配器,最终都可以使用usb接口连接
u ViewResolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
u View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有handler、view
默认加载组件
org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver i18
org.springframework.web.servlet.theme.FixedThemeResolver 防止攻击的
org.springframework.web.servlet.HandlerMapping 处理器映射器
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
配置式开发
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
注解式开发 企业级开发中用注解
org.springframework.web.servlet.HandlerAdapter 处理器适配器
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter 实现httprequest 接口
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter 实现controllerhandler接口
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
注解配置
org.springframework.web.servlet.HandlerExceptionResolver 异常处理
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
jsp视图解析器
配置组件
<!-- 处理器映射器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> --> <!-- 处理器适配器 --> <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> --> <!-- 注解驱动 --> <mvc:annotation-driven/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
这里的适配器和映射器都可以用注解驱动来代替的
注意 : 如果用了组件扫描器,就必须在用到的controller 上加上@controller
Springmvc + mybatis 整合
springmvc+mybatis+ spring spring 和spring 的关系式spring 包括springmvc 所以,我们只用整合spring 个mybatis就行了
直接把spring 和mybatis 的jar包和 springmvc 的jar包配置直接弄到一起就行了,
配置文件弄到一起
注意 : 配置文件中的路径要写对
查询商品列表
mybatis 中查询数据库, 大数据格式,是默认不查询的,想查询用这个方法
selectByExampleWithBLOBs ()
我们controller 要接受参数绑定, 可以有两种方法,
一种就是传统的servlet 手法, 直接用方法
getParameter() 进行接受参数 ,
一种是设置成员变量然后进行注入 ,
但是名字一定要和前台的对应
还有一种可以不对应参数名称, 用注解取出参数绑定到自定义的形参上
@requestparam(value=" ") 如下 可以默认赋值
public ModelAndView toEdit(@RequestParam(value="id",required=false,defaultValue="1") Integer id , HttpServletRequest request,HttpServletResponse response, HttpSession session ,Model model){
使用,代码如下 :
package com.itheima.springmvc.controller; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.aspectj.weaver.bcel.UnwovenClassFileWithThirdPartyManagedBytecode.IByteCodeProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.itheima.springmvc.pojo.Items; import com.itheima.springmvc.service.ItemService; /** * 商品管理 * @author ZZQ.Hacker * */ @Controller public class ItemController { private Integer id ; @Autowired private ItemService itemService ; // 入门程序 /** * 跳转视图 * @return */ @RequestMapping(value="/item/itemList") public ModelAndView itemList(){ List<Items> list = itemService.selectItemsList(); ModelAndView mav = new ModelAndView() ; mav.setViewName("itemList"); // 添加数据 mav.addObject("itemList",list); return mav; } @RequestMapping(value="item/itemEdit.action") public ModelAndView toEdit(Integer id , HttpServletRequest request,HttpServletResponse response, HttpSession session ,Model model){ //servlet 时代开发 /* String id = request.getParameter("id"); */ // 查询修改页面数据 Items item = itemService.selecItmsById(id); ModelAndView mav = new ModelAndView(); mav.setViewName("editItem"); mav.addObject("item", item); return mav; } }绑定pojo类型
要球属性的值,一定要和页面一一对应,
代码如下, mybatis 操作数据库直接调用updateByPrimaryKeyWithBLOBs()就可以更新所有的数据
/*提交修改页面为items对象*/ @RequestMapping(value="/updateitem.action") public ModelAndView updateItem(Items items){ // 调用service itemService.update(items); ModelAndView mv = new ModelAndView() ; mv.setViewName("success"); return mv ; }解Pojo乱码问题
在web.xml配置一个过滤器,处理post 提交乱码问题
配置拦截器, spring 默认给我们写好了一个拦截器, 我们只需在xml中配置就行了,代码如下,
<!-- 处理post 提交乱码问题 --> <filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
这里的param-name 一定要写为encoding 因为spring 的源码中写的就是encoding我们最好写encoding
包装的pojo
包装的时候实现序列化接口然后, jsp 中的属性一定要和包装类中的属性对应就可以了,
自定义参数绑定
spring 无法自定义参数的转换,无法把字符串转换为日期类型,
我们想要进行新转换只有在适配器中做我们在web.xml中配置
注意 : jsp页面中的name 一定要和pojo中的属性对应
Spring 和struts2 的区别
1、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。
2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。