SSM框架篇:SpringMVC响应数据&结果视图
环境搭建
第一步:创建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>
环境搭建完成后的目录结构:
返回值分类
可以将返回值分为三类
第一类:返回值是字符串
控制器方法返回字符串可以指定逻辑视图名,通过视图解析器将逻辑视图名解析为物理视图地址。
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 -->
效果图:
第二类:返回值是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
上一篇: JS完成时间实时更新(Date)
下一篇: JAVA Web07——Ajax