SpringMVC_controller&filter&json_日期举例

Controller

第一种方式实现Controller接口,使用ModelAndView

//只要实现了Controller 接口的类,说明是一个控制器
public class Controller01 implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();

        mv.addObject("info","controller01");
        mv.setViewName("c1");

        return mv;
    }
}

第二种方式使用@Controller,自定义方法,使用Model

@Controller  //代表这个类会被spring接管   被这个注解,注解的类中所有方法,如果返回值是string且有具页面可以跳转,那么就会被视图解析器解析
public class Controller02 {

    @RequestMapping("/c2")
    public String c2(Model model){
        model.addAttribute("info","Controller02");
        return "c1";
    }
}

@RequestMapping("/hello") 用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@Controller
@RequestMapping("/c3")
public class Controller03 {

    @RequestMapping("/c1")
    public String c3(Model model){
        model.addAttribute("info","Controller03");
        return "c1";
    }
}

filter 处理乱码

第一种方式,自己编写简单的filter

public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.fan.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

第二种方式,springmvc配置 (常用)

<!--    配置springmvc的乱码过滤-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

第三种方式,极端情况下使用

public class GenericEncodingFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //处理response的字符编码
        HttpServletResponse myResponse=(HttpServletResponse) response;
        myResponse.setContentType("text/html;charset=UTF-8");

        // 转型为与协议相关对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 对request包装增强
        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
        chain.doFilter(myrequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;
    //是否编码的标记
    private boolean hasEncode;
    //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
    public MyRequest(HttpServletRequest request) {
        super(request);// super必须写
        this.request = request;
    }

    // 对需要增强方法 进行覆盖
    @Override
    public Map getParameterMap() {
        // 先获得请求方式
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")) {
            // post请求
            try {
                // 处理post乱码
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else if (method.equalsIgnoreCase("get")) {
            // get请求
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                for (String parameterName : parameterMap.keySet()) {
                    String[] values = parameterMap.get(parameterName);
                    if (values != null) {
                        for (int i = 0; i < values.length; i++) {
                            try {
                                // 处理get乱码
                                values[i] = new String(values[i]
                                        .getBytes("ISO-8859-1"), "utf-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }

    //取一个值
    @Override
    public String getParameter(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) {
            return null;
        }
        return values[0]; // 取回参数的第一个值
    }

    //取所有值
    @Override
    public String[] getParameterValues(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
}
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.fan.filter.GenericEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

JSON

什么是json?

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。

  • 采用完全独立于编程语言的文本格式来存储和表示数据。

  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔

  • 花括号保存对象

  • 方括号保存数组

JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值:

{"name": "小凡"}
{"age": "18"}

json和javaScript的互相转换

<script type="text/javascript">

        let user = {
            name:"小凡",
            age :4,
            sex :"男"
        }
        // 将js转化为json对象
        let json = JSON.stringify(user);
        console.log(json)

        //将JSON对象转化为js
        let obj =JSON.parse(json);
        console.log(obj)

    </script>

json的Controller层代码实现

jackson

仿Json,向前端传递字符串

    @RequestMapping("/j1")
    @RequestBody  //它就不会走视图解析器,会直接返回一个字符串
    public String j1(){
        User user =new User("小凡",3,"男");
        return user.toString();
    }

使用Json向前端传递字符串

先导入依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.1</version>
        </dependency>

pojo

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}

controller

@RestController  //所有的方法只会返回字符串
public class UserController {

}
    @RequestMapping("/j2")
    @ResponseBody
    public String j2() throws JsonProcessingException {
        User user =new User("小凡",3,"男");
        return new ObjectMapper().writeValueAsString(user);
    }

如果有多个对象,就用List

    @RequestMapping("/j2")
    @ResponseBody
    public String j2() throws JsonProcessingException {
        List<User> list =new ArrayList<>();
        User user1 =new User("小凡1",3,"男");
        User user2 =new User("小凡2",3,"男");
        User user3 =new User("小凡3",3,"男");

        list.add(user1);
        list.add(user2);
        list.add(user3);

        return new ObjectMapper().writeValueAsString(list);
    }

JSON乱码配置

    <mvc:annotation-driven>
<!--        JSON乱码配置问题-->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
              <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                         <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

使用json,向前端传递时间,展示时间

第一种方式

    @RequestMapping("/j3")
    @ResponseBody
    public String j3() throws JsonProcessingException {

        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(date);

        return new ObjectMapper().writeValueAsString(format);
    }

第二种方式

    @RequestMapping("/j3")
    @ResponseBody
    public String j3() throws JsonProcessingException {

        //使用ObjectMapper 来格式化输出
        ObjectMapper mapper = new ObjectMapper();
        //不使用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        mapper.setDateFormat(sdf);
        Date date = new Date();

        return mapper.writeValueAsString(date);
    }

因为有很多代码会重复写,所以可以写一个JsonUtil工具类,方便调用

public class JsonUtil {

    public static String getJson(Object object){
        //直接return,dateFormat直接给一个默认值
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Object object,String dateFormat){

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}
    @RequestMapping("/j3")
    @ResponseBody
    public String j3(){

        Date date = new Date();
        return JsonUtil.getJson(date,"yyyy-MM-dd HH:mm:ss");
    }
    @RequestMapping("/j3")
    @ResponseBody
    public String j3(){

        Date date = new Date();
        return JsonUtil.getJson(date);
    }
fastJson

先导入依赖

       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

controller层代码

    @RequestMapping("/j4")
    public String j4(){

        User user =new User("小凡",3,"男");
        String s = JSON.toJSONString(user);//java对象转为json字符串

        User u1=JSON.parseObject(s,User.class);//json字符串转为java对象

        return s;
    }
posted @ 2023-01-02 19:58  Fannaa  阅读(42)  评论(0)    收藏  举报