SpringMvc第七篇【功能总结】
1、 搭建项目
2、 定义Controller
2.1、 实现Controller接口
@org.springframework.stereotype.Controller("/test01")
public class TestController01 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
System.out.println("======test01=======");
return null;
}
}
2.2、 实现HttpRequestHandler接口
@Controller("/test02")
public class TestController02 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
System.out.println("======test02=======");
}
}
2.3、 实现Servlet
@Controller("/test03")
public class TestController03 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("=======test03=======");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
//实现Servlet接口需要进行配置
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public SimpleServletHandlerAdapter simpleServletHandlerAdapter() {
return new SimpleServletHandlerAdapter();
}
}
2.4、 使用@RequestMapping(最常用)
@Controller
public class TestController04 {
@RequestMapping("/test04")
public void test(){
System.out.println("======test04======");
}
}
2.4.1、 支持Restful风格
@Controller
@ResponseBody
public class TestController04_Restful {
@RequestMapping(value = "/restful_get",method = RequestMethod.GET)
public void get(){
System.out.println("=======get=======");
}
@RequestMapping(value = "/restful_post",method = RequestMethod.POST)
public void post(){
System.out.println("=======post=======");
}
}
2.4.2、 支持Ant风格
Ant风格资源地址支持3种匹配符
- ?:匹配一个字符
- *:匹配任意个字符或者匹配一层路径
- **:匹配任意层路径
@Controller
@ResponseBody
public class TestController04_Ant {
//可以匹配localhost:8080/updateA
@RequestMapping("/update?")
public void update01(){
System.out.println("=======update01======");
}
//可以匹配localhost:8080/update,localhost:8080/updateA,localhost:8080/updateABC
@RequestMapping("/update*")
public void update02(){
System.out.println("=======update02======");
}
//可以匹配localhost:8080/update/a/book
@RequestMapping("/update/*/book")
public void update03(){
System.out.println("=======update03======");
}
//可以匹配localhost:8080/update/book,localhost:8080/update/a/book,localhost:8080//a/b/c/book
@RequestMapping("/update/**/book")
public void update04(){
System.out.println("=======update04======");
}
}
2.5、 使用HandlerFunction
3、 接受参数
3.1、 接受普通参数
在@RequestMapping的映射方法上写对应的参数名即可
@RequestMapping("/request01")
public void request01(Strig name,int age){
System.out.println(name+"\n"+age);
}
3.2、 @RequestParam参数名绑定
@RequestMapping的映射方法的参数名可以和前端传递的参数名不同
//localhost:8080?name=zhangsan
@RequestMapping("/request02")
public void request02(@RequestParam("name") Strig username){
System.out.println(username);
}
3.3、 @PathVariable路径参数
通过@PathVariable将URL中占位符{XX}的值获取到传递给形参
//localhost:8080/request03/10?name=zhangsan
@RequestMapping("/request03/{id}")
public void request03(@RequestParam("name") Strig username,int id){
System.out.println(username+"\n"+id);
}
3.4、 @RequestHeader绑定请求头属性
@RequestMapping("/request04")
public void request04(@RequestHeader("accept") String accept){
System.out.println(accept);
}
3.5、 CookieValue绑定请求的Cookie
//设置cookie
@RequestMapping("/request05")
public void request05(HttpServletResponse httpServletResponse,HttpServletRequest httpServletRequest){
Cookie cookie=new Cookie("name","zhangsan");
httpServletResponse.addCookie(cookie);
}
@RequestMapping("/request06")
public void request06(@CookieValue("name") String name){
System.out.println(name);
}
3.6、 绑定请求参数到POJO对象
3.6.1、 POJO对象支持级联属性
3.6.2、 @InitBinder解决接收多对象时属性名冲突
3.6.3、 @Requestbody自动解析JSON字符串封装到对象
必须使用Post请求,Content-Type要设置为application/json

千万不要用Map接收,否则会造成代码很难维护
4、处理模型数据
4.1、ModelAndView
可以使用形参的方式接收springmvc传入的ModelAndView对象,也可以在方法体内new一个ModelAndView对象,最后一定要返回ModelAndView对象
@RequestMapping("/request01")
public ModelAndView request01(ModelAndView modelAndView) {
modelAndView.addObject("age", 18);
modelAndView.setViewName("test");
return modelAndView;
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.age}
</body>
</html>
4.2、Model
形参也可以使用ModelMap,Map
@RequestMapping("/request02")
public String request02(Model model) {
model.addAttribute("name", "zhangsan");
return "test";
}
5、常用注解
5.1、@SessionAttributes
该注解只能用在类上
两个属性: value属性通过模型中的key将模型中的数据加入到session中;types属性通过模型数据的类型将其加入到session中
@Controller
@SessionAttributes(value = "name", types = Integer.class) //基本数据类型必须使用包装类
public class RequestController {
@RequestMapping("/request03")
public String request03(Map<String, Object> map) {
map.put("name", "zhangsan");
map.put("sex", 18);
return "test";
}
}
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${sessionScope.name}
${sessionScope.age}
</body>
</html>

5.2、 @ModelAttribute
执行目标方法前会执行该注解标注的方法
目标方法参数处不使用@ModelAttribute时,map中的key应是目标方法参数类型首字母小写
@ModelAttribute
public void modelAttribute(Map<String,Object> map){
User user1 = new User("zhangsan",22,"男");
User user2 = new User("xiaohong",32,"女");
map.put("user1",user1);
map.put("user2",user2);
}
//有返回值上,用法类似上面
// @ModelAttribute
// public User modelAttribute(){
// return new User("zhangsan",22,"男");
// }
@RequestMapping("/request04")
@ResponseBody
public void request04(@ModelAttribute("user2") User user) { //从map中拿出user2
System.out.println(user);
}
<form action="request04" method="get">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交"><br>
</form>

5.3、@InitBinder
6、 国际化配置
6.1、language.properties

#language.zh_CN.properties
language.username=username
language.password=password
#language.en_US.properties
language.username=姓名
language.password=密码
6.2、spring-mvc.xml
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 表示语言配置文件是以language开头的文件(language_zh_CN.properties)-->
<property name="basename" value="language"/>
<!-- 语言区域里没有找到对应的国际化文件时,默认使用language.properties文件 -->
<property name="useCodeAsDefaultMessage" value="true"/>
<!-- language.properties默认编码是gbk,为防止中文乱码,设置该属性 -->
<property name="defaultEncoding" value="gbk"/>
</bean>
<!-- 配置SessionLocaleResolver用于将Locale对象存储于Session中供后续使用
id值必须为localeResolver,若没有注册此bean或者id值不为localeResolver,则会报UnsupportedOperationException-->
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<!-- 该拦截器通过名为”lang”的参数来拦截http请求,使其重新设置页面的区域化信息 -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>
6.3、login.jsp
<!--引入spring标签库-->
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<label for="username"><spring:message code="language.username"/>:
<input id="username" type="text" name="username" /><br/>
<label for="password"><spring:message code="language.password"/>:
<input id="password" type="text" name="password" /><br/>
当前语言: ${pageContext.response.locale}
<!--另一种方式-->
<!--引入fmt标签库-->
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<label for="username"><fmt:message key="language.username"/>:
<input id="username" type="text" name="username" /><br/>
<label for="password"><fmt:message key="language.password"/>:
<input id="password" type="text" name="password" /><br/>
当前语言: ${pageContext.response.locale}
6.4、运行截图


7、自定义视图
7.1 spring-mvc.xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->
<!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高(当order值为Integer最大值,即2147483647,使用InternalResourceViewResolver) -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"/>
</bean>
<!-- 使用自定义视图,无需再经过 Handler 的方法. -->
<mvc:view-controller path="/test" view-name="testView"/>
7.2 TestView.java
//spring-mvc.xml配置<context:component-scan/>将该类扫描入容器
@Component
public class TestView implements View {
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
httpServletResponse.setHeader("content-type","text/html;charset=utf-8");
httpServletResponse.getWriter().println("这是自定义视图");
}
}
7.3、testView.jsp
<!--不会进入该视图-->
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>hello</h2>
</body>
</html>
7.4、TestController.java
@RequestMapping("/test")
public String request05() {
return "testView";
}
7.5、运行结果

8、格式化
8.1、User.java

8.2、RequestController.java

8.3、StringToUserConverter.java
要继承import org.springframework.core.convert.converter.Converter
public class StringToUserConverter implements Converter<String, User> {
@Override
public User convert(String s) {
User user = new User();
String[] split = s.split("-");
user.setName(split[0]);
user.setAge(Integer.parseInt(split[1]));
user.setGender(split[2]);
return user;
}
}
8.4、浏览器请求

8.5、打印结果

9、数据格式化
9.1、User.java

9.2、test.jsp

9.3、测试

9.4、打印结果


浙公网安备 33010602011771号