二、springMVC第二节

一、controller层回显数据到网页

        我们可以想一想,JDBC中servlet层是如何把数据保存并将数据响应给前端页面的。这里的controller层回显数据到网页的原理与其不经相同。

        requset:作用范围: 同一个请求内有效。requset.setAttribute(key,value)保存数据。

        session:作用范围: 同一个会话有效,只要会话不关闭会一直有效。setAttribute(key,value)

        el表达式:获取保存的数据 ${scope.key}

springmvc保存数据到网页:

  1. 我们同样可以用requset或者session来存储数据。这需要引入javax.servlet-api的jar
  2. 推荐使用springmvc内置的存储数据的类-----Model类

Model存储数据的方法为:model(Model类型的变量名).addAttribute("key",value);model存储数据的范围和requset的范围相同。在同一model中可以获取数据(requset是在同一个请求下可以获取数据)。

        Model也可以通过追加注解———@SessionAttributes(value = {"key1","key2",.....}) 来设置哪些model的key加入到session范围。这些key的数据会同时存储到类似request和session两个范围内。

package com.lrs.controller;

import com.lrs.entity.User;
import com.sun.deploy.net.HttpRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @作者:刘壬杉
 * @创建时间 2022/6/8
 **/
@Controller
@SessionAttributes(value = {"user2"})
public class UserController {
    @RequestMapping(value = "list")
    public String list(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("user2",new User("刘壬杉",null,0,"123"));//存储到session层
        request.setAttribute("user",new User("刘壬杉",null,0,"123"));//存储到request层
        return "redirect:main.jsp";
    }
    @RequestMapping(value = "list2")
    public String list2(Model model){
        model.addAttribute("user",new User("刘壬杉",null,0,"123"));//存储在类似request和session层
        model.addAttribute("user2",new User("刘壬杉",null,0,"123"));//存储在类似request层
        return "main.jsp";
    }
}

二、使用重定向跳转

        我们之前在controller层写的方法返回值类型为String时,做的是跳转的功能,实际上他的跳转方式是请求转发。那么要想使用重定向跳转页面,只需要在方法的返回字符串的内容时加上redirect:

三、springMVC返回json数据

        当前端页面发起异步请求,ajax请求时,需要我们后端响应一个json格式的数据。在JDBC中,要让servlet层返回json数据,需要我们导入一个jar----fastjson.jar来帮我们把CommenResult公共结果类转换成JSON。在springmvc中,内置了一个转换json格式的jar---jackson-databind.jar

        实现步骤:

(1)在pom.xml中引入jackson-databind的依赖jar包

    <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,"张三","2300316070@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数据显示的为毫秒,正常情况应该显示时间格式。解决办法:在实体类中的事件类型的属性上加入注解@JsonForMat(pattern = "yyyy-MM-dd")。

     

四、springMVC的全局异常处理类

        全局异常处理类的作用: 当controller发生异常,则有全局异常类来处理并执行相应的处理方法。 异常处理类需要写在handler包下。

        使用方法:

(1)创建一个异常类: @ControllerAdvice注解

@ControllerAdvice //表示该为类controller的异常处理类
public class MyExceptinHandle {


     @ExceptionHandler(value = RuntimeException.class) //当发生RuntimeException就会触发该方法
     public String error(){
         return "error.jsp";
     }

    @ExceptionHandler(value = Exception.class) //当发生Exception就会触发该方法
    public String error2(){
        return "error2.jsp";
    }
}

(2) 保证springmvc能够扫描到该类。

五.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>
            <!--/**: 表示n层路径   /*:表示一层路径 -->
            <mvc:mapping path="/**"/>
            <!--exclude-mapping:设置不经过该拦截的路径-->
            <mvc:exclude-mapping path="/list2"/>
            <mvc:exclude-mapping path="/list3"/>
            <!--bean表示你自定义的拦截器类路径-->
            <bean class="com.lrs.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值