151_Java_SpringMVC_SpringMVC_review2

举报
alexsully 发表于 2021/08/29 22:17:59 2021/08/29
【摘要】 配置文件 Jason转换

MVC 配置

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

  <!--1.注册DispatcherServlet-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--启动级别-1-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--/ 匹配所有的请求;(不包括.jsp)-->
  <!--/* 匹配所有的请求;(包括.jsp)-->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <!--配置过滤器-->
  <filter>
    <filter-name>myFilter</filter-name>
    <!--<filter-class>com.kuang.filter.GenericEncodingFilter</filter-class>-->
    <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>
  <!--/*  包括.jsp-->
  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <!--Handler-->
    <!--<bean id="/hello" class="com.alex.controller.HelloController"/>-->

    <!--自动扫描指定包下的注解,将他放到Spring的IOC容器-->
    <context:component-scan base-package="com.kuang.controller"/>

    <!--静态资源过滤处理-->
    <mvc:default-servlet-handler/>
    <!--注解驱动
        在spring中一般采用@RequestMapping注解来完成映射关系
        要想使@RequestMapping注解生效
        必须向上下文中注册DefaultAnnotationHandlerMapping
        和一个AnnotationMethodHandlerAdapter实例
        这两个实例分别在类级别和方法级别处理。
        而annotation-driven配置帮助我们自动完成上述两个实例的注入。
    -->
    <mvc:annotation-driven/>

    <!--2.处理器映射器:通过url找到对应的DispatcherServlet改调用的适配器controller:/hello->helloController-->
    <!--<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->

    <!--3.处理器适配器:helloController去适配Controller,找helloController-->
    <!--<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>-->

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>



</beans>

Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以 及 PATCH

所有的地址栏请求默认都会是 HTTP GET 类型的。 
@GetMapping   @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。 
@PostMapping 
@PutMapping 
@DeleteMapping 
@PatchMapping

处理JSON springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">


    <context:component-scan base-package="com.alex.controller"/>
    <mvc:default-servlet-handler/>
    <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>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

@RestController 

类上直接使用 @RestController ,里面所有的方法都只会返回 json 字符串了,不用再每一 个都添加@ResponseBody

Jackson 方式

public class JsonUtils {

    public static String getJson(Object object){
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Object object,String dateFormat){
        ObjectMapper mapper = new ObjectMapper();
        //1.如何让他不返回时间戳!所以我们要关闭它的时间戳功能
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //2.时间格式化问题!自定日期格式对象;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        //3.让mapper指定时间日期格式为simpleDateFormat;
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

}
@Controller
public class UserController {

    @RequestMapping("/json1")
    //思考问题,我们正常返回他会走视图解析器,而json需要返回的是一个字符串;
    //市面上有很多的第三方jar包可以实现这个功能,jackson.只需要一个简单的注解就可以实现了;
    //@ResponseBody , 将服务器端返回的对象转换为json对象响应回去;
    @ResponseBody
    public String json1() throws JsonProcessingException {
        //需要一个jackson的对象映射器,就是一个类,使用它可以直接将对象转换为json字符串;
        ObjectMapper mapper = new ObjectMapper();

        //创建一个对象
        User user = new User("alex1号",1,"男");
        System.out.println(user);

        //将Java对象转换为json字符串;
        String str = mapper.writeValueAsString(user);
        System.out.println(str);

        return str; //由于使用了@ResponseBody注解,这里会将str以json格式的字符串返回,十分方便;
    }

    //发现一个问题,乱码了,怎么解决?给@RequestMapping加一个属性
    //发现出现了乱码问题,我们需要设置一下他的编码格式为utf-8,以及它返回的类型;
    // 通过@RequestMaping的produces属性来实现,修改下代码
    //produces:指定响应体返回类型和编码
    @RequestMapping(value = "/json2",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String json2() throws JsonProcessingException {

        User user = new User("alex1号",1,"男");

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

    @RequestMapping(value = "/json3")
    @ResponseBody
    public String json3() throws JsonProcessingException {

        List<User> list = new ArrayList<>();

        User user1 = new User("alex1号",1,"男");
        User user2 = new User("alex2号",1,"男");
        User user3 = new User("alex3号",1,"男");
        User user4 = new User("alex4号",1,"男");
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

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

    @RequestMapping(value = "/time1")
    @ResponseBody
    public String json4() throws JsonProcessingException {

        Date date = new Date();
        System.out.println(date);
        //发现问题:时间默认返回的json字符串变成了时间戳的格式:1564711481926 Timestamp。

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

    @RequestMapping(value = "/time2")
    @ResponseBody
    public String json5() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        //1.如何让他不返回时间戳!所以我们要关闭它的时间戳功能
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //2.时间格式化问题!自定日期格式对象;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //3.让mapper指定时间日期格式为simpleDateFormat;
        mapper.setDateFormat(sdf);

        //写一个日期对象
        Date date = new Date();
        return mapper.writeValueAsString(date);
    }

    //发现问题,重复代码太多,给它编写一个工具类;
    @RequestMapping(value = "/time3")
    @ResponseBody
    public String json6() throws JsonProcessingException {
        return JsonUtils.getJson(new Date());
    }

}

FastJson 是阿里开发的一款专门用于Java开发的包

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

import com.alibaba.fastjson.JSON; 
import com.alibaba.fastjson.JSONObject; 
import com.kuang.pojo.User;
import java.util.ArrayList; 
import java.util.List;

public class FastJsonDemo {
    public static void main(String[] args) {
        //创建一个对象        
		User user1 = new User("alex1号", 3, "男");        
		User user2 = new User("alex2号", 3, "男");
        User user3 = new User("alex3号", 3, "男");        
		User user4 = new User("alex4号", 3, "男");        
		List<User> list = new ArrayList<User>();        
		list.add(user1);        
		list.add(user2);        
		list.add(user3);        
		list.add(user4);
		
        System.out.println("*******Java对象 转 JSON字符串*******");        
		String str1 = JSON.toJSONString(list);        
		System.out.println("JSON.toJSONString(list)==>"+str1);        
		String str2 = JSON.toJSONString(user1);        
		System.out.println("JSON.toJSONString(user1)==>"+str2);
 
        System.out.println("\n****** JSON字符串 转 Java对象*******");        
		User jp_user1=JSON.parseObject(str2,User.class);        
		System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
		
        System.out.println("\n****** Java对象 转 JSON对象 ******");        
		JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);        
		System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
        
		System.out.println("\n****** JSON对象 转 Java对象 ******");        
		User to_java_user = JSON.toJavaObject(jsonObject1, User.class);        
		System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);  
		} }

pom.xml

<dependencies>

   <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

 </dependencies>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。