springmvc 入门和数据绑定
文章目录
1. spring配置
-
(1) web初始化配置
<!--DispatchServlet--> <servlet> <servlet-name>springmvc</servlet-name> <!-- DispatcherServlet是Spring MVC最核心的对象 DispatcherServlet用于拦截Http请求, 并根据请求的URL调用与之对应的Controller方法,来完成Http请求的处理 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--applicationContext.xml 加载指定的spring配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!-- 在Web应用启动时自动创建Spring IOC容器, 并初始化DispatcherServlet(可选) --> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--"/" 代表拦截所有请求--> <url-pattern>/</url-pattern> </servlet-mapping>
-
(2)spring初始化配置
<!-- context:component-scan 标签作用 在Spring IOC初始化过程中,自动创建并管理com.imooc.springmvc及子包中 拥有以下注解的对象. @Repository @Service @Controller @Component --> <!-- base-package 指定扫描包--> <context:component-scan base-package="com.imooc.springmvc"></context:component-scan> <!--启用Spring MVC的注解开发模式--> <mvc:annotation-driven /> <!-- 将图片/JS/CSS等静态资源排除在外,不使用spring过滤,可提高执行效率 --> <mvc:default-servlet-handler/>
2.URLMapping(映射)
(1) 分类
@RequestMapping
通过
@RequestMapping(value = "url",method = RequestMethod.GET)
来指定get/post/delte等方法
该方法作用在类上,可为类添加全局通用映射.
该方法作用在方法上,不区分get/post方法
-
@GetMapping
-
@PostMapping
-
@ResponseBody
使method不经过视图解析器,直接输出为json字符串,一般和URLMapping配合使用
(2) 使用
方法参数接受请求参数
实例代码-1
<form action="/um/p1" method="post">
<input name="username"><br/>
<input name="password"><br/>
</form>
@PostMapping("/p")
@ResponseBody
public String postMapping(String username,Long password){
System.out.println(username+":"+password);
return "This is post method";
}
一般要保证method的参数名和请求参数名名称相同
spring可以实现数值类型和字符串类型的相互转换(前提:string类型的内容为纯数字)
实例代码-2
<!--假定request请求url为:localhost:8080/um/p1?manager_name=li -->
<!-- 相应的java代码如下-->
@GetMapping("/p1")
@ResponseBody
<!--@RequestParam("manager_name")的原理:将request请求中的manager_name在运行时动态的注入其后的
managerName参数中,从而实现自定义参数对照关系 -->
public String getMapping(@RequestParam("manager_name") String managerName , Date createTime){
System.out.println("managerName:"+managerName);
return "This is get method";
}
javaBean接受请求参数
实例代码-3
<!--User.java -->
public class User {
private String username;
private Long password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Long getPassword() {
return password;
}
public void setPassword(Long password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password=" + password +
'}';
}
}
<!--假定request请求url为:localhost:8080/test2?username=lihua&password=123456789 -->
<!-- 需要使request请求的各参数名和User.java中各参数名一一对应,
才能完成javabean的创建和动态注入工作
(request请求的参数可以少但不能多)-->
<!-- 相应的java代码如下-->
@PostMapping("/test2")
@ResponseBody
public void test2(User user) {
System.out.println(user);
}
接受表单复合数据
利用数组或者list接受请求中的复合数据
利用@RequestParam为参数设置默认值
示例代码-4
<!--假定request请求url为:localhost:8080/um/p1?manager_name=li --> <!-- 相应的java代码如下--> @GetMapping("/p1") @ResponseBody <!--@RequestParam(value = "next",defaultValue = "none")的原理: 将request请求中的next参数在运行时动态的注入其后的managerName参数中,如果在request请求中next的值为null,则将"none"赋值给managerName --> public String getMapping(@RequestParam(value = "next",defaultValue = "none") String managerName ){ System.out.println("managerName:"+managerName); return "This is get method"; }
使用Map对象接受请求参数及注意事项
map常用于接受表单数据,但当数据中包含复合数据时,map只能取到第一个值
假定表单中包含一个[1,2,3,4]的复合数据,使用map接收后,map只能得到第一个值:1
示例html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学员调查问卷</title>
<style>
.container {
position: absolute;
border: 1px solid #cccccc;
left: 50%;
top: 50%;
width: 400px;
height: 300px;
margin-left: -200px;
margin-top: -150px;
box-sizing: border-box;
padding: 10px;
}
h2{
margin: 10px 0px;
text-align: center;
}
h3{
margin: 10px 0px;
}
</style>
</head>
<body>
<div class="container">
<h2>学员调查问卷</h2>
<form action="./apply" method="post">
<h3>您的姓名</h3>
<input name="name" class="text" style="width: 150px">
<h3>您正在学习的技术方向</h3>
<select name="course" style="width: 150px">
<option value="java">Java</option>
<option value="h5">HTML5</option>
<option value="python">Python</option>
<option value="php">PHP</option>
</select>
<div>
<h3>您的学习目的:</h3>
<input type="checkbox" name="purpose" value="1">就业找工作
<input type="checkbox" name="purpose" value="2">工作要求
<input type="checkbox" name="purpose" value="3">兴趣爱好
<input type="checkbox" name="purpose" value="4">其他
</div>
<div style="text-align: center;padding-top:10px" >
<input type="submit" value="提交" style="width:100px">
</div>
</form>
</div>
</body>
</html>
示例代码-5
@PostMapping("/apply") @ResponseBody <!--使用list接受复合数据 需要在方法前添加 @RequestParam,向springmvc说明使用list接受复合数据 --> <!-- 表单复合数据也可以通过javabean接收,而无需配置@RequestParam 相关的规范和' javaBean接受请求参数'的规范完全相同,见示例代码-6 --> public String apply(String name, String course, @RequestParam List<Integer> purpose){ System.out.println(name); System.out.println(course); for (Integer p : purpose) { System.out.println(p); } return "SUCCESS"; } <!--使用数组接受复合数据 添加 @RequestParam(可选) --> public String apply(String name, String course, Integer[] purpose){ System.out.println(name); System.out.println(course); for (Integer p : purpose) { System.out.println(p); } return "SUCCESS"; }
示例代码-6
public class Form {
private String name;
private String course;
private List<Integer> purpose;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public List<Integer> getPurpose() {
return purpose;
}
public void setPurpose(List<Integer> purpose) {
this.purpose = purpose;
}
}
关联对象赋值
示例代码-7
public class User{
private String username;
private String password;
private Idcard idcard = new Idcard();
//geter or setter
}
public class Idcard{
private String name;
private String idno;
private String expire;
//getter or setter
}
相对应的form表单设置应该如下图
在使用关联对象赋值时,要把关联对象的对象名,放在表单对象name中的前面

