1.Spring MVC环境基本配置
- Maven工程依赖spring-webmvc
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
- web.xml配置DispatcherServlet映射
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--applicationContext.xml-->
<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>
- 配置applicationContext的mvc标记
<context:component-scan base-package="springmvc"></context:component-scan>
<!--启动Spring MVC的注解开发模式-->
<mvc:annotation-driven/>
<!--将图片/JS/CSS等静态资源排除在外,提高执行效率-->
<mvc:default-servlet-handler/>
- 开发Controller控制器
@Controller
public class TestController {
@GetMapping("/t") //localhost:8080/t请求接收
@ResponseBody //直接向响应输出字符串数据,不跳转页面
public String test(){
return "SUCCESS";
}
}
2.Spring MVC处理流程
3.Spring MVC数据绑定
完成请求数据和处理方法的绑定。
3.1 URL Mapping
URL映射,将URL和Controller方法绑定。
注解
- @RequestMapping -通用绑定
- @GetMapping -绑定Get请求
- @PostMappding -绑定Post请求
@Controller
@RequestMapping("/test")//进行URL的全局设置,增加URL访问前缀
public class URLMappingController {
//@RequestMapping("/g") 作用在方法上,不区分get/post请求
//@RequestMapping(value="/g",method= RequestMethod.GET) 只对get请求生效
@GetMapping("/g")
@ResponseBody
public String getMapping(){
return "This is get method";
}
@PostMapping("/p")
@ResponseBody
public String postMapping(){
return "This is post method";
}
}
3.2 接收请求参数
有两种方法:
- 使用Controller方法参数接收
- 使用Java Bean实体对象接收
使用Controller方法参数接收
保证参数名一致就可以自动匹配,还可以进行参数类型的自动转换。
参数名不一致时,可以通过@RequestParm注解自定义匹配。
利用@RequestParam可以为参数设置默认值,如:@RequestParam(value="n",defaultValue = "ANON")String name
,不会按照name去查找,而是会按照n去查找,没有匹配到,会给n设置默认值为ANON。
<form action="/test/p" method="post">
<input name="username"/><br/>
<input name="password"/>
<input name="manager_name"/>
<input type="submit" value="提交"/>
</form>
@PostMapping("/p")
@ResponseBody
public String postMapping(String username,Long password,@RequestParam("manager_name")String managerName){
System.out.println(username+":"+password+":"+managerName);
return "This is post method";
}
使用Java Bean实体对象接收
保证参数名和对象的属性名一致就可以自动完成对象的创建和属性的注入。
@PostMapping("/p1")
@ResponseBody
public String postMapping1(User user){
System.out.println(user.getUsername()+":"+user.getPassword());
return "This is post method";
}
使用数组或List接收请求中的复合数据:
使用数组:
public class FormController {
@PostMapping("/apply")
@ResponseBody
public String apply(Integer[] purpose){
for (Integer p:purpose) {
System.out.println(p);
}
return "SUCCESS";
}
}
使用List集合:
需要添加@RequestParam注解
public String apply(@RequestParam List<Integer> purpose){
for (Integer p:purpose) {
System.out.println(p);
}
return "SUCCESS";
}
使用实体类+List集合,可以极大的简化实体表单数据接收的工作量。
使用Map对象接收请求参数:
但Map无法接收复合类型数据,会造成数据的丢失。
public String apply(@RequestParam Map map){
System.out.println(map);
return "SUCCESS";
}
可以在表单中增加关联对象,来为后台对象自动赋值:
public class Form {
//关联对象必须实例化,保证能自动赋值成功
private Delivery delivery = new Delivery();
}
<!--在form表单中增加关联对象名前缀-->
<h3>收货人</h3>
<input name="delivery.name" class="text">
<h3>联系电话</h3>
<input name="delivery.mobile" class="text">
<h3>收货地址</h3>
<input name="delivery.address" class="text">
日期类型转换:
(1)@DateTimeFormat(pattern="")
将前台传入的字符串按照指定格式转换为日期类型。
//方法参数:
public String date(@DateTimeFormat(pattern="yyyy-MM-dd") Date date){}
//对象属性:
public class User{
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date date;
}
(2)开发全局日期转换类
package springmvc.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDateConverter implements Converter<String, Date> {
public Date convert(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(s);
return date;
} catch (ParseException e) {
return null;
}
}
}
applicationContext.xml中配置自定义类型转换器
然后就可以直接转换了
public String date(Date date){
...
}
以上两种同时配置时,优先转换器生效。
解决中文乱码问题
-
get请求:server.xml增加
URIEncoding
属性
-
Post请求:web.xml配置CharacterEncodingFilter过滤器
<filter>
<filter-name>characterFilter</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>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- Response响应:applicationContext.xml配置StringHttpMessageConverter
<mvc:annotation-driven>
<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>
响应结果
- @ResponseBody -产生响应文本
- ModelAndView -利用模版引擎渲染输出
@ResponseBody
直接产生字符串/JSON/XML类型数据响应,不涉及任何视图,受StringHttpMessageConverter影响。
ModelAndView
将数据对象和模版引擎进行绑定,Spring MVC默认View是JSP,可配置其他。
Controller:
@GetMapping("/view")
public ModelAndView showView(Integer userId){
//ModelAndView mav = new ModelAndView("/view.jsp");
ModelAndView mav = new ModelAndView();
mav.setViewName("/view.jsp");
User user = new User();
if(userId == 1){
user.setUsername("lily");
}else if(userId==2){
user.setUsername("smith");
}
mav.addObject("u",user);
return mav;
}
view.jsp
<body>
<h1>I'm view page</h1>
<h2>Username:${u.username}</h2>
</body>
mav.addObject()方法设置的属性默认存放在当前请求中,默认使用请求转发(forward)至页面,重定向使用new ModelAndView("redirect:index.jsp")
SpringMVC整合Freemarker
1.引入freemarker依赖和spring-context-support
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
- 启用Freemarker模版引擎
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<!--设置响应输出,解决中文乱码-->
<property name="contentType" value="text/html;charset=utf-8"/>
<!--指定Freemarker模版文件扩展名-->
<property name="suffix" value=".ftl"/>
</bean>
3.配置Freemarker参数
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--设置模版保存的目录-->
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<!--其他设置项-->
<property name="freemarkerSettings">
<props>
<!--设置Freemarker脚步与数据渲染时使用的字符集-->
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>