发表于: 2019-11-11 23:24:04

2 1082


啥也不说就是干!!!

今天完成的事情

1、@RequestMapping

value 属性:用于映射 URL 和 HandlerMethod 方法

用法如下:

@RequestMapping(value="/hello")

@RequestMapping("/hello")

@RequestMapping(value={"/hello","/hello2"})

窄化请求映射

作用:限制此类下的所有方法的方位请求 url 必须以请求前缀开头,对 url 进行模块化分类管理

用法如下:

访问时的 url 是 /student/queryInfo

@RequestMapping("student")
@Controller
public class StudentController {
@RequestMapping(value = "/queryInfo")
public String hello(Model model) {
model.addAttribute("msg", "helloworld");
       // 逻辑视图名称
       return "index";
   }

}

Method 属性

作用:限制请求 url 只能通过指定的 method 请求方式访问该 HandlerMethod

用法如下:url 发起请求

<a href="item/queryInfo?age>5">大查询学生信息,id 大于5</a>
<br />

Controller 中的方法定义

@RequestMapping("student")
@Controller
public class StudentController {
@RequestMapping(value = "/queryInfo",method = RequestMethod.GET,params = {"id>5"})
public String hello(Model model) {
model.addAttribute("msg", "helloworld");
       // 逻辑视图名称
       return "index";
   }

}

2、三大组件的配置

1)注解映射器和适配器

通过 bean 标签配置

RequestMappingHandlerMapping:注解式处理器映射器

作用:对类中标记 @RequestMapping 的方法进行映射,根据 RequestMapping 定义的 url 匹配 RequestMapping 标记的方法,匹配成功返回 HandlerMethod 对象给 DispatcherServlet ,HandlerMethod 对象中封装 url 对应的 method 方法

@RequestMappingHandlerAdapter:注解式处理器适配器

对标记 @RequestMapping 的方法进行适配

在 springmvc.xml 配置文件中配置如下:

<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

平时开发常用的是通过 mvc 标签配置

<mvc:annotation-driven/>

这个标签的作用就是自动的往 Spring 容器中注册了以下的 BeanDefinition:

2)视图解析器

在 springmvc.xml 配置文件中配置如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="prefix" value="/WEB-INF/views/"/>
   <property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver:默认支持JSP视图解析

prefix 和 suffix:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀,逻辑视图名需要在controller中返回的 ModelAndView 指定,比如逻辑视图名为 index ,则最终返回的jsp视图地址 “WEB-INF/views/index.jsp”

3、Controller 参数绑定

参数绑定是指将请求参数串中的 value 值取到之后,在进行类型转换,然后转换后的值赋值给 Controller 类中方法的形参,这个过程就是参数绑定


其中 Controller 方法形参中可以随时添加如下类型的参数,处理器适配器会自动识别并进行赋值

HttpServletRequest 通过 request 对象获取请求信息

HttpServletResponse 通过 response 处理响应信息 

HttpSession 通过 session 对象得到 session 中存放的对象

其他的还有如:InputStream OutputStream Reader Writer

Model ModelMap 作用就是向页面传值 model.addAttribute("msg","helloworld");

1)绑定简单数据类型

简单类型指的就是 8种基本类型数据以及它们的包装类,还有 String 类型

绑定方式:直接绑定、注解绑定

直接绑定要求 http 请求参数的 key 与 Controller 方法中的形参名称保持一致

http://localhost:8080/student/queryInfo?id=1

@RequestMapping(value = "/queryInfo")
public String hello(Model model,Integer id) {
System.out.println("接收到的请求参数:"+id);
   // 逻辑视图名称
   return "index";
}

通过注解绑定,请求参数中的 key 和 Controller 方法的形参名不一致,需要通过 @RequestParam 注解才能完成绑定

http://localhost:8080/student/queryInfo?stid=1

@RequestMapping(value = "/queryInfo",method = RequestMethod.GET,params = {"id>5"})
public String hello(Model model,@RequestParam("stid") Integer id) {
System.out.println("接收到的请求参数:"+id);
   // 逻辑视图名称
   return "index";
}

@RequestParam属性

1)value:参数名字,即传入参的请求参数名,如 value="stid" 表示请求的参数中的名字为 stid的参数值将传入

2)required:是否必须,默认是true,表示请求中一定要有响应的参数,否则将报错

3)defalutValue:默认值,表示如果请求中没有同名参数的默认值

@RequestMapping(value = "/queryInfo",method = RequestMethod.GET,params = {"id>5"})
public String hello(Model model,@RequestParam(value="stid",required = false,defaultValue = "2") Integer id) {
System.out.println("接收到的请求参数:"+id);
   // 逻辑视图名称
   return "index";
}

2)绑定 POJO 类型

Controller 方法的参数类型是 POJO 类型

要求表单中提交的参数名称与 POJO 类中的属性名称保持一致

http://localhost:8080/student/queryInfo?id=1&name=zhangsan&qq=123456&jnshuType=java后台

@RequestMapping(value = "/queryInfo")
public String hello(Model model,Student student) {
System.out.println("接收到的请求参数:"+student.getId());
   System.out.println("接收到的请求参数:"+student.getName());
   System.out.println("接收到的请求参数:"+student.getQq());
   System.out.println("接收到的请求参数:"+student.getJnshuType());
   // 逻辑视图名称
   return "index";
}

那么发起请求后,Controller 中的方法接收到参数自动填充至 Student 类中的相应属性

3)绑定包装  POJO 类型

包装 pojo 类,依然是个 pojo 类,只是属性中含有另外一个对象的引用

http://localhost:8080/student/queryInfo?address.city=郑州&address.province=河南&address.distrinct=二七区

@RequestMapping(value = "/queryInfo")
public String hello(Model model,Student student) {
System.out.println("接收到的请求参数:"+student.getAddress().getCity());
   System.out.println("接收到的请求参数:"+student.getAddress().getProvince());
   System.out.println("接收到的请求参数:"+student.getAddress().getDistrinct());
   // 逻辑视图名称
   return "index";
}

控制台打印:

4)绑定简单类型数组

http://localhost:8080/student/queryInfo2?stid=1&stid=2&stid=3

@RequestMapping(value = "/queryInfo2")
public String hello(Model model,Integer[] stid) {
System.out.println("接收到的请求参数:"+stid[0]);
   System.out.println("接收到的请求参数:"+stid[1]);
   System.out.println("接收到的请求参数:"+stid[2]);
   // 逻辑视图名称
   return "index";
}

请求发起后看到控制台输出:

注意 数组的入参名必须与 请求中的参数名一致

5)使用 POJO 类型集合或者数组接收参数

批量传递请求参数,要用 List 来接收,这个 List 必须还要放在一个 POJO类中

http://localhost:8080/student/queryInfo2?address[0].id=1&address[1].id=2&address[2]=3

6)自定义参数转换

Student 类中有个 Date 属性,那么如何将

http://localhost:8080/JnshuTask2/student/date=2018-08-12 请求参数中的 String 转化为 Date 类型,这里需要定义一个类型转换器

public class DateConverter implements Converter<String, Date> {

   @Override
   public Date convert(String source) {
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
      try {
          return simpleDateFormat.parse(source);
       }catch (ParseException e){
          e.printStackTrace();
      }
  }
}

在 Spring 配置文件中配置该 Converter

<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
     class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
   <property name="converters">
       <set>
           <bean class="com.gerry.jnshu.converter.DateConverter"/>
       </set>
   </property>
</bean>

@RequestMapping(value = "/queryInfo")
public String hello(Model model, Student student) {
System.out.println("出生年月:"+student.getBirthday().toString());
   // 逻辑视图名称
   return "index";
}

看到控制台输出:

类型转化器已经将 String 类型的值转化为 Date,并赋值给 Student 的 birthday 属性

7)特殊类型的参数绑定

文件类型:

SpringMVC 实现上传文件,是由 commons-fileupload 这个第三方 jar 包实现的,加入 Maven 依赖

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>

在 SpringMVC 配置文件中配置 multipart 类型解析器


<!-- multipart类型解析器,文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <!-- 上传文件的最大尺寸 5M-->
   <property name="maxUploadSize" value="5242880"/>
</bean>

文件上传时候需要指定表单提交数据为 enctype="multipart/form-data" 类型

<form method="POST" action="/student/uploadFile" enctype="multipart/form-data">
   File to upload: <input type="file" name="file">
   <input type="submit" value="Upload"> Press here to upload the file!
</form>
</body>

Controller 接收上传的 File 文件

@RequestMapping(value = "/updateFile")
public String updateItem(Model model, MultipartFile pictureFile) throws Exception {

    if (pictureFile != null) {
       System.out.println(pictureFile.getOriginalFilename());
       //原始图片名称
       String originalFilename = pictureFile.getOriginalFilename();
       //如果没有图片名称,则上传不成功
       if (originalFilename != null && originalFilename.length() > 0) {
           //存放图片的路径
           String picPath = "app/pictures";
           //新文件的名称
           String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
           //新的文件
           File newFile = new File(picPath + newFileName);
           //把上传的文件保存成一个新的文件
           pictureFile.transferTo(newFile);
       }
    }
    return "index";
}

明天计划的事情:

1、Json tag-lib 返回 json 数据

2、SpringMVC 的常见返回值类型

3、restful 接口风格
遇到的问题


收获

学习了 SpringMVC 三大组件的相关配置及常见的参数绑定


返回列表 返回列表
评论

    分享到