欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SSM框架篇:SpringMVC响应数据&结果视图

程序员文章站 2022-03-23 11:13:01
环境搭建第一步:创建maven工程并导入坐标 pom.xml UTF-8 1.8 1.8

环境搭建

第一步:创建maven工程并导入坐标 pom.xml
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <spring.version>5.0.2.RELEASE</spring.version>
</properties>
<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>
</dependencies>
第二步:编写核心控制器 web.xml
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 配置解决中文乱码的过滤器 -->
  <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>
  
  <!-- 配置前端控制器 -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置Servlet的初始化参数,读取springmvc配置文件,创建spring容器 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 配置servlet启动时加载对象 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
第三步:创建springmvc.xml配置文件
<?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"
       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">
    <!-- 配置spring在创建容器时要扫描的包 -->
    <context:component-scan base-package="cn.itcast"/>
    <!-- 配置视图解析器 -->
    <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/>
</beans>
第四步:编写index.jsp页面
<a href="user/testString">返回String</a>
第五步:编写控制器并使用注解
@Controller
@RequestMapping("/user") //第一级访问目录
public class UserController {

    @RequestMapping("/testString") //第二级访问目录
    public String testString() {
        System.out.println("testString方法执行了.....");
        return "success";
    }
}
第六步:编写success.jsp页面
<h3>执行成功!</h3>

环境搭建完成后的目录结构:
SSM框架篇:SpringMVC响应数据&结果视图

返回值分类

可以将返回值分为三类

第一类:返回值是字符串

控制器方法返回字符串可以指定逻辑视图名,通过视图解析器将逻辑视图名解析为物理视图地址。
response.jsp

<a href="user/testString">返回String</a>

控制器代码

@RequestMapping("/testString")
public String testString(Model model) {
    //模拟从数据库中查询出一个对象
    User user = new User();
    user.setUsername("zhangsan");
    user.setPassword("123");
    user.setAge(21);
    //model对象存储数据到request域
    model.addAttribute(user);
    return "success";
}

success.jsp 取出数据

<h3>执行成功!</h3>
${requestScope.user.username} <!-- zhangsan -->
${requestScope.user.password} <!-- 123456 -->
${requestScope.user.age} <!-- 21 -->

效果图:
SSM框架篇:SpringMVC响应数据&结果视图

第二类:返回值是void

如果控制器的方法返回值是void,执行程序会报404的异常,默认查找的jsp页面没有找到。返回值为void,默认情况下会去找请求路径相对应的jsp页面,如果没有则报404。例如,某个方法的请求url为"/saveUser",那么方法执行完成后默认跳转的页面是saveUser.jsp,如果我们没有对应的jsp页面,那么将会报404的错误。有没有什么解决方法呢?其实我们可以使用请求转发或者重定向跳转到指定的页面。
response.jsp

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

控制器代码

@RequestMapping("/testVoid") //如果返回值是void,那么方法执行完成后默认跳转的页面是testVoid.jsp
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
    //转发到指定页面
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    //重定向
    response.sendRedirect(request.getContextPath()+"/response.jsp");

    //解决中文乱码问题
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    //直接进行数据响应
    response.getWriter().print("哈喽");
    return; //如果不想让后边的代码执行,可以在这里添加return
}

第三类:返回值是ModelAndView对象

ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
response.jsp

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

控制器代码

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
    //创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    //模拟从数据库中查询出一个user对象
    User user = new User();
    user.setUsername("lisi");
    user.setPassword("456");
    user.setAge(21);
    //把user对象存储到ModelAndView对象当中,底层会把其存储到request域中
    modelAndView.addObject("user",user);
    //跳转到success.jsp页面
    modelAndView.setViewName("success");
    return modelAndView;
}

SpringMVC提供的转发和重定向

forword转发

注意:使用转发,底层不会调用视图解析器,需要写完整路径

@RequestMapping("/testForward")
public String testForward() {
    //转发
    return "forward:/WEB-INF/pages/success.jsp";
}
@RequestMapping("/testUpdate")
public String update() {
    return "forward:/user/findAll"; //也可以转发到另一个路径,重新查询后再跳转到JSP页面
}

重定向

注:使用重定向,可以不用写虚拟目录

@RequestMapping("/testRedirect")
public String testRedirect(){
    //请求的转发
    return "redirect:/response.jsp";
}
@RequestMapping("/testUpdate")
public String delete() {
    return "redirect:/user/findAll"; //也可以转发到另一个路径,重新查询后再跳转到JSP页面
}

ResponseBody注解响应json数据

注解用于将控制器的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据,通过Response响应给客户端浏览器。
当我们使用静态资源时,存在一个问题:例如当我们在页面中引入jQuery文件时,是没有问题的。但是我们在web.xml中配置过前端控制器,任何资源都会被拦截到,那么这个前端控制器会把我们的静态资源给拦截了,所以我们就需要在springmvc.xml配置文件中配置静态资源不进行拦截。
使用的标签是mvc:resources

<!-- 过滤静态资源 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>

代码演示
需求:使用@ResponseBody注解实现将控制器方法返回对象转换为json格式再响应给客户端浏览器。SpringMVC底层会帮我们对json数据进行转换,但是我们需要导入相关的jar包

第一步:导入相关坐标
<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>

第二步:编写reponse.jsp页面 发送ajax请求

<script>
    $(function() {
        $("#btn").click(function() {
            //alert("hello");
            //发送ajax请求
            $.ajax({
                //编写json格式的属性和值
                url:"user/testAjax",
                contentType:"application/json;charset=utf-8",
                data:'{"username":"wangwu", "password":"123", "age":22}',
                dataType:"json",
                type:"post",
                success:function(data) {
                    //data是服务器端响应的json数据,进行解析
                    alert(data);
                    alert(data.username);
                    alert(data.password);
                    alert(data.age);
                }
            })
        });
    });
</script>
<button id="btn">发送ajax请求</button>

控制器代码

@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
    System.out.println("testAjax方法执行了.....");
    //客户端发送的是ajax请求,传的是json的字符串,框架把json字符串封装到user对象
    System.out.println(user);
    //模拟查询数据库
    user.setUsername("haha");
    user.setAge(25);
    //做响应
    return user;
}

本文地址:https://blog.csdn.net/weixin_51678389/article/details/109208763