springMVC入门

1、什么是springMVC?
Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。

2、SpringMVC处理请求的流程
在这里插入图片描述
(1)用户向服务器发送请求,被前端控制器DispatcherServlet截获。

(2)DispatcherServlet对请求URL(统一资源定位符)进行解析,得到URI(请求资源标识符)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象当中返回。

(3)DispatcherServlet根据获得到Handler,选择一个合适的HandlerAdapter。HandlerAdapter的设计符合面向对象中单一职责原则,代码架构清晰,便于维护,最重要的是,代码可复用性高。HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法,例如hello方法。

(4)提取请求中的模型数据,开始执行Handler(Controller)。在填充Handler的入参过程中,根据配置,Spring将帮你做一些额外的工作。如消息转换,数据转换,数据格式化,数据验证。

(5)Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象,ModelAndView对象中应该包含视图名或模型。

(6)根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)返回给DispatcherServlet。

ViewResolver 结合Model和View来渲染视图。

(7)将视图渲染结果返回给客户端。

3、SpringMVC核心开发步骤
DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
HandlerMapping的配置,从而将请求映射到处理器
HandlerAdapter的配置,从而支持多种类型的处理器
处理器(页面控制器)的配置,从而刊行功能处理
ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术
4、SpringMVC的组件
前端控制器(DispatcherServlet)
请求到处理器映射(HandlerMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewResolver)
处理器或页面控制器(Controller)
验证器(Validator)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)
5、MVC优势
多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,这样,一旦模型发生改变,也易于维护。
模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术。例如,使用JSP页面、Velocity模板或者直接产生Excel文档等。
应用被分隔为三层,这降低了各层之间的耦合,提供了应用的可扩展性。
控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说我戳记啊用户请求权限的概念。
MVC更符合软件工程化的精神。不同的层各司其职,每一层的组件具有相同的特征,这有利于通过工程化和工具化的方法产生管理程序代码。
6、如何在项目中添加springmvc
(1)添加相关依赖

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>

  <!-- ********************** JSTL依赖 ********************** -->
  <!-- 缺少下面的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
  <!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->
  <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
  </dependency>
  <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
  </dependency>
  <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jsp-api</artifactId>
        <version>8.0.47</version>
    </dependency>

(2)在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)

<?xml version="1.0" encoding="UTF-8"?>




<!--1) use-dafault-filters="false"的情况下,根据表达式包含(include-filter)或排除(exclude-filter)指定包-->
<context:component-scan base-package="com.zking.ssm" use-default-filters="false">
    <context:include-filter type="regex" expression=".+\.controller\..*"/>
    <!--<context:exclude-filter type="regex" expression=".+\.controller2\..*"/>-->
</context:component-scan>

<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
<!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
<mvc:annotation-driven></mvc:annotation-driven>

<!--3) ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
    <property name="viewClass"
              value="org.springframework.web.servlet.view.JstlView"></property>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!--4) 单独处理图片、样式、js等资源 -->
<!--<mvc:resources location="/css/" mapping="/css/**"/>-->
<!--<mvc:resources location="/images/" mapping="/images/**"/>-->
<!--<mvc:resources location="/js/" mapping="/js/**"/>-->
(3)修改web.xml <?xml version="1.0" encoding="UTF-8"?>


Archetype Created Web Application

contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener org.springframework.web.util.IntrospectorCleanupListener encodingFilter org.springframework.web.filter.CharacterEncodingFilter true encoding UTF-8 encodingFilter /* SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/springmvc-servlet.xml 1 true SpringMVC / 7、页面跳转 转发:"forward:path" 重定向:"redirect:path" 注1:这两种跳转方式将会绕开视图解析器的前缀和后缀 注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。

8、一个简单crud的实例
Controller类:

package com.zking.ssm.controller;

import com.zking.ssm.model.Book;
import com.zking.ssm.service.BookService;
import com.zking.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**

  • @author LJ

  • @site www.lijun.com

  • @Date 2018年12月22日

  • @Time 11:40
    */
    @Controller
    @RequestMapping("/book")
    public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/list")
    public String list(HttpServletRequest request, Book book){
    PageBean pageBean = new PageBean();
    pageBean.setRequest(request);
    List books = this.bookService.queryByNamePager(book, pageBean);
    request.setAttribute(“bookList”,books);
    request.setAttribute(“pageBean”,pageBean);
    return “bookList”;
    }

    @RequestMapping("/delete/{id}")
    public String delete(@PathVariable(value = “id”) Integer id){
    this.bookService.deleteByPrimaryKey(id);
    return “redirect:/book/list”;
    }

    @RequestMapping("/add")
    public String add(Book book){
    this.bookService.insertSelective(book);
    return “redirect:/book/list”;
    }

    @RequestMapping("/toAdd")
    public String toAdd(){
    return “bookEdit”;
    }

    @RequestMapping("/edit")
    public String edit(Book book){
    this.bookService.updateByPrimaryKey(book);
    return “redirect:/book/list”;
    }

    @RequestMapping("/toEdit")
    public String toEdit(Model model, @RequestParam(value = “id”, required = true)Integer id){
    Book book = this.bookService.selectByPrimaryKey(id);
    model.addAttribute(“book”,book);
    return “bookEdit”;
    }
    }
    bookList.jsp页面:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@ taglib uri="/zking" prefix=“z” %>

Insert title here 书名: 新增
编号名称价格操作
${b.bid }${b.bname }${b.price } 修改    删除
bookEdit.jsp页面:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Insert title here bid:
bname:
price:

9. 常用注解 (1)@Controller:用于标识处理器类

(2)@RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法
常用参数:value、method
可将@RequestMapping标签定义到类名处窄化路径

(3)@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定
常用参数:value、required、defaultValue
注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的

(4)@ModelAttribute:请求参数到命令对象的绑定
常用参数:value

可用@ModelAttribute标注方法参数,方法参数会被添加到Model对象中(作用:向视图层传数据)
可用@ModelAttribute标注一个非请求处理方法,此方法会在每次调用请求处理方法前被调用(作用:数据初始化)
可用@ModelAttribute标注方法,方法返回值会被添加到Model对象中(作用:向视图层传数据)
但此方法视图的逻辑图就会根据请求路径解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
太麻烦几乎不用,不用直接保存到Model或ModelAndView中

(5)@SessionAttributes:指定ModelMap中的哪些属性需要转存到session
常用参数:value、types
注:必须放到class类名处

(6)@InitBinder:用于将请求参数转换到命令对象属性的对应类型

(7)@RequestBody(重要~~~~~):用于目前比较流行的ajax开发的数据绑定(即提交数据的类型为json格式)
注:使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,
如果没有更改,前台会报错415(Unsupported Media Type)。
后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。
这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示

(8)其它
@CookieValue cookie数据到处理器功能处理方法的方法参数上的绑定
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值