SpringMVC+Json

1.SpringMVC

1.基本的javaWeb项目过程

1.导入依赖jar包

<!--mysql-->
<!--    依赖:junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
<dependency>
    <!--junit-->
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!--数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!--数据连接池-->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>
<!--servlet、jsp、jstl-->
<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>

<!--Mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
<!--Mybatis-spring-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.3</version>
</dependency>

<!--spring-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

2.tomcat配置

image-20210321133950496 image-20210321135038590

3.配置web.xml中servlet路径

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.zhoupiyao.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

4.添加控制层

此处使用servlet,继承HttpServlet,并重写doGet()、doPost()方法

package com.zhoupiyao.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

2.SpringMVC底层

1.导入依赖

<!--mysql-->
<!--    依赖:junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring-->
<dependency>
    <!--junit-->
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!--数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>
<!--数据连接池-->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>
<!--servlet、jsp、jstl-->
<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>

<!--Mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.3</version>
</dependency>
<!--Mybatis-spring-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.3</version>
</dependency>

<!--spring-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.4</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

2.注册中央调度器

web.xml配置

<!-- 注册中央调度器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <!-- 如果springmvc的配置文件放在WEB-INF目录下,但不想名字的形式为*-servlet.xml,
        则可以通过namespace属性值进行指定 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- tomcat启动时自动创建servlet,数字越小优先级越高(>0) -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3.applicationContex.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-3.2.xsd
        http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/mvc
         https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--连接数据库配置-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--连接数据源-->
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>
    <!--构建SqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:Mybatis-config.xml"/>
    </bean>
    <!--配置dao接口扫描mapper-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.zhoupiyao.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!--扫包-->
    <context:component-scan base-package="com.zhoupiyao.service"/>
    <!--事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--扫包-->
    <context:component-scan base-package="com.zhoupiyao.controller"/>
    <!--注解支持,可配置json输出编码格式-->
    <mvc:annotation-driven/>
    <!--静态资源过滤-->
    <mvc:default-servlet-handler/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

4.绑定Mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
    <!--类型别名-->
    <typeAliases>
        <package name="com.zhoupiyao.pojo"/>
    </typeAliases>

    <mappers>
        <!--两种绑定mapper方式-->
<!--        <mapper class="com.zhoupiyao.dao.UserMapper" />-->
        <mapper resource="com/zhoupiyao/dao/UserMapper.xml"/>
    </mappers>

</configuration>

5.数据库配置

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/database?useSSL=false&charaterEncoding=UTF-8&serverTimezone=Asia/Shanghai
#若使用c3p0数据源,使用username命名会出错
user=root
password=123

6.控制器

package com.zhoupiyao.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","HelloSpringMvc");
        mv.setViewName("hello");
        return mv;
    }
}

3.使用注解开发

1.使用Controller注解,不再需要实现Controller接口

@Controller: 标注这是一个Controller

@RequestMapping("/"): 路径映射不管是通过什么方式请求"/"都会进入该标注的方法或类

@PostMapping/@GetMapping:和@RequestMapping类似,只是限定了请求方法

@RestController 等价于 @Controller+@ResponseBody

package com.zhoupiyao.controller;

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.RestController;

@Controller
//@RestController
public class UserController {
    @RequestMapping("/s1")
    public String s1(Model model){
        model.addAttribute("msg","helloSpringMVC");
        return "s1";
    }
    @ResponseBody
    @RequestMapping("/s2")
    public String s2(){
        return "s2";
    }
}

2.Json

1.json的基本使用

1.导入依赖

<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

2.web.xml配置同上

3.修改spring-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-3.2.xsd
        http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/mvc
         https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--自动扫描包,让被扫描包下的注解生效,并交由IOC容器统一管理-->
    <context:component-scan base-package="com.zhoupiyao.controller"/>
    <!--注解支持-->
    <mvc:annotation-driven>
        <!--解决json乱码问题-->
        <mvc:message-converters register-defaults="true">
            <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 注解请求映射
            默认是ISO-88859-1,避免乱码这里设置为UTF-8 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
            </bean>
            <!-- 启动JSON格式的配置,自动将格式转换成JSON格式,不需要其他类 -->
            <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes" value="application/json;charset=UTF-8" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--不处理静态资源-->
    <mvc:default-servlet-handler/>
    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--路径前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--路径后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2.处理json乱码方法

在开启mvc注解支持的标签中加入以下内容

<!--解决json乱码问题-->
<mvc:message-converters register-defaults="true">
    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 注解请求映射
    默认是ISO-88859-1,避免乱码这里设置为UTF-8 -->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
    </bean>
    <!-- 启动JSON格式的配置,自动将格式转换成JSON格式,不需要其他类 -->
    <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json;charset=UTF-8" />
    </bean>
</mvc:message-converters>

3.FastJson常用方法

// 把JSON文本转换为JSONObject或者JSONArray 
public static final Object parse(String text);   
// 把JSON文本转换成JSONObject 
 public static final JSONObject parseObject(String text);   
// 把JSON文本转换为JavaBean 
 public static final T parseObject(String text, Class clazz);   
// 把JSON文本转换成JSONArray 
 public static final JSONArray parseArray(String text);   
//把JSON文本转换成JavaBean集合 
 public static final List parseArray(String text, Class clazz); 

// 将JavaBean序列化为JSON文本
 public static final String toJSONString(Object object);    
// 将JavaBean序列化为带格式的JSON文本
 public static final String toJSONString(Object object, boolean prettyFormat);    
//将JavaBean转换为JSONObject或者JSONArray。
 public static final Object toJSON(Object javaObject);   

4.jackson使用方法

1.Java对象 ⇒ JSON

使用mapper.writeValueAsString(user)方法

首先创建转换对象ObjectMapper

ObjectMapper mapper = new ObjectMapper();

该对象主要有两个转换方法
第一种方式:将对象转为json字符串:

User user = new User(1,"周飘","123");
String json = mapper.writeValueAsString(user);

输出结果:

第二种方式:

mapper.writeValue(参数1,p1);

关于参数1
File:将obj对象转换为json字符串,并保存到指定的文件中
Write:将obj对象转换为json字符串,并将json填充到字符输出流中
OutputStream:将obj对象转换为json字符串,并将json填充到字节输出流中

比如:
将JSON字符串数据写入到test.txt文件中:

mapper.writeValue(new File("/Users//Desktop/test.txt"), user);
1.2 注解使用

@JsonIgnore:排除属性

@JsonIgnore
private Date birthday;

转换最终的JSON字符串中,不会有birthday键值对。

@JsonFormat:属性值格式化

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
1.3 复杂Java对象转换

List集合转换为JSON字符串:

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(list);
System.out.println(json);

Map集合转换成JSON字串

Map<String, User> map =new HashMap<String, User>();
map.put("u1",new User(1,"周飘","123"));
map.put("u2",new User(1,"刘悦仪","123"));
map.put("u3",new User(1,"熊宇昊","123"));
ObjectMapper mapper = new ObjectMapper();

打印结果为:

{"u1":{"id":1,"username":"周飘","password":"123"},"u2":{"id":1,"username":"刘悦仪","password":"123"},"u3":{"id":1,"username":"熊宇昊","password":"123"}}

2.JSON ⇒ Java对象

使用mapper.readValue(json, User.class)方法

String json = "{\"id\":1,\"username\":\"周飘\",\"password\":\"123\"}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user);

User(id=1, username=周飘, password=123)

posted @ 2021-03-23 14:27  一只小周皮妖🐯  阅读(85)  评论(0)    收藏  举报