1.如何把controller数据返回到网页并回显。
request: 作用范围: 同一个请求内有效。setAttribute(key,value)
session:作用范围: 同一个会话有效,只要会话不关闭会一直有效。setAttribute(key,value)
网页如何获取保存的数据: EL表达式。${scope.key}
将controller 数据返回到网页上:
保存到request范围。
//保存到request
@RequestMapping("test01")
public String test01(HttpServletRequest request){
Student s = new Student("王五",new Date(),1,"天津");
request.setAttribute("s",s);
return "index01.jsp";
}
保存到model范围。
@RequestMapping("test02")
public String test02(Model model){ //如果使用request,就会和tomcat容器绑定了。 建议使用Model.
Student s = new Student("赵六",new Date(),0,"上海");
//可以保存到model中,同一个请求 和request是一样。
model.addAttribute("s",s);
return "index01.jsp";
}
保存到session范围。
@RequestMapping("test03")
public String test03(HttpSession session){
Student s = new Student("孙七",new Date(),1,"南京");
//保存到session范围。
session.setAttribute("s1",s);
return "index01.jsp";
}
我们可以指定某些 model 的key在session范围 使用 @SessionAttributes(value = {})
@RequestMapping("test04")
public String test04(Model model){
Student s1 = new Student("赵六1",new Date(),0,"上海1");
Student s2 = new Student("赵六2",new Date(),0,"上海2");
//默认在request范围
model.addAttribute("s1",s1);
model.addAttribute("s2",s2);
return "index01.jsp";
}
2.重定向跳转
在方法的返回字符串的内容加上redirect:
@RequestMapping("test05")
public String test05(){
System.out.println("!!!!!!!!!!!!!!!!!");
return "redirect:index02.jsp"; //当springmvc看到你返回的字符串含有redirect:时 它认为你要进行重定向跳转
}
3.springmvc返回json数据
什么时候需要返回json数据。
异步请求时,ajax请求时。
springmvc如何返回json数据
(1)引入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对象。
@RequestMapping("json03")
@ResponseBody //把java对象转换为json对象
public List<Student> json03(){ //这里返回的类型为java对象。
List<Student> list = new ArrayList<Student>();
list.add(new Student("张三",new Date(),0,"北京"));
list.add(new Student("李四",new Date(),1,"北京"));
list.add(new Student("王五",new Date(),0,"北京"));
list.add(new Student("赵六",new Date(),1,"北京"));
return list; //返回json
}
(3) 访问该路径
发现: 上面返回的时间类型的json数据显示的为毫秒,正常情况应该显示时间格式。
//转为json格式
@JsonFormat(pattern = "yyyy-MM-dd")
4.springmvc的全局异常处理类
全局异常处理类的作用: 当controller发生异常,则有全局异常类来处理并执行相应的处理方法。
如何使用全局异常处理类
(1)创建一个异常类: @ControllerAdvice注解
@ControllerAdvice //该类为异常处理类。
public class MyHandler {
@ExceptionHandler(value = Exception.class)
public String handlerException(){
return "error.jsp";
}
}
(2)保证springmvc能够扫描到该类。
如果是ajax请求返回的应该是一个json数据。
5.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>
<!--
mapping 哪些路径需要经过拦截器
/** 表示n层路径
/* 表示一层路径
-->
<mvc:mapping path="/**"/>
<!--exclude-mapping 设置不经过该拦截的路径-->
<mvc:exclude-mapping path="/json01"/>
<!--bean 自定义的拦截器类路径-->
<bean class="com.zsy.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
6.实例
实现登录功能:
登录controller 层:
@Controller //标记为控制层
public class LoginController {
@RequestMapping("login")
public CommonResult login(String username, String password, HttpSession session){
if("admin".equals(username) && "123456".equals(password)){
session.setAttribute("user",username);
CommonResult commonResult = new CommonResult(2000,"登录成功",null);
return commonResult;
}else {
return new CommonResult(5000,"登录失败",null);
}
}
}
登录拦截:
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setContentType("application/json;charset=utf-8");
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 om = new ObjectMapper();
String s = om.writeValueAsString(result);
writer.print(s);
writer.flush();
writer.close();
return false;
}
}