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

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.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

User.java

8.2、RequestController.java

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

User.java

9.2、test.jsp

test.jsp

9.3、测试

测试

9.4、打印结果

打印结果

posted @ 2020-09-22 00:33  幻竹  阅读(229)  评论(0)    收藏  举报