SpringMVC初体验
1.Maven依赖spring-webmvc:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
2.web.xml配置DispatcherServlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<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 -->
<init-param>
<param-name>contextConfigLocation</param-name><!--contextConfigLocation,不能写其他的 -->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--
在web应用启动时自动创建Spring IOC容器
并初始化DispatcherServlet
-->
<!--如果没有加<load-on-startup>0</load-on-startup>
,会在第一次访问URL的时候创建-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- "/"代表拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.配置applicationContext.xml的MVC标记:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mv="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
context:component-scan 标签作用:
在Spring IOC初始化过程中,自动创建并管理com.imooc.springmvc及子包中拥有以下注解的对象
@repository :一般放在Dao类上,通常是与数据发生直接交互的
@Service :放在Service类上面,业务逻辑类
@Controller :用于描述MVC的控制器类
@Component : 放在不好区分类型的类上
-->
<context:component-scan base-package="com.imooc.springmvc"></context:component-scan>
<!--启用Spring MVC的注解开发模式-->
<mvc:annotation-driven/>
<!--将图片/JS/CSS等静态资源排除在外,课提高执行效率-->
<mvc:default-servlet-handler/>
</beans>
4.开发Controller控制器:控制器测试类:
@Controller
public class TestController {
@GetMapping("/t") //用于将方法绑定get请求的URL,浏览器中输入localhost/t就可以访问到test方法
@ResponseBody//直接向响应输出字符串数据,不跳转页面
public String test(){
return "Hello world";
}
}
Spring MVC数据绑定
URL Mapping
@RequestMapping放在类前面,为所有的GetMapping和PostMapping设置访问前缀
@RequestMapping放在方法上,不再区分get/post请求,但是一般都不这样用
在以下的GetMapping和PostMapping前面都加上/um
Controller方法参数接收请求参数
接收参数的过程中可直接进行类型转换
Tomcat出现400错误一般都是前端的表单校验不够严谨造成的
@RequestParam(“manager_name”) String managerName:将manager_name动态的注入到后面的参数managerName中
@GetMapping("/g")
//作用在方法上,不再区分get/post请求
//@RequestMapping(value="/g",method = RequestMethod.GET)
@ResponseBody
public String getMapping(@RequestParam("manager_name") String managerName ){
System.out.println("managerName:"+managerName);
return "This is get method";
}
使用JavaBean接收请求参数
实体对象的属性名需要和提交的参数名保持一致
接收表单复合数据
复合数据可以使用数组接收,
还可以使用List集合接收,但要在List集合前增加@RequestParam注解说明
也可以将数据封装成一个实体对象,实体对象中也允许使用List对象接收复合数据
Map只能接收单个数据,对河存在复合数据的表单会存在丢失的现象
关联对象赋值
日期类型转换
小范围中: @DateTimeFormat(pattern=“yyyy-MM-dd”) :将前台输入的格式转换为Date对象
@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”)
也可以创建一个类来实现全局的控制:
public class MyDateConverter implements Converter<String,Date> {
public Date convert(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
try {
Date date = sdf.parse(s);
return date;
} catch (ParseException e) {
return null;
}
}
}
配置文件中添加:
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.imooc.springmvc.convertter.MyDateConverter"/>
</set>
</property>
</bean>
修改之前配置的代码,在启用Spring MVC的注解开发模式后添加conversion-service="conversionService"
<!--启用Spring MVC的注解开发模式-->
<mvc:annotation-driven conversion-service="conversionService"/>
解决中文乱码
1.Tomcat8.0以后的版本默认 URIEcoding=“UTF-8”,可以不用配置这一项
2.web.xml配置:在后面添加:
<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>
3.Response响应乱码
在设置启用Spring MVC的注解开发模式的代码里面添加,其主要目的是设置text/html;charset=utf-8
<!--启用Spring MVC的注解开发模式-->
<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>
响应输出
ModelAndView:
@PostMapping("/post")
public ModelAndView showView(User user){
ModelAndView mv = new ModelAndView("/view.jsp");
mv.addObject("user", user);
return mv;
}
页面重定向后原本放在请求中的数据会丢失
可以在实例化ModelAndView的时候不设置地址,然后用setViewName方法设置
String与ModelMap
//Controller方法返回String的情况
//1.方法被@ResponseBody描述,SpringMVC直接响应String字符串本身
//2.方法不存在@ResponseBody,则SpringMVC处理String指代的视图(界面)
//String与ModelMap
//Controller方法返回String的情况
//1.方法被@ResponseBody描述,SpringMVC直接响应String字符串本身
//2.方法不存在@ResponseBody,则SpringMVC处理String指代的视图(界面)
@GetMapping("/modelmap")
@ResponseBody
public String showView1(Integer userId, ModelMap modelMap) {
String view = "/view.jsp";
User user = new User("张三", "123456", new Date());
if (userId == 1) {
user.setUsername("李四");
} else if (userId == 2) {
user.setUsername("王二");
}
modelMap.addAttribute("user", user);
return view;
}
SpingMVC整合Free Marker
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<!--启用FreeMarker模板引擎-->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=utf-8"></property>
<property name="suffix" value=".ftl"/>
</bean>
<!--配置FreeMarker参数-->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl"/>
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>