SpringMVC框架-----2

本文介绍了Spring MVC中如何将数据返回到网页并回显,包括使用request、model和session。同时讲解了重定向跳转的实现方式。接着讨论了Spring MVC返回JSON数据的步骤,以及处理时间格式问题。此外,还阐述了全局异常处理类的创建和使用,确保优雅地处理异常。最后,详细展示了Spring MVC拦截器的配置和使用,强调了静态资源的放行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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容器中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值