1.如何把controller数据返回到网页并回显
之前我们讲解servlet时,如何把数据保存并可以在网页上获取该数据。
request: 作用范围: 同一个请求内有效。setAttribute(key,value)
session:作用范围: 同一个会话有效,只要会话不关闭会一直有效。setAttribute(key,value)
网页如何获取保存的数据呢:可以使用EL表达式。${scope.key}
思考: 在springmvc中如何保存数据到网页上。
package com.wzh.controller;
import com.wzh.entity.Student;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
/**
* @ProjectName: Springmvc0608_4
* @Package: com.wzh.controller
* @ClassName: HelloController
* @Author: 王振华
* @Description:
* @Date: 2022/6/9 8:50
* @Version: 1.0
*/
@Controller //标记该类为处理类
@SessionAttributes(value = {"student"}) //设置哪些model的key在session范围
public class HelloController {
@RequestMapping(value = "/list1")
public String list1(HttpServletRequest request){
Student student = new Student(new Date(),"张三","郑州");
//保存到request中,同一请求
request.setAttribute("student",student);
return "aaa.jsp"; //转发到aaa.jsp
}
@RequestMapping(value = "/list2")
//如果你使用request,你和tomcat容器绑定了。 建议使用Model.
public String list2(Model model){
Student student = new Student(new Date(),"张三","郑州");
//model对象可以理解为request对象。凡是在该对象中保存的数据,作用范围同一个请求有效。
model.addAttribute("student",student);
return "aaa.jsp"; //转发到aaa.jsp
}
//上面讲解都是保存request范围。如何保存到session范围。
@RequestMapping(value = "/list3")
public String list3(HttpSession session){
Student student = new Student(new Date(),"张三1","郑州");
session.setAttribute("student",student);
return "aaa.jsp"; //转发到aaa.jsp
}
@RequestMapping(value = "/list4")
public String list4(Model model){
Student student = new Student(new Date(),"中石油2","郑州");
model.addAttribute("student",student);//默认在request范围
return "aaa.jsp"; //转发到aaa.jsp
}
}
使用request session的前提是 引入javax-servlet-api的jar包
model存入session会话的同时也会存入request,因为默认存入request请求
aaa.jsp 依旧用el表达式获取
2.如何使用重定向跳转
在方法的返回字符串的内容时加上redirect:
@RequestMapping(value = "/list5")
public String list5(Model model){
Student student = new Student(new Date(),"中石油2","郑州");
model.addAttribute("student",student);//默认在request范围
return "redirect:aaa.jsp"; //当springmvc看到你返回的字符串钟含有redirect:时 它认为你要进行重定向跳转
}
3.springmvc返回json数据
(1)什么时候需要返回json数据。
异步请求时,ajax请求时。
(2)之前在servlet时如何返回json数据呢?
借助了Fastjson---手动把java对象转换为json格式的数据,并使用out.print(json)输出json数据。 关闭out对象。
springmvc如何返回json数据呢!
(1)内置了一个jar. jackson的jar包
<!--jackson依赖 可以把java对象转换为json对象-->
<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,"周润发","23003@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
}
(3) 访问该路径
发现: 上面返回的时间类型的json数据显示的为毫秒,正常情况应该显示时间格式。如何解决。
4. springmvc的全局异常处理类
一旦后台出现异常时,网页会显示很丑的异常信息。 为了可以显示好看,我们定义一个统一的异常处理类。
异常的结构:
Throwable: 异常的根类。
Error: 错误。这个错误程序员无法解决。
Exception:异常。
编译异常:
运行时异常: RuntimeException: 只会在运行的时候出现。
全局异常处理类的作用: 当controller发生异常,则有全局异常类来处理并执行相应的处理方法。
如何使用全局异常处理类
[1] 创建一个异常类: @ControllerAdvice注解
@ControllerAdvice //标记该类为异常处理类
public class MyHandler {
@ExceptionHandler(value = RuntimeException.class) //当发生RuntimeException就会触发该方法
public String error(){
System.out.println("运行时发生了异常");
return "redirect:error.jsp";
}
}
[2] 保证springmvc能够扫描到该类。
也可以写个com.wzh 因为他会扫描指定包及子包
如果是axios请求返回的应该是一个json数据。
5. springmvc拦截器
过滤器: 过滤掉某些资源,
拦截器只会拦截controller层的资源路径。一定要放行静态资源
springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。
如何使用拦截器:
(1)创建一个类,并实现HandlerInterceptor 重写preHandle方法
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setContentType("application/json;charset=utf-8");
//判断session钟是否有值
System.out.println("===========================");
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user!=null){
return true;
}
PrintWriter writer = response.getWriter();
CommonResult result=new CommonResult(5001,"请先登录",null);
ObjectMapper objectMapper=new ObjectMapper();
String json = objectMapper.writeValueAsString(result); //把java对象转换为json字符串。
writer.print(json);
writer.flush();
writer.close();
return false;
}
}
(2) 把该类注册到springmvc配置文件上。
<!--拦截器的配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--mapping:哪些路径需要经过拦截器
/**: 表示n层路径
/*:表示一层路径
-->
<mvc:mapping path="/**"/>
<!--exclude-mapping:设置不经过该拦截的路径-->
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/imgs/**"/>
<!--bean表示你自定义的拦截器类路径-->
<bean class="com.wzh.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
需要注意的是静态资源的放行
总结
1. controller如何把数据相应到页面:
request:
model:---默认范围为request, 可以设置为session范围
session:2. 返回json数据:
(1)引入jackson依赖。
(2)方法上@ResponseBody注解。那么该方法返回的任何类型都会作为json数据。3. 全局异常处理类: 当controller程序中出现异常,则会交于该类处理异常。
(1)创建一个类并且该类@ControllerAdvice
(2)在相应的方法上@HandlerException
注意:一定要让springmvc能够扫描到。
4. 拦截器: 创建一个类并实现HandlerInterceptor接口
重写拦截的方法。
把该拦截器注册到springmvc容器中。