发表于: 2019-11-11 23:24:04
2 1079
啥也不说就是干!!!
今天完成的事情
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 三大组件的相关配置及常见的参数绑定
评论