SpringMVC的使用

SpringMVC的使用

1、回顾下前面开发的流程(三层架构)

前端请求------->Controller------->Service--------------->DAO------>访问数据库

​ Servlet/SpringMVC Spring JDBC/dbutils/JdbcTempalate

​ 控制器 整合第三方框架提供事务 访问数据库

那么也就是说我们学习的SpringMVC实际上就是替代原来的Servlet

问题:波波老师 现在我们有了Servlet 那么为什么咋们还要学习SpringMVC呢?

场景:原来我们的Servlet在使用的时候 还是比较复杂

​ 请求参数的时候 需要自己去getParameter 每一次都需要 参数不能自动封装

​ Servlet:有没有处理编码问题-----没有

​ 原来在使用Servlet的时候 每一次都需要写Servlet ---- 需要写很多的Servlet----冗余

​ 原来在做文件下载的时候 ------ 也比较复杂

​ 原来在使用Servlet返回JSON格式的时候 ------ 需要自己去转换成JSON的字符串

​ 原来在接受JSON数据额时候是没有办法直接封装成Java对象

SpringMVC简单的是就是对Servlet的一个封装-----这个封装就类似于 前面项目 做的这个框架

2、SpringMVC是什么

SpringMVC实际上就是一个控制器的解决方案而已

简单的说就是对Servlet的封装

就是简化了原来Servlet的功能

他里面要干的事情就跟原来一样

​ 1:接受前端数据

​ 2:将前端数据封装成对象

​ 3:调用业务逻辑

​ 4:返回数据进行封装(放到域对象)

​ 5:进行页面的跳转

SpringMVC和Spring到底是一个什么关系?SpringMVC只是Spring中的Web MVC模块而已

并不是什么框架 ----- Spring这个框架

3、SpringMVC能干什么

​ 他里面要干的事情就跟原来一样

​ 1:接受前端数据

​ 2:将前端数据封装成对象

​ 3:调用业务逻辑

​ 4:返回数据进行封装(放到域对象)

​ 5:进行页面的跳转

文件的下载和上传 数据的自动封装 返回JSON格式的自动封装 等等…

4、SpringMVC的第一个HelloWorld程序

4.1、导包

  <!--导入我们的Servlet的API -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--导入我们jstl的标签库的包 -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>javax.servlet.jsp.jstl-api</artifactId>
            <version>1.2.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
        </dependency>






        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>


        <!--带入cglib代理的包 -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

4.2、配置核心的Servlet(在web.xml中配置)

 <!--配置核心的Servlet-->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  

  <!--下面表示只是拦截.action请求-->
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

4.3、编写配置文件

注意名字 核心Servlet在web.xml中名字-servlet.xml 文件名

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.1.xsd"
>

  <bean id="/user.action" class="com.qf.helloworld.UserController"></bean>
</beans>

4.4、编写Controller程序

public class UserController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        ModelAndView modelAndView=new ModelAndView();
        modelAndView.setViewName("/bobo.jsp");
        modelAndView.addObject("userName","第一个程序你懂的...");
        System.out.println("我是小王子的小波波And you?");
        return modelAndView;
    }
}

4.5、在webapp下创建一个bobo.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

   获取到前端的数据是:${userName}

</body>
</html>

4.6、测试

上面这种写法有问题没有?

有:每一个Controller 才对应一个路径 也就是说 一个Contoller只是处理了一个请求、并没有处理多个请求 相当于将原来的Servlet 直接的给复制了一遍没有 通用性

5、SpringMVC的第二个HelloWorld程序

5.1、导包

同上面一样

5.2、编写web.xml配置文件

还是同上面一样

####5.3、编写配置文件

注意名字 核心Servlet在web.xml中名字-servlet.xml 文件名

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.1.xsd"
>


  <!--告诉他扫描路劲---Contoller所在的路径-->
  <context:component-scan base-package="com.qf.controller"></context:component-scan>

  <!--使能这个注解---让这个注解生效-->
  <mvc:annotation-driven></mvc:annotation-driven>
</beans>

5.4、编写Controller

@Controller                   //表示的是当前这个类是一个控制器
@RequestMapping("/users")     //当前这个控制器 映射的大的路径
public class UserController {
    
    @RequestMapping(value = "aa")     //当前的方法映射的路径(小的路径)
    public String aa(){
        System.out.println("我是中国人...");
        //表示返回的页面
        return "/bobo.jsp";
    }
}

5.5、解决配置文件路劲的问题


  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--告诉他 配置文件的路径在哪里?-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    
  </servlet>

6、SpringMVC执行的流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0yEqasln-1593476824840)(pic\1592466653269.png)]

7、SpringMVC如何向前端返回数据

7.1、第一种返回数据的方式

 @RequestMapping(value = "aa2")
    public String aa1(HttpServletRequest request){
        System.out.println("我是中国人...");
        request.setAttribute("title","哈哈哈哈哈");
        return "/bobo.jsp";
    }

7.2、第二种返回数据的方式

   @RequestMapping(value = "aa1")
    public ModelAndView aa1(ModelAndView modelAndView){
        System.out.println("我是中国人...");
        modelAndView.setViewName("/bobo.jsp");
        modelAndView.addObject("title","第一种返回数据的方式");
        return modelAndView;
    }

7.3、第三种返回数据的方式

    @RequestMapping(value = "aa3")
    public String aa1(Model model){
        System.out.println("我是中国人...");
        model.addAttribute("title2","你懂的不解释");
        return "/bobo.jsp";
    }

拓展:Contoller转发到Controller 然后传递数据的问题

8、SpringMVC如何接受前端传递过来的数据

8.1、传递简单的键值对的数据

   /**
     * 测试传递简单参数
     * @param deptName
     * @param deptDes
     * @return
     */
    @RequestMapping("parameter1")
    public String parameter1(String deptName,String deptDes){
        System.out.println("传递过来的数据是:"+deptName+"------"+deptDes);
        return "/bobo.jsp";
    }

8.2、传递键值对自动封装成对象

    /**
     * 接受数据的第二种方式直接封装成对象
     * 结论:只要前端传递过来的键值对的名称  和 后台对象中 属性的名称保持一致就可以了
     * @param dept
     * @return
     */
    @RequestMapping("parameter2")
    public String parameter2(Dept dept){
        System.out.println("传递过来的数据是:"+dept);
        return "/bobo.jsp";
    }

8.3、在同一个页面同一个方法不同对象相同的属性如何区分的问题

8.3.1、首先就是前端页面编写
  <%--用户的实体--%>
  <div>用户数据</div>
  <form action="/depts/parameter4.action" method="post">
      用户名:<input type="text" name="user.userName"><br>
      密码:<<input type="password" name="user.password"><br>
      <input type="submit" value="用户的数据提交"/>
  </form>
  <div>
      管理员数据
  </div>
  <form action="/depts/parameter4.action" method="post">
      用户名:<input type="text" name="admin.userName"><br>
      密码:<<input type="password" name="admin.password"><br>
      <input type="submit" value="管理员的数据提交"/>
  </form>
8.3.2、后台接受数据的编写

    /**
     * 传递参数的第四种方法
     * @return
     */
    @RequestMapping("parameter4")
    public String parameter3(UserAndAdmin userandAdmin){
        System.out.println("传递过来的用户数据是:"+userandAdmin.getUser());
        System.out.println("传递过来的管理员数据是:"+userandAdmin.getAdmin());
        return "/bobo.jsp";
    }


@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserAndAdmin {
    private User user;
    private Admin admin;
}

8.4、前端传递集合数据如何接受

8.4.1、前端的编写
<form action="/depts/parameter5.action" method="post">
    用户名:<input type="text" name="users[0].userName"><br>
    密码:<input type="password" name="users[0].password"><br>
    你的爱好:  美女<input type="checkbox" name="users[0].habbits"  value="1">
              帅哥<input type="checkbox" name="users[0].habbits"  value="2">
              其他<input type="checkbox" name="users[0].habbits"  value="3">
    <hr>
    用户名:<input type="text" name="users[1].userName"><br>
    密码:<input type="password" name="users[1].password"><br>
    你的爱好:  美女<input type="checkbox" name="users[1].habbits"  value="1">
              帅哥<input type="checkbox" name="users[1].habbits"  value="2">
              其他<input type="checkbox" name="users[1].habbits"  value="3">
    <hr>
    用户名:<input type="text" name="users[2].userName"><br>
    密码:<input type="password" name="users[2].password"><br>
    你的爱好:  美女<input type="checkbox" name="users[2].habbits"  value="1">
              帅哥<input type="checkbox" name="users[2].habbits"  value="2">
              其他<input type="checkbox" name="users[2].habbits"  value="3">
    <hr>
    用户名:<input type="text" name="users[3].userName"><br>
    密码:<input type="password" name="users[3].password"><br>
    你的爱好:  美女<input type="checkbox" name="users[3].habbits"  value="1">
              帅哥<input type="checkbox" name="users[3].habbits"  value="2">
              其他<input type="checkbox" name="users[3].habbits"  value="3">
    <hr>
    <input type="submit" value="提交">
</form>
8.4.2、后台接受数据的编写
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ListObject {
    private List<User> users;
}


/**
     * 传递参数的第四种方法
     * @return
     */
    @RequestMapping("parameter5")
    public String parameter5(ListObject userList){
        System.out.println(userList);
        return "/bobo.jsp";
    }

8.5、前端传递chexkbox类型的数据后台如何处理

    /**
     * 传递参数的第四种方法
     * @return
     */
    @RequestMapping("parameter5")
    public String parameter5(int[] habbits){
        System.out.println(habbits);
        return "/bobo.jsp";
    }

9、SpringMVC中日期格式的转换问题

9.1、将前端传递的日期起格式转换成一种形式

备注:那个Controller转换那么就 在那个里面编写如下的方法

    @InitBinder
    public void converter(ServletRequestDataBinder binder){
      binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false));
    }

9.2、自定义Editor转换多种共日期格式

9.2.1、自定义Editor
public class MyCustomDateEditor extends PropertyEditorSupport {

    private DateFormat[] dateFormats;

    private final boolean allowEmpty;

    private final int exactDateLength;


    /**
     * Create a new CustomDateEditor instance, using the given DateFormat
     * for parsing and rendering.
     * <p>The "allowEmpty" parameter states if an empty String should
     * be allowed for parsing, i.e. get interpreted as null value.
     * Otherwise, an IllegalArgumentException gets thrown in that case.
     * @param allowEmpty if empty strings should be allowed
     */
    public MyCustomDateEditor(DateFormat[] dateFormats, boolean allowEmpty) {
        this.dateFormats = dateFormats;
        this.allowEmpty = allowEmpty;
        this.exactDateLength = -1;
    }

    /**
     * Create a new CustomDateEditor instance, using the given DateFormat
     * for parsing and rendering.
     * <p>The "allowEmpty" parameter states if an empty String should
     * be allowed for parsing, i.e. get interpreted as null value.
     * Otherwise, an IllegalArgumentException gets thrown in that case.
     * <p>The "exactDateLength" parameter states that IllegalArgumentException gets
     * thrown if the String does not exactly match the length specified. This is useful
     * because SimpleDateFormat does not enforce strict parsing of the year part,
     * not even with {@code setLenient(false)}. Without an "exactDateLength"
     * specified, the "01/01/05" would get parsed to "01/01/0005". However, even
     * with an "exactDateLength" specified, prepended zeros in the day or month
     * part may still allow for a shorter year part, so consider this as just
     * one more assertion that gets you closer to the intended date format.
     * @param allowEmpty if empty strings should be allowed
     * @param exactDateLength the exact expected length of the date String
     */
    public MyCustomDateEditor(DateFormat[] dateFormats, boolean allowEmpty, int exactDateLength) {
        this.dateFormats = dateFormats;
        this.allowEmpty = allowEmpty;
        this.exactDateLength = exactDateLength;
    }


    /**
     * Parse the Date from the given text, using the specified DateFormat.
     */
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (this.allowEmpty && !StringUtils.hasText(text)) {
            // Treat empty String as null value.
            setValue(null);
        } else if (text != null && this.exactDateLength >= 0 && text.length() != this.exactDateLength) {
            throw new IllegalArgumentException(
                    "Could not parse date: it is not exactly" + this.exactDateLength + "characters long");
        } else {


            boolean b=false;
            for (DateFormat d : dateFormats) {
                try {
                    setValue(d.parse(text));
                    b=true;
                    return;
                } catch (Exception err) {
                    continue;
                }
            }

            if(!b){
                throw new IllegalArgumentException("Could not parse date: ");
            }

        }

    }

    /**
     * Format the Date as String, using the specified DateFormat.
     */
    @Override
    public String getAsText() {
        Date value = (Date) getValue();

        if (null != value) {
            //遍历这个东东
            for (DateFormat d : dateFormats) {
                try {
                    return d.format(value);
                } catch (Exception err) {
                    continue;
                }
            }
        } else {
            return "";
        }

        return null;
    }
}
9.2.2、编写日期格式转换器
    private DateFormat[] dateFormat={
            new SimpleDateFormat("yyyy年MM月dd日"),
            new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyy/MM/dd")

    };


    @InitBinder
    public void converter(ServletRequestDataBinder binder){
        binder.registerCustomEditor(Date.class, new MyCustomDateEditor(dateFormat,false));
    }

9.2.3、解决传输POST请求的时候的编码问题

备注:在web.xml中配置如下

  <!--字符编码的处理  仅仅是处理  POST请求  GET请求未处理-->
  <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>

10、SpringMVC中的文件的上传和下载问题

10.1、文件的上传

10.1.1、导入fileupload的包
     <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

#####10.1.2、准备jsp文件

 <form action="/fileUpload.action" method="post" enctype="multipart/form-data">
       <input type="file" name="file"><br>
       <input type="submit" value="提交文件">
   </form>
10.1.3、配置springmvc支持文件上传
   <!--允许SpringMVC实现文件的上传  注意事项 下面的名字multipartResolver不能乱写
        乱写要出问题
    -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="100000000"></property>
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

10.1.4、编写controller
    @RequestMapping("fileUpload")
    public String fileupload(@RequestParam("file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        System.out.println("接受到文件的名字是:"+fileName);
        file.transferTo(new File("G:/xiaobobo.jpg"));
        return "/bobo.jsp";
    }

10.2、文件的下载

   /**
     * 玩的是文件的下载
     * @return
     * @throws IOException
     */
    @RequestMapping("download")
    public ResponseEntity<byte[]> download() throws IOException {
        HttpHeaders headers=new HttpHeaders();
        headers.add("Content-Disposition","attachment;filename=xiaobobo.jpg");
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File("G:/xiaobobo.jpg")),headers,HttpStatus.OK);
    }

11、SpringMVC中传递的数据的前置处理和后置处理(作业)

作业:简单的说前端传递数据的时候 进行 编码处理 在requestbody之前进行解码处理 在response之后进行编码处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyeAyWqR-1593476824843)(pic\1592554214863.png)]

12、SpringMVC中返回JSON格式字符串的问题

注意:要在Spring中返回json格式字符串的话 那么需要在 spring-mvc.xml中 配置 消息转换器

消息转换器是用来干嘛的?

​ 转换消息的 ------ 客户端发送到服务端的消息

​ 服务端返回给客户端的消息

​ 1、转换成json的 HttpMessageConver…

​ 2、处理返回中文的乱码问题的 StringMessageConver…

12.1、配置消息转换器


    <!--配置处理消息的消息转换器 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="false">

            <!--解决@Responcebody中文乱码问题 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"></constructor-arg>
            </bean>

            <!--配合fastjson支持 如果我们返回的是java对象的话 那么默认就使用下面的消息转换器来转换内容-->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="defaultCharset" value="UTF-8"></property>
                <property name="supportedMediaTypes">
                    <list>
                        <!--顺序保持这样,避免IE下载出错 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
            </bean>

        </mvc:message-converters>
    </mvc:annotation-driven>

12.2、编写代码

@Controller
public class StaffController {
    /**
     * 这个测试下返回json的问题
     * @return
     */
    @RequestMapping("returnJson")
    @ResponseBody                     //这个注解的意思是要将返回的数据  直接转换成json格式
    public Object returnJson(){
        System.out.println("我是小王子....");
        return "我是小王子";
    }
    @RequestMapping("returnObject")
    @ResponseBody                     //这个注解的意思是要将返回的数据  直接转换成json格式
    public Object returnObject(){
        System.out.println("我是小王子....");
        return new User(1,"小波波","123");
    }
    @RequestMapping("rquestJson")
    @ResponseBody                     //这个注解的意思是要将返回的数据  直接转换成json格式
    public Object returnObject(@RequestBody User user){
        System.out.println("我是小王子....:"+user);
        return new User(1111,"小波波1111","123111");
    }
}

13、拦截器的问题

这个拦截器 有点类似于 咋们的过滤器 只不过 过滤器能够过滤所有请求 拦截器 只能拦截 controller的请求

13.1、编写拦截器

public class MyInterceptor1 implements HandlerInterceptor {

    /**
     * 在执行controller请求之前执行的
     * @param request
     * @param response
     * @param handler
     * @return :返回true和false 表示的是是否拦截
     * true:不拦截    false:拦截
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("------------preHandle------------");

        return true;
    }

    /**
     * 执行完Controller之后 执行的
     * @param request
     * @param response
     * @param handler
     * @param modelAndView :Controller返回给视图解析器的 这个视图和数据  你可以敢于他
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("------------postHandle------------");
        modelAndView.addObject("userName","小日本");
        modelAndView.setViewName("/file.jsp");

    }

    /**
     *
     * 做统一的异常处理
     *
     * 出现异常的时候执行的
     * @param request
     * @param response
     * @param handler
     * @param ex:如果是Controller出现了 异常那么这个对象 就不为null
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        if(null!=ex){ //说明在控制器产生异常了
            System.out.println("出现异常了....");
        }
    }
}

13.2、编写配置文件

 <mvc:interceptors>
        <!--如果你是在根目录下 直接申明  那么 就会拦截所有的Controller-->
       <!-- <bean id="interceptor1" class="com.qf.controller.interceptor.MyInterceptor1"></bean>-->


        <!--这个配置就更加精细了  告诉他 拦截谁 不拦截谁
            /*   *表示的是一级路径  http://127.0.0.1:8080/bobo
            /**  这个范围就更广了
                    http://127.0.0.1:8080/bobo
                    http://127.0.0.1:8080/bobo/xxx/yyy
        -->
        <mvc:interceptor>
            <mvc:mapping path="/depts/**"/>  <!--这个需要拦截-->
            <mvc:exclude-mapping path="/users/**"></mvc:exclude-mapping> <!--这个不需要拦截-->
            <bean class="com.qf.controller.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>


    </mvc:interceptors>

13.3、测试

13.4、拦截器的另一种实现(不能拦截 只能过滤)

public class MyInterceptor2 implements WebRequestInterceptor {
    public void preHandle(WebRequest request) throws Exception {
        //这个不能拦截
    }

    public void postHandle(WebRequest request, ModelMap model) throws Exception     {

    }

    public void afterCompletion(WebRequest request, Exception ex) throws Exception {

    }
}

13.5、配置方式

跟上面一样

14、SpringMVC中请求方法确定

只有某一种请求才能到达这个方法

//    @RequestMapping(value = "parameter1",method = RequestMethod.GET)
    @GetMapping(value = "parameter1")
    public String parameter1(String deptName,String deptDes){
        System.out.println("传递过来的数据是:"+deptName+"------"+deptDes);
        return "/bobo.jsp";
    }

    /**
     * 接受数据的第二种方式直接封装成对象
     * 结论:只要前端传递过来的键值对的名称  和 后台对象中 属性的名称保持一致就可以了
     * @param dept
     * @return
     */
//    @RequestMapping(value = "parameter2",method = RequestMethod.POST)
    @PostMapping(value = "parameter2")
    public String parameter2(Dept dept){
        System.out.println("传递过来的数据是:"+dept);
        return "/bobo.jsp";
    }

如果整个Controller都要返回JSON格式的数据 不会进行页面的跳转

@Controller -------- @RestController

@RestController   //这个注解表示整个Controller的返回值 都是 json格式
public class MeetingNotcieController {

    /**
     * 测试返回json
     * @return
     */
    @RequestMapping(value = "aa7",method = RequestMethod.GET)
    public User aa(){
        return new User(1,"小波波","123");
    }
}
展开阅读全文
©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值