SpringMvc(二)把controller数据返回到网页回显、返回json数据、全局异常处理类、拦截器。

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;

    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naaaaa.a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值