一、controller层回显数据到网页
我们可以想一想,JDBC中servlet层是如何把数据保存并将数据响应给前端页面的。这里的controller层回显数据到网页的原理与其不经相同。
requset:作用范围: 同一个请求内有效。requset.setAttribute(key,value)保存数据。
session:作用范围: 同一个会话有效,只要会话不关闭会一直有效。setAttribute(key,value)
el表达式:获取保存的数据 ${scope.key}
springmvc保存数据到网页:
- 我们同样可以用requset或者session来存储数据。这需要引入javax.servlet-api的jar
- 推荐使用springmvc内置的存储数据的类-----Model类
Model存储数据的方法为:model(Model类型的变量名).addAttribute("key",value);model存储数据的范围和requset的范围相同。在同一model中可以获取数据(requset是在同一个请求下可以获取数据)。
Model也可以通过追加注解———@SessionAttributes(value = {"key1","key2",.....}) 来设置哪些model的key加入到session范围。这些key的数据会同时存储到类似request和session两个范围内。
package com.lrs.controller;
import com.lrs.entity.User;
import com.sun.deploy.net.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @作者:刘壬杉
* @创建时间 2022/6/8
**/
@Controller
@SessionAttributes(value = {"user2"})
public class UserController {
@RequestMapping(value = "list")
public String list(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setAttribute("user2",new User("刘壬杉",null,0,"123"));//存储到session层
request.setAttribute("user",new User("刘壬杉",null,0,"123"));//存储到request层
return "redirect:main.jsp";
}
@RequestMapping(value = "list2")
public String list2(Model model){
model.addAttribute("user",new User("刘壬杉",null,0,"123"));//存储在类似request和session层
model.addAttribute("user2",new User("刘壬杉",null,0,"123"));//存储在类似request层
return "main.jsp";
}
}
二、使用重定向跳转
我们之前在controller层写的方法返回值类型为String时,做的是跳转的功能,实际上他的跳转方式是请求转发。那么要想使用重定向跳转页面,只需要在方法的返回字符串的内容时加上redirect:
三、springMVC返回json数据
当前端页面发起异步请求,ajax请求时,需要我们后端响应一个json格式的数据。在JDBC中,要让servlet层返回json数据,需要我们导入一个jar----fastjson.jar来帮我们把CommenResult公共结果类转换成JSON。在springmvc中,内置了一个转换json格式的jar---jackson-databind.jar
实现步骤:
(1)在pom.xml中引入jackson-databind的依赖jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.2</version>
</dependency>
(2) 在controller返回的数据类型变成javabean对象 。只需加入一个注解:@ResponseBody
@RequestMapping("json01")
@ResponseBody //作用:把java对象转换为json对象
public List<Student> json01(){ //这里返回的类型为java对象。 之前都是返回字符串
List<Student> list=new ArrayList<Student>();
list.add(new Student(1,"张三","2300316070@qq.com",new Date()));
list.add(new Student(2,"李四","110@qq.com",new Date()));
list.add(new Student(3,"王五","210@qq.com",new Date()));
list.add(new Student(4,"赵六","220@qq.com",new Date()));
return list;
}
返回的时间类型的json数据显示的为毫秒,正常情况应该显示时间格式。解决办法:在实体类中的事件类型的属性上加入注解@JsonForMat(pattern = "yyyy-MM-dd")。
四、springMVC的全局异常处理类
全局异常处理类的作用: 当controller发生异常,则有全局异常类来处理并执行相应的处理方法。 异常处理类需要写在handler包下。
使用方法:
(1)创建一个异常类: @ControllerAdvice注解
@ControllerAdvice //表示该为类controller的异常处理类
public class MyExceptinHandle {
@ExceptionHandler(value = RuntimeException.class) //当发生RuntimeException就会触发该方法
public String error(){
return "error.jsp";
}
@ExceptionHandler(value = Exception.class) //当发生Exception就会触发该方法
public String error2(){
return "error2.jsp";
}
}
(2) 保证springmvc能够扫描到该类。
五.springMVC拦截器
过滤器: 过滤掉某些资源,
拦截器只会拦截controller层的资源路径。
如何使用拦截器:
(1)创建一个类,并实现HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor {
//拦截器的处理方法。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("经过了该拦截器");
return true;//true:表示拦截器放行 false:不放行
}
}
(2) 把该类注册到springmvc配置文件上。
<!--拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--/**: 表示n层路径 /*:表示一层路径 -->
<mvc:mapping path="/**"/>
<!--exclude-mapping:设置不经过该拦截的路径-->
<mvc:exclude-mapping path="/list2"/>
<mvc:exclude-mapping path="/list3"/>
<!--bean表示你自定义的拦截器类路径-->
<bean class="com.lrs.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>