Spring学习------SpringMVC

第一天

一、SpringMVC介绍

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web
应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用
Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。SpringMVC 已经成为目前最主流的 MVC 框架之一, 从 Spring3.0 的发布, 就已全面超越 Struts2,成为最优秀的MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
1、MVC和三层架构
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
控制器:主要处理客户端请求
视图:HTML、JSP、前端框架
模型:逻辑业务程序(主要是后台的功能程序),Service,Dao,JavaBean(java对象类,也称为实体类)

2、MVC模式
在这里插入图片描述
web.xml文件配置

<!--配置spring核心(前端控制器)-->
<servlet>
	<servlet-name>dispatcher</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping> <!--只有*.form后缀的请求才会进入springmvc-->
	<servlet-name>dispatcher</servlet-name>
	<url-pattern>*.form</url-pattern>
</servlet-mapping>

Spring配置文件

<!--开启springmvc注解支持(建议放在配置文件最后的位置)-->
  <mvc:annotation-driven/>

springmvc注解支持说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。在springmvc早期版本中需要我们自己加载springmvc的三大组件,现在新版本中,Spring配置文件中写入使用 <mvc:annotation-driven>会自动加载这三大组件,另外:同时它还提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持和@Valid支持,读写XML的支持(JAXB,读写JSON的支持(Jackson)。我们处理响应ajax请求时,就使用到了对json的支持(配置之后,在加入了jackson的core和mapper包之后,不写配置文件也能自动转换成json)

SpringMVC的工作流程

在这里插入图片描述
可以在spring-webmvc-5.0.6.RELEASE.jar源码包下查看DispatcherServlet.properties文件看有哪些处理器是
springmvc默认加载的

二、Controller方法返回值

1、String
1.1、可以返回视图字符串,解析器会自动解析

@RequestMapping("/demo3_1")
public String demo3_1(){
  return "/success.jsp";      //直接返回字符串
}

2、返回ModelAndView(模型和视图,SpringMVC内置提供)

@RequestMapping("/demo3_2")
public ModelAndView demo3_2(){      //返回ModelAndView
  ModelAndView mav=new ModelAndView();
  mav.setViewName("success.jsp");
  mav.addObject("username","张三");
  return mav;
}

3、返回void。一般用于使用原生的Servlet对象或者ajax请求(不跳转页面)

@RequestMapping("/demo3_3") //返回void(一般用于ajax)
public void demo3_2(HttpServletResponse response) throws IOException {     
  response.setContentType("text/html;charset=utf8");
  response.getWriter().write("东方标准");
}
转发和重定向

SpringMVC内置提供一个String 类型的返回值之后会自动解析forward(转发)、redirect(重定向)等特殊字符串
视图解析器配置的前缀和后缀解析不支持forward、redirect
:forward:代表转发 request.getRequestDispatcher(url).forward(request,response)
:redirect:代表重定向 response.sendRedirect(url)

forward
@RequestMapping("/demo3_4")
public String demo3_4(Model model) {      //转发
  System.out.println("执行啦!");
  model.addAttribute("username","张三");
  return "forward:/success.jsp";
}
redirect
@RequestMapping("/demo3_5")
public String demo3_5(HttpSession session) {      //重定向
  session.setAttribute("password","admin");
  System.out.println("执行啦!");
  return "redirect:/success.jsp";
}
@RequestMapping注释解释

属性:

  • value:用于指定请求的 URL。 它和 path 属性的作用是一样的。
  • method:用于指定请求的方式。
  • params:用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key 和 value 必须和配置的一模一样。(少用)
  • produces = “application/json;charset=utf8” (解决Java对象转JSON乱码)
    例如:
    params = {“userId”},表示请求参数必须有 userId,区分大小写
    params = {“userId!=20”},表示请求参数中 id不能是 20。可以不携带userId参数,区分大小写
 @RequestMapping(value = "/hello.form",params = "userId!=1",method = RequestMethod.POST)
  public ModelAndView hello(){
    ModelAndView mav=new ModelAndView();
    mav.addObject("msg","小标");
    mav.setViewName("/hello.jsp");
    return mav;
 }

三、数据绑定

1、自动绑定数据类型

1.1、 基本数据类型:基本数据类型+String+包装类
1.2、包装数据类型(POJO):包装实体类
1.3、数组和集合类型:List、Map、Set、数组等数据类型

2、内置绑定数据自动绑定

ServletAPI:
2.1、HttpServletRequest
2.2、HttpServletResponse
2.3、HttpSession

3、SpringMVC内置对象

Model、ModelMap、ModelAndView。另外,Model也是基于Model。两者都是存储了Request请求作用域的数据的对象,这个两个对象的作用是一样,将数据返回到页面。

四、提交方式乱码解决

提交数据难免会产生中文的传值,比如用户名,地址值等等都是中文输入。

解决post提交乱码我们可以配置spring提供的过滤器

在Spring配置文件中输入下面代码即可:

<!--解决Post提交中文乱码-->
<filter>
  <filter-name>characterEncoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <!--要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)-->
    <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>

五、SpringMVC常用注解

1、@PathVariable:绑定路径参数
//@RequestMapping("url") 
@RequestMapping("/{id}/{username}/demo9")       //@PathVariable绑定restful风格的请求
public String demo9(
  @PathVariable("id") Integer id,@PathVariable("username") String username
 ){
  System.out.println(id);
  System.out.println(username);
  return "/success.jsp";
}
2、@RequestParam:绑定表单数据

接收的参数的变量名与表单的name属性不一样

@RequestMapping("URL")       //@RequestParam强制数据类型绑定
public String demo8(@RequestParam("name") String username) {
  System.out.println(username);
  return "/success.jsp";
}
3、@CookieValue:获得Cookie值的注解
/**
* 获得JSP 页面,JSESSIOINID这个Cookie值
* @param cookevalue
*/
@RequestMapping("/URL")
public void getcookie(@CookieValue(value="JSESSIONID") String cookevalue){
  //输出Cookie
  System.out.println(cookevalue);
}
4、@RequestHeader:获得指定请求头的值
@RequestMapping("/URL")
//获取请求头host的值封装到value中
public void demo10(@RequestHeader("User-Agent")String value){
  System.out.println(value);
}
5、@SessionAttributes 把Model和ModelMap中的指定的key或者指定的属性的值也存入一份进session域
//把modelMap中的username,User类型,String类型,Integer类型的数据也存一份进session中
@SessionAttributes(names = {"username"},types ={User.class,String.class,Integer.class} )//names指的是键的名称集合,types指的是类型集合
public class Demo2Controller {
  @RequestMapping("/demo12.form")
  public String demo12(Model modelMap) {
    modelMap.addAttribute("username","zhangsan");
    modelMap.addAttribute("password","admin");
    modelMap.addAttribute("age",20);
    User user=new User();
    user.setUsername("xiaodong");
    modelMap.addAttribute("user",user);
    return "/success.jsp";
 }
}
6、@SessionAttribute注解:从session中获取一个值封装到参数中
/**
* @SessionAttribute:从session中获取一个值
* @param username
* @param user
* @return
*/
@RequestMapping(value = "/demo6")
public String demo5(@SessionAttribute("password") String username,@SessionAttribute("user") User user){
  System.out.println(username);
  return "/success.jsp";
}

六、格式化参数类型

SpringMVC之所以能够帮我们实现自动数据类型转换是因为SpringMVC提供了非常多的转换器(Converter),并且都实现Converter接口,所以如果我们需要定义转换器必须要实现Converter接口

案例:实现日期的转换
JavaBean
public class User {
  private Integer id;
  private String username;
  private String password;
  private String address;
  private Date birthday;
}
表单(jsp页面数据提交):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
<form action="/testConverter.form">
  <input type="text" name="username">
  <input type="text" name="password">
  <input type="text" name="address">
  <input type="text" name="birthday">//需要转换的类型,把String转换为Date类型
  <input type="submit">
</form>
</body>
</html>
controller:
@RequestMapping("/testConverter.form")//必须要和表单的action路径一致
public String testConverter(User user) {
  System.out.println(user);
  return "/success.jsp";
}
自定义转换器类:
package com.dfbz.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Converter<传入进来的类型,转换之后的类型>
*/
public class MyConverter implements Converter<String,Date> {
  @Override
  public Date convert(String str) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    try {
      Date date = sdf.parse(str);
      return date;
      } catch (ParseException e) {
      e.printStackTrace();
   }
    return null;
 }
}
关键一步:必须在Spring配置文件中引入自定义转换类(以下代码),并且要重新指定转换器。否则无效
<!--在SpringMVC配置的转换器中添加我们自定义的转换器-->
<bean id="myConverters"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  <!-- 配置多个转换器 -->
  <property name="converters">
    <set>
      <!-- 配置转换器(自定义转化器类) -->
      <bean class="com.dfbz.converter.MyConverter"></bean>
    </set>
  </property>
</bean>
<!--开启springmvc注解支持并   重新   指定转换器-->
<mvc:annotation-driven conversion-service="myConverters"/>

七、json的支持

所谓的对JSON的支持,就是SpringMVC支持自动将JSON转换成JAVA对象,也支持将Java对象自动转成JSON.
SpringMVC本身没有对JSON数据处理的类库.要支持JSON的自动转换必须导入JSON的支持包

SpringMVC 中 Jackson依赖
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.8</version>
</dependency>
1、JSON转换成JAVA对象

需求:请求发送一个JSON的对象给执行方法,执行方法根据@RequestBody(只能放在参数上)这个注解强制将请求发送过来的JSON转换成Java对象.

配置步骤

1.1、客户端请求

$.ajax({
  url: "/demo5_1.form",
  contentType:"application/json",   //告知ajax引擎传递的是json类型
  type:"post",       //传递json字符串必须使用post提交
  data: "{\"username\": \"xiaodong\", \"address\": \"guangzhou\", \"birthday\": \"2000-
10-10\"}",
  success: function (data) {
 }
});

1.2、控制器(controller)代码

@RequestMapping("/URL")
public String demo5_1(@RequestBody User user) {      //json字符串 转user
  System.out.println(user);
  return "/success.jsp";
}
2、Json字符串转Map

1.1、客户端请求

$("#test3").click(function () {
  $.ajax({
    url: "/demo5_2.form",
    type:"post",
    contentType:"application/json",
    //Map类型只支持json字符串
    data: "{\"username\": \"xiaodong\", \"address\": \"guangzhou\", \"birthday\":\"2000-10-10\"}",
    success: function (data) {}
 });
});

1.2、控制器(controller)代码

//json字符串 转map Map类型不支持json对象
@RequestMapping("/demo5_2")
public String demo5_1(@RequestBody Map map) {     
  System.out.println(map);
  return "/success.jsp";
}
3、Java对象转成JSON

前端

$("#test4").click(function () {
  $.ajax({
    url: "/demo5_3.form",
    success: function (data) {
      alert(data);
      alert(JSON.stringify(data));
   }
 });
});

后台

@RequestMapping("/demo5_3")
//表示对象以json对象写出到前端 并修改contentType:'application/json;charset=utf8'
@ResponseBody
public User demo5_3() {     //user转json对象
User user = new User();
  user.setId(20);
  user.setUsername("xiaobiao");
  user.setPassword("admin");
  user.setAddress("guangzhou");
  user.setBirthday(new Date());
  return user;
}
4、将Map对象转JSON对象

前端

$("#test5").click(function () {
 $.ajax({
   url: "/demo5_4.form",
   success: function (data) {
     alert(data);
     alert(JSON.stringify(data));
   }
 });
});

后台

@RequestMapping("/demo5_4",produces = "application/json;charset=utf8")
@ResponseBody
public Map demo5_4() {      //map转json对象
  Map map=new HashMap();
  map.put("id",20);
  map.put("username","xiaobiao");
  map.put("password","admin");
  map.put("address","guangzhou");
  map.put("birthday",new Date());
  return map;
}

八、Controller的生命周期

Spring框架默认创建的对象是单例.所以业务控制器是一个单例对象。
SpringMVC提供了,request,session ,globalsession三个生命周期
1、request:每次新的请求,创建一个新的实例.
2、session:每次会话创建一个新的实例. 就是同一个浏览器,就使用同一个实例
3、globalsession:基于集群的session

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值