日期类型转换
-
使用注解实现日期类型转换
-
方法参数接收请求参数
@PostMapping("/p1") @ResponseBody public String postMapping1(User user , String username ,@DateTimeFormat(pattern = "yyyy-MM-dd") Date createTime){ System.out.println(user.getUsername() + ":" + user.getPassword()); return "<h1>这是Post响应</h1>"; }
@DateTimeFormat(pattern = "yyyy-MM-dd")
表明了 日期的输入格式,当请求参数的格式和指定格式相同时,会自动转换为Date类型 -
javabean接收请求参数
public class User { private String username; private Long password; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createTime; ....... }
当在java类中使用
@DateTimeFormat(pattern = "yyyy-MM-dd")
,就不需要控制器类相应方法的参数前添加@DateTimeFormat
-
-
使用xml配置和日期转换类实现日期类型转换
<!--日期转换类需要实现 Converter接口,并指明类型转换的双方 -->
public class Convter implements Converter<String, Date> {
@Override
public Date convert(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(s);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
<mvc:annotation-driven conversion-service="ConversionService"/>
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="ConversionService">
<property name="converters">
<set>
<bean class="com.reyking.Convter"></bean>
</set>
</property>
</bean>
温馨提示:当xml配置和注解配置同时存在时,springmvc会优先使用xml配置来完成日期类型转换
(3)其他
中文乱码
-
get请求乱码–server.xml增加
URIEncoding
属性tomcat 8.0 以上不需要配置
-
post请求乱码–web.xml增加
CharacterEncodingFilter
<filter> <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
response响应乱码–spring配置文件配置
message-converters
<mvc:annotation-driven conversion-service="ConversionService"> <mvc:message-converters > <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
3.响应输出结果
1.@ResponseBody
- 产生响应文本
@ResponseBody
直接产生响应体数据,过程不涉及任何视图@ResponseBody
可以产生标准字符串、json、xml等格式数据@ResponseBody
可被StringHttpMessageConverter
影响
2.ModelAndView - 利用模板引擎渲染输出
- ModelAndView对象是指“模型(数据)与视图(界面)对象
- 通过ModelAndView 可将数据对象与模板引擎进行绑定
- springMvc默认的View是JSP,也可以配置其他模板引擎
基本使用
@GetMapping("/test4")
public ModelAndView test4(Integer id, String username) {
<!--指明视图的所在地址 -->
ModelAndView view = new ModelAndView("/view.jsp");
if (id == 1) {
username = "李希";
}
view.addObject("username", username);
return view;
}
*** *** *** *** *** *** ***
@GetMapping("/test5")
public String test5(Integer id, String username, ModelMap modelMap) {
String view = "/view.jsp";
if (id == 1) {
username = "李希";
}
modelMap.addAttribute("username", username);
return view;
}
// 方法test5是方法test4的变种,两者实现相同的功能
<!--
controller 方法返回string的情况
1.方法被 @ResponseBody 描述,springmvc直接响应字符串本身
2.spring mvc 处理strng处理的视图
-->
<!--view.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
username:${username}
</body>
</html>
ModelAndView view = new ModelAndView("/view.jsp");
可以使用下面的代码代替`ModelAndView view = new ModelAndView();` view.setViewName("/view.jsp");
核心用法

4.springmvc与freemarker整合
1. 依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<!--spring mvc支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
2.xml配置
//视图解析器
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver" id="freeMarkerViewResolver">
// 指明响应时页面的内容编码
<property name="contentType" value="text/html;charset=utf-8"></property>
//表明文件后缀
<property name="suffix" value=".ftl"/>
</bean>
//freemarker配置
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" id="freeMarkerConfigurer">
//指明ftl文件的加载位置
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<property name="freemarkerSettings">
<props>
//指明freemarker的编码格式
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
3. 实际使用
@GetMapping("/test")
public ModelAndView showTest(){
ModelAndView mav = new ModelAndView("/test");
User user = new User();
user.setUsername("andy");
mav.addObject("u", user);
return mav;
}