request的作用范围:同一个请求中有效
request.setAttribute(key(键),value(值)),可以将数据存放在当前
request中.
前端调用使用${键名}
@RequestMapping(value = "m1")
public String m1(HttpServletRequest request){
//存放在request中
Student student=new Student("王五",new Date(),1,"南京");
request.setAttribute("s",student);
return "index.jsp";
}
model的作用等同于request,也相当于保存在同一个请求中。
如果使用request的话相当于你和tomcat容器绑定了, 建议使用Model。
model.addAttribute(key(键),value(值)),将数据存放在当前model中(等同于存放在request中)
前端获取的方法与request一样
@RequestMapping(value="mo1")
public String mo1(Model model){
//model与request一样
Student student=new Student("张三",new Date(),1,"武汉");
//将数据存入到model中
model.addAttribute("m1",student);
return "mod.jsp";
}
session的作用范围:在同一个会话中有效,会话不关闭就一直有效。
session.setAttribute(key(键),value(值)),可以将数据存在当前session中
@RequestMapping(value ="mo2")
public String mo2(HttpSession session){
Student student=new Student("李四",new Date(),1,"武汉");
//存放数据到session中
session.setAttribute("s",student);
return "mod.jsp";
}
model等价于request
我们也可以位model加上一个注解将其升级位于session等价
@SessionAttributes(value = "")
value中写需要变为session的,存储在request中的键名
@SessionAttributes(value = "s")//s与下方存放在request中的键名对应
@RequestMapping(value = "m1")
public String m1(HttpServletRequest request){
Student student=new Student("王五",new Date(),1,"南京");
//存放在request中的数据
request.setAttribute("s",student);
return "index.jsp";
}
我们通常 return返回一个字符串如果写的是页面就相当于请求转发
想要将页面进行重定向跳转需要用到 redirect
@RequestMapping(value ="mo2")
public String mo2(HttpSession session){
Student student=new Student("李四",new Date(),1,"武汉");
session.setAttribute("s",student);
//springmvc看到返回的字符串中含有redirect时,spring会认为你要重定向跳转
return "redirect:mod.jsp";
}
当我们使用异步请求时需要我们controller返回一个json数据来给前台
之前我们在servlet中返回数据使用阿里巴巴的fastjson将java对象手动的转为json格式的数据,使用ot.print(json)将数据数据输出给前台。
SpringMVC返回json数据需要以下几步
1.引入springmvc中内置的转换json格式的jar包,jackson
com.fasterxml.jackson.core
jackson-databind
2.13.2.2
2.在controller层加上@ResponseBody注解
@RequestMapping(value = "json1")
@ResponseBody
public List json1(){
List list=new ArrayList();
list.add(new Student("李四",new Date(),1,"武汉"));
list.add(new Student("王五",new Date(),1,"郑州"));
return list;
}
这样我们就完成了json格式的转换
我们只需要在实体类的日期属性中加上@JsonFormat(pattern = "yyyy-MM-dd")注解
pattern:可以定义日期格式
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
private int sex;
private String address;
}
作用:
全局异常处理类的作用: 当controller发生异常,则有全局异常类来处理并执行相应的处理方法。
使用全局异常处理类
创建一个全局异常处理类并为其加上@ControllerAdvice注解
@ControllerAdvice
public class Exhandler {
@ExceptionHandler(value = RuntimeException.class) //当发生RuntimeException就会触发该方法
//@ExceptionHandler(value = Exception.class) //当发生Exception就会触发该方法
@ResponseBody
public Map error(){
Map map=new HashMap();
map.put("code","5000");
map.put("msg","出现错误");
return map;
}
}
一定要保证扫描包时一定可以扫描到异常处理类
作用:过滤掉某些资源
作用范围:只会拦截controller层的资源路径
使用拦截器:
1.创建一个拦截器类,并实现HandlerInterceptor接口,重写preHandle方法
//1.实现implements HandlerInterceptor
public class Myinterceptors implements HandlerInterceptor {
//2.重写preHandle方法
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.lang.Object handler) throws java.lang.Exception {
System.out.println("经过了过滤器");
//3.true表示通过,false表示不通过
return true;
};
}
2.将创建的拦截器类注册到spring.xml配置文件中
(1)再xml文件中配置拦截器的路径
(2)创建过滤器
//实例化接口
public class LoginInterceptor implements HandlerInterceptor {
//重写pre方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//编码格式
response.setContentType("application/json;charset=utf-8");
//判断session钟是否有值
HttpSession session = request.getSession();
//获取session中的值
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;
}
}
(3)改前端页面
//查询所有方法,页面加载就会调用的方法
initTable(){
var that=this;
axios.get("student/findAll").then(function (result){
//判断状态码
if(result.data.code===2000) {
that.tableData = result.data.data;
}else if(result.data.code===5001){
//如果没登录就进入主界面就会弹出错误信息
that.$message.error(result.data.msg);
//跳转到登录界面
location.href="login.jsp"
}
else {
that.$message.error(result.data.msg);
}
})
},