文章目录

(一)搭建环境(二)返回值是String类型
(三)返回值是void类型
(四)返回值是ModelAndView类型
(五)使用forward和redirect进行页面跳转
(六)响应json数据:过滤静态资源
(七)响应json数据:发送ajax的请求
(八)响应json数据:响应json格式数据

(一)搭建环境

创建一个新的javaweb的maven工程,如下:

java里怎么定义response对象_web


编译版本改成1.8,如下:

java里怎么定义response对象_spring_02


然后把上个项目的pom.xml中的依赖复制过来,如下:

(其实后面是需要引入新的坐标的,后面用到的时候再详细介绍)

<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

进行Spring的版本锁定,如下:

java里怎么定义response对象_ajax_03


接着配置web.xml,如下:

(主要是前端控制器和解决中文乱码的过滤器的相关配置)

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!--  配置前端控制器-->
    <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:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--    配置解决中文乱码的过滤器-->
    <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>
</web-app>

补全目录,如下:

java里怎么定义response对象_java_04


把上一个项目的springmvc.xml复制过来,如下:

(主要是配置注解扫描视图解析器自定义类型转换器以及开启注解支持,但是我们用不上自定义类型转换器了,所以我们删掉)

java里怎么定义response对象_java里怎么定义response对象_05


springmvc.xml

<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"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--    开启注解扫描-->
    <context:component-scan base-package="com.zzq"></context:component-scan>
    <!--    视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--    开启SpringMVC框架注解的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

把原本的index.jsp删了,再创建一个新的index.jsp,这样就可以支持中文,如下:

(后面我们可以用这个index.jsp来发送请求,模拟前端的功能)

java里怎么定义response对象_web_06


java里怎么定义response对象_java里怎么定义response对象_07


最后再写一个请求成功的返回页面,如下:

java里怎么定义response对象_spring_08

(二)返回值是String类型

前端代码如下:

<a href="user/testString">testString</a>

后端代码如下:

  • 先写一个User实体类

    我们上一篇介绍SessionAttributes注解的适合介绍过Model接口,我们结合JSP来实操一下
  • 再写一个控制器类的方法

    此时user对象被放到了request域中,可以通过success.jsp获取返回的数据
  • 成功返回页面获取数据

运行结果如下:

java里怎么定义response对象_web_09

(三)返回值是void类型

前端代码如下:

<a href="user/testVoid">testVoid</a>

后端代码如下:

@RequestMapping("/testVoid")
    public void testVoid() {
        System.out.println("testVoid方法执行了...");
    }

这种情况下是不会跳转到success.jsp页面的,我们直接运行试试这种默认情况会是怎么样的,如下:

java里怎么定义response对象_web_10


java里怎么定义response对象_web_11


可以看到前端网页返回404,但是后端控制器类的方法是可以正常执行的下面分析一下前端404的原因,如下:

java里怎么定义response对象_java_12


默认情况:如果返回值是void,则会默认返回一个跟请求路径同名的jsp页面

而我们显然没有准备这个页面,所以就报404错误了,那要怎么样才能让它返回success.jsp页面呢?

我们需要借助原生APIHttpServletRequest request, HttpServletResponse response

注意

  1. 我们写的是转发,转发路径不需要写项目名,如果是重定向则需要写(看回之前的Servlet文集)
    文集链接(点击跳转):Servlet:请求转发Servlet:重定向
  2. 必须写完整的路径:/WEB-INF/pages/success.jsp,因为是手动转发,视图解析器没起作用
  3. 一般转发完成后,控制器类的方法中剩余的代码会正常执行的,如果没有代码要执行就return;
  4. java里怎么定义response对象_web_13

  5. 运行效果如下:
    实际访问的路径地址栏的路径一样,没有发生改变)
  6. java里怎么定义response对象_web_14


  7. java里怎么定义response对象_spring_15

  8. 上面是使用了request对象进行请求转发,接下来介绍使用response对象进行重定向,如下:
  9. java里怎么定义response对象_java里怎么定义response对象_16

  10. 注意:重定向本应该要写项目名(虚拟目录)的,但是我们可以使用request.getContextPath()去动态获取虚拟目录

运行结果如下:

(重定向是会改变地址栏的URL的,所以说重定向是两次请求;而请求转发则是一次请求

java里怎么定义response对象_java里怎么定义response对象_17


访问的路径是:localhost/user/testVoid,地址栏的路径是:localhost/user/testRedirect 说明路径发生了变化,一共进行了两次请求,这是重定向的鲜明特点

java里怎么定义response对象_java_18


上面两种情况(请求转发重定向)都是由tomcat来完成的(调用的API是tomcat的)

我们其实可以使用输出流直接进行响应,如下:

//直接进行响应
    //解决中文乱码问题
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().print("你好");
    return;

运行效果如下:

java里怎么定义response对象_java_19

(四)返回值是ModelAndView类型

其实返回值是ModelAndView类型的情况跟返回值是String类型的情况比较像,我们先回顾一下

java里怎么定义response对象_java_20


下面介绍返回值是ModelAndView类型的情况

前端代码如下:

<a href="user/testModelAndView">testModelAndView</a>

后端代码如下:

@RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView() {
        //创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView方法执行了...");
        //模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("哈哈");
        user.setPassword("123");
        user.setAge(21);
        //把user对象存储到mv对象中,它底层会把user对象存入到request域对象中
        mv.addObject("user", user);
        //跳转到哪个页面
        mv.setViewName("success");
        return mv;
    }

注意:该返回值类型的方法可以使用视图解析器,所以无须指定success.jsp的路径

运行结果如下:

java里怎么定义response对象_spring_21


java里怎么定义response对象_web_22

(五)使用forward和redirect进行页面跳转

我们之前是基于原生API实现请求转发重定向的功能,其实可以使用springmvc提供的关键字实现
但是这种方式比较少用,同时使用该关键字是无法使用视图解析器对象的,下面简单介绍一下
前端代码如下:

<a href="user/testForwardOrRedirect">testForwardOrRedirect</a>

后端代码如下:
(先演示forward,后面再演示redirect

@RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect() {
        System.out.println("testForwardOrRedirect方法执行了...");
        //请求的转发
        return "forward:/WEB-INF/pages/success.jsp";
    }

运行结果如下:

java里怎么定义response对象_java_23


下面演示redirect,如下:

@RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect() {
        System.out.println("testForwardOrRedirect方法执行了...");
        //重定向
        return "redirect:/user/testRedirect";
    }

    @RequestMapping("/testRedirect")
    public String testRedirect() {
        System.out.println("testRedirect方法执行了...");
        return "success";
    }

运行效果如下:

java里怎么定义response对象_web_24


注意

  1. 由于我配置tomcat的时候把项目名(虚拟目录)配成/,所以重定向的时候不需要加虚拟目录
  2. 其实就算配置tomcat的时候配置了虚拟目录,在写重定向的时候也不需要加虚拟目录了,springmvc会帮我们自动加上去的(同一个服务器的情况下),这里不再演示了

(六)响应json数据:过滤静态资源

首先搭建环境,在webapp目录下创建js文件夹,并且导入jquery文件,如下:

java里怎么定义response对象_java_25


接着在index.jsp中引入jquery文件,如下:

java里怎么定义response对象_web_26


接下来模拟ajax请求,如下:

java里怎么定义response对象_ajax_27


然后发现点击button后,没有弹窗弹出来

java里怎么定义response对象_ajax_28


因为我们在web.xml中写了拦截所有请求,包括了静态资源(css、js等),如下:

java里怎么定义response对象_ajax_29


因为我们的jquery文件是部署在服务器中的,jsp网页需要请求服务器获取jquery文件,但是被前端控制器拦截下来了,无法请求成功,自然也就无法出现弹窗,F12如下:

java里怎么定义response对象_java里怎么定义response对象_30


我们可以配置不过滤静态资源,即不对静态资源进行拦截来解决这类问题,如下:

springmvc.xml

java里怎么定义response对象_spring_31


考虑到未来业务需要,我们把cssimage也配置上去,如下:

<!--    前端控制器,哪些静态资源不拦截-->
    <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 -->
    <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 -->
    <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->

现在重新运行服务器,效果如下:

java里怎么定义response对象_java里怎么定义response对象_32

(七)响应json数据:发送ajax的请求

上面的弹窗案例只是模拟ajax请求,接下来我们编写真正的ajax请求

<script>
        //页面加载,绑定单击事件
        $(function () {
            $("#btn").click(function () {
                // alert("hello btn");
                //发送ajax请求
                $.ajax({
                    //编写json格式,设置属性和值
                    url: "user/testAjax",
                    contentType: "application/json;charset=UTF-8",
                    data: '{"username":"hehe","password":"123","age":"21"}',
                    dataType: "json",
                    type: "post",
                    success: function (data) {
                        //data:服务器端响应的json数据
                        alert(data);
                    }
                });
            });
        });
    </script>

接着编写后端方法,如下:
(可以使用@RequestBody注解获取请求体的内容)

@RequestMapping("/testAjax")
    public void testAjax(@RequestBody String body) {
        System.out.println("testAjax方法执行了...");
        System.out.println(body);
    }

运行效果如下:

java里怎么定义response对象_java里怎么定义response对象_33

(八)响应json数据:响应json格式数据

我们首先把json数据封装成JavaBean对象
此时我们需要借助jackson包,在pom.xml中导入坐标,如下:

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>

此时我们方法的形参不能再写body了,要写user,如下:
(springmvc已经把jackson的一些功能集成进去,所以使用非常方便,只需要改一下形参就可以了)

@RequestMapping("/testAjax")
    public void testAjax(@RequestBody User user) {
        System.out.println("testAjax方法执行了...");
        //客户端发ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
    }

运行效果如下:

java里怎么定义response对象_spring_34


我们接下来实现响应json数据,如下:

java里怎么定义response对象_java_35


加了@ResponseBody注解并且指定返回值类型,就可以把JavaBean对象转换成Json数据

这是springmvc帮我们自动完成的

接下来修改页面,如下:

java里怎么定义response对象_ajax_36


效果是可以成功弹窗并显示相应信息的,这里不再演示了

总结:导入了jackson坐标后,就无需关心JavaBeanJson之间的转换了