Spring框架的学习阶段四---Spring-MVC

spring-mvc

基于spring的, ioc控制反转, di依赖注入, aop面向切面编程

model 模型 - 数据和操作数据的逻辑(狭义的就是数据) 包括了实体类和业务类(例如 User,UserService)
view 视图 - 数据展现, 包括(jsp, jstl, el)
controller 控制器 把模型和视图关联在一起, 包括servlet

让程序的各个部分分工清晰,各司其职。让程序的可维护性提高。

使用步骤:

  1. 在pom.xml文件中添加 spring-webmvc等6个依赖
    注意pom.xml文件中需要添加<packaging>war</packaging> (决定了是maven的web项目)
    然后手动补充一个src/main/webapp目录, src/main/webapp/WEB-INF/web.xml
    在配置tomcat时选择 项目名:war exploded

  2. 在spring-mvc.xml中添加mvc的xml命名空间

  3. 前控制器 -- 统一的入口
    它是由spring-mvc 提供的的一个servlet: DispatcherServlet
    在web.xml 对它进行配置, maven 的目录结构中,该文件的路径是 src/main/webapp/WEB-INF/web.xml

    xml    28行

<!-- 职责: 
   1.作为统一入口
   2.创建spring容器
   3.在tomcat启动时,就把spring容器创建好
-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指明了spring配置文件的位置 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <!-- 在tomcat启动时,就创建这个servlet,并初始化该servlet -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern> 
    <!-- 给 DispatcherServlet 指定路径 
    假设浏览器  /hello  没有,会找 / 这个路径
               /s1     没有,会找 / 这个路径
               
             只要没有其他servlet能够精确匹配这个请求路径,这个请求都会被 / 的这个servlet来处理
    -->
</servlet-mapping>
  1. 控制器
    @Controller
    public class 控制器类{

    @RequestMapping("/请求路径")
    public String 控制器方法(){

    }
    }
    // 控制器类要交给spring容器管理
    并spring-mvc中加入:<mvc:annotation-driven/> 来启用mvc的相关功能

  2. 处理视图
    控制器方法的返回值是视图名
    前缀+视图名+后缀就构成了最终jsp视图路径, 控制器会根据视图路径用请求转发跳转过去

    xml    4行

<mvc:view-resolvers>
    <mvc:jsp prefix="/" suffix=".jsp"/>
</mvc:view-resolvers>
  1. 请求被处理的流程

    1. 请求从浏览器发送到tomcat, 地址为:http://localhost:8080/hello
    2. tomcat先将该路径与servlet进行匹配,结果没有精确的地址与之匹配,就找到了 / 这个地址
      / 地址对应的是DispatcherServlet,由它来处理请求
    3. DispatcherServlet 再到spring容器中找控制器类
      把每个控制器中带有@RequestMapping的方法路径与请求路径进行匹配,
    4. 匹配到了就执行该方法, 如果匹配不到报404错误
    5. 根据方法的返回结果找到jsp视图
    6. 由jsp视图生成html代码作为响应返回给浏览器
  2. 以maven插件方式运行tomcat
    在pom.xml中加入插件信息:

    xml    11行

<plugin> <!-- 配置一个内嵌的tomcat -->
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>8080</port> <!-- 端口号 -->
        <path>/</path> <!-- 项目在tomcat中的访问路径 -->
        <uriEncoding>utf-8</uriEncoding> <!-- 设置get请求中解码的字符集,解决get请求中的中文乱码问题 -->
    </configuration>
</plugin>

然后在右侧的maven菜单中找到tomcat7插件,运行tomcat7:run这个命令

  1. 接收请求参数
  1. 把方法参数和请求参数直接对应

  2. 写一个实体类型,把实体的属性与请求参数对应

  3. 路径参数(把参数值不是写在?之后,而是包含在路径当中)
    /deleteUser?id=1 传统写法
    /deleteUser/1 路径参数 要删除1号用户
    /deleteUser/2 要删除2号用户

    路径参数可以通过@PathVariable 与方法参数一一对应

  1. 使用模型数据
    Model 接口, 代表了模型数据, 它也是加在控制器方法之上 可以直接使用它的实现类ModelMap或Map
    向模型添加数据: model.addAttribute("变量名", 值);
    model中的数据在转发之前,都会被存入request作用域

springmvc中
常见错误:
400 错误:发生在请求参数赋值给方法参数时,发生了类型转换问题
例如:字符串转整数
字符串转日期 对于日期需要加 @DateTimeFormat(pattern="日期格式")
中文乱码问题:
可以配置spring提供的字符编码过滤器

    xml    15行

<!-- spring 提供的字符编码过滤器 -->
<filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/ *</url-pattern>
</filter-mapping>

        7行

静态资源的 404 错误
	静态资源是指 图片、css、html、js
	原因是DispatcherServlet的路径是/ 跟tomcat中处理图片的Servlet路径冲突了
	所以所有图片的请求被DispatcherServlet所处理,把图片的路径当做了控制器路径
解决办法:	
	在spring配置文件中加入:`<mvc:default-servlet-handler/>`

让tomcat能够热部署,让类的修改不用重启服务器就可以生效

  1. 首先保证 打包方式是 war exploded
  2. 其次,启动tomcat使用debug方式启动
  3. 在tomcat设置时,on frame deactivation 选中 update classes and resources 选项
    当光标从idea切换至浏览器时,就会更新修改
    限制:只能针对当前存在的类生效,如果是新增的类检测不到
    配置文件的改动检测不到
  1. json格式的响应
    js 代表javascript object 对象, notation 标记

之前返回的大部分响应类型 text/html
json也是一种响应格式:也是文本格式的,更类似于javascript的对象写法
{
"username":"张三",
"age":18
}
如果转换json时出现了错误: No converter found for return value of type:
是因为json转换的jar包没有加, 可以在pom文件中加入相应的依赖:

    xml    6行

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.1</version>
</dependency>  

在控制器方法上添加@ResponseBody注解,它可以把方法的返回值转换成json字符串

java中 map以及实体类 会被转换为json中的对象 {属性名:属性值}
java中 list或数组 会被转换为json中的数组 [元素1, 元素2, ...]

jackson常见注解:
@JsonFormat 可以对日期类型进行格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 注意加8小时才是北京时间
@JsonIgnore 可以在转换时忽略加了@JsonIgnore的属性
@JsonProperty("新的属性名") 可以在转换时改变属性的名字

猜你喜欢

转载自blog.csdn.net/sinat_42759524/article/details/83865536