[Android]后端之路--整合SSM(Spring+SpringMVC+MyBatis)框架(2)

463 阅读12分钟

余囊平平,业亦未精

0.基本介绍

0.1 Spring (由Rod Johnson创建的一个开源框架)

  Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。Spring的核心是控制反转(IoC)面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。(引自百度百科

0.2 SpringMVC

  Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。(引自百度百科

0.3 MyBatis

  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(引自MyBatis中文官网

1.准备工作

  该项目是由基于Maven的web项目进行整合的,如何配置基于Maven的web项目 请参考我的上篇文章juejin.cn/post/684490… 项目完整目录结构如下图:

1.0 安装mysql数据库

  我这里使用的mysql版本是5.6.25,可视化工具用的是SQLYog,我在本地的mysql账号密码都是root(若放在服务器,千万别用此初始密码)。Mysql安装教程参考

  分享一些后台常用的软件安装包 百度云链接 密码:qlnq,里面有mysql安装包以及mysql可视化工具,当然你也可以自己去百度下。

1.1 新建一个数据库

  我使用的是SQLYog可视化工具,直接右键就可以创建一个新的数据库,并设置字符集为UTF-8

  创建一个User表,这里我们用到的字符集是utf8mb4而不是utf8,为的是兼容性,具体区别请参考

1.1 IDEA插件安装

lombok插件:安装教程及介绍

另外lombok.jar能否适用于android参考Jake Wharton的这篇twitter twitter.com/JakeWharton…(需要翻墙)

mybatis插件:安装教程及介绍

2.开始整合

2.0 使用maven引入所需的jar包

打开项目根目录的pom.xml文件

pom.xml


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.seeyou.sumn</groupId>
  <artifactId>SSMDemo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>SSMDemo Maven Webapp</name>
  <url>http://www.example.com</url>

  <properties>
    <!-- spring版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <!-- mybatis版本号 -->
    <mybatis.version>3.2.6</mybatis.version>
    <!-- log4j日志文件管理包版本 -->
    <slf4j.version>1.7.7</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- spring核心包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- mybatis核心包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!-- mybatis/spring包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.2</version>
    </dependency>
    <!-- 导入java ee jar 包 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>
    <!-- 导入Mysql数据库链接jar包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.30</version>
    </dependency>
    <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.2.2</version>
    </dependency>
    <!-- JSTL标签类 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- 日志文件管理包 -->
    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>


    <!-- 格式化对象,方便输出日志 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.1.41</version>
    </dependency>


    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- log end -->
    <!--用户简化实体类 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.6</version>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.7.0</version>
    </dependency>

  </dependencies>

</project>


  每次pom.xml加入新的jar或者更新jar版本的时候,一定要记得点击import Changes那样jar才会在你的项目中生效。

2.1 配置spring-mvc.xml

  在 resource文件夹中新建一个spring-mvc.xml

  作用:主要用于配置Controller的组件扫描器和视图解析器

spring-mvc.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:p="http://www.springframework.org/schema/p"
       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-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 自动扫描 @Controller -->
    <context:component-scan base-package="com.seeyou.ssmdemo">
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation"
                                expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan>

    <!--避免IE执行AJAX时,返回JSON出现下载文件(这里是在适配IE浏览器) -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
            </list>
        </property>
    </bean>

    <!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
      <!--@ResponseBody返回的字符串编码格式改为UTF-8-->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
    </bean>

</beans>

2.2 配置jdbc.properties以及log4j.properties

  在 resource文件夹中新建一个jdbc.properties,这个文件是用于存储与mysql数据库连接的一些信息

jdbc.properties

#链接驱动
driverClasss=com.mysql.jdbc.Driver
#mysql地址
jdbcUrl=jdbc:mysql://localhost:3306/ssmdemo
#账号
username=root
#密码
password=root

#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000

  同样的在resource文件夹中新建一个log4j.properties,用户存储log配置的信息

log4j.properties

log4j.rootLogger=INFO,Console,File

#控制台日志־
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n
#mybatis显示SQL语句日志配置
#这里填写你的mapper所在的包
log4j.logger.com.seeyou.sssmdemo.mapper=DEBUG  
#普通文件日志־
log4j.appender.File=org.apache.log4j.RollingFileAppender
log4j.appender.File.File=logs/SeeYou.log
log4j.appender.File.MaxFileSize=10MB
#输出日志,如果换成DEBUG表示输出DEBUG以上级别日志־
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-dd HH\:mm\:ss}][%C] - %m%n

2.3配置spring-mybatis.xml文件

  在 resource文件夹中新建一个spring-mybatis.xml,并同时新建一个mapper文件夹,这一步主要是将spring和mybatis进行整合,主要的就是自动扫描,自动注入和配置数据库。

spring-mybatis.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:p="http://www.springframework.org/schema/p"
       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.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    <!-- 自动扫描 项目的包名-->
    <context:component-scan base-package="com.seeyou.ssmdemo" />
    <!-- 引入配置文件  这里就会引用jdbc.properties这个配置文件中的信息 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driverClasss}"/>
        <property name="url" value="${jdbcUrl}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 连接池最大数量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 连接池最大空闲 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 连接池最小空闲 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>


    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring会自动查找其下的类  -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--这里填写你mapper包 -->
        <property name="basePackage" value="com.seeyou.ssmdemo.mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

2.4将配置文件注册进web.xml文件中

  文件所在位置:src->main->webapp->WEB-INF->web.xml

  文件作用:web.xml文件是用来初始化配置信息,我将它理解为android中的AndroidManifest.xml,你只有在这里对spring-mybatis.xml以及spring-mvc.xml进行注册了,才能使其生效

web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>
  <!-- 编码过滤器 -->
  <filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- spring监听器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 防止spring内存溢出监听器,比如quartz -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>

  <!-- spring mvc servlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此处也可以配置成 *.do 形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--欢迎页面配置-->
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>

  <!-- session配置 -->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

</web-app>


  完成这一步,你的ssm框架雏形算是出来了,接下来试试写几个接口,并对数据库进行增删改查操作

3.编写接口并对数据库进行CRUD

3.0 创建实体类TUserDo.java

   在model这个包下创建一个与刚刚数据库中创建的表对应的实体类

TUserDo.java

//源自lombok库,通过注解以达到减少代码的Java库,如通过注解的方式减少get,set方法,构造方法等
@Data
public class TUserDo implements Serializable {
    private static final long serialVersionUID = 1L;
    private  int uid;
    private  String uName;
    private  int uAge;
    private  String uSex;
}

3.1 创建Mybatis java映射接口 TUserMapper.java

  该接口主要用于与映射文件进行交互,写上常用的CRUD方法,等下会和TUserMapper.xml中的映射语句一一对应。


//spring的注解,会自动创建类的实例
@Repository
public interface TUserMapper {
    /**
     * insert selective.
     */
    int insertSelective(TUserDo record);

    /**
     * delete by primary key.
     */
    int deleteByPrimaryKey(TUserDo record);
    /**
     * select by primary key.
     */
    TUserDo selectByPrimaryKey(Long id);

    /**
     * update by primary key selective.
     */
    int updateByPrimaryKeySelective(TUserDo record);

}


3.2 创建Mybatis 映射配置文件 TUserMapper.xml

  MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。(引自mybatis官网

TUserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空间需要填所对应的映射接口-->
<mapper namespace="com.seeyou.ssmdemo.mapper.TUserMapper">
    <!--这里是映射实体类的结果集 -->
    <resultMap id="BaseResultMap" type="com.seeyou.ssmdemo.model.TUserDo">
        <!--  id:对应的是mysql中的主键,column:对应的是mysql中的列名,jdbcType:对应的是mysql中的数据类型 property:对应的是实体类中的属性名-->
        <id column="u_id" jdbcType="INTEGER" property="uid"/>
        <!--mysql中的非主键列名使用result标签即可-->
        <result column="u_name" jdbcType="VARCHAR" property="uName"/>
        <result column="u_age" jdbcType="INTEGER" property="uAge"/>
        <result column="u_sex" jdbcType="VARCHAR" property="uSex"/>
    </resultMap>

    <!-- id:对应的是java映射接口中的方法名  parameterType:对应的是方法中的参数类型
    resultMap:对应的是返回值,该方法返回的是实体类,而实体类在该映射文件中的 结果集的id为BaseResultMap-->
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select * from user where u_id = #{uid,jdbcType=INTEGER}
    </select>

    <!-- 在执行insert delete update标签的时候 无需定义resultMap 默认会返回int类型的resultMap, 返回值大于0则表示操作成功-->
    <insert id="insertSelective" parameterType="com.seeyou.ssmdemo.model.TUserDo">
        insert into user
        <!--在映射文件中执行sal语句时,可以像写java一样写一些判断语句,这也是mybatis的优势之一-->
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="uName != null">
                u_name,
            </if>
            <if test="uAge != null">
                u_age,
            </if>
            <if test="uSex != null">
                u_sex,
            </if>

        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">

            <if test="uName != null">
                #{uName,jdbcType=VARCHAR},
            </if>
            <if test="uAge != null">
                #{uAge,jdbcType=INTEGER},
            </if>
            <if test="uSex != null">
                #{uSex,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from user where u_id = #{uid,jdbcType=BIGINT}
    </delete>

    <update id="updateByPrimaryKeySelective" parameterType="com.seeyou.ssmdemo.model.TUserDo">
        update user
        <set>
            <if test="uName != null">
                u_name= #{uName,jdbcType=VARCHAR},
            </if>
            <if test="uAge != null">
                u_age=#{uAge,jdbcType=INTEGER},
            </if>
            <if test="uSex != null">
                u_sex=#{uSex,jdbcType=VARCHAR},
            </if>
        </set>
        where u_id = #{uid,jdbcType=BIGINT}
    </update>

</mapper>

3.3 创建映射接口管理类 接口TUserManager.java 实现类 TUserManagerImpl.java

TUserManager.java


public interface TUserManager {
    /**
     * insert selective.
     */
    int insertSelective(TUserDo record);

    /**
     * delete by primary key.
     */
    int deleteByPrimaryKey(TUserDo record);
    /**
     * select by primary key.
     */
    TUserDo selectByPrimaryKey(Long id);

    /**
     * update by primary key selective.
     */
    int updateByPrimaryKeySelective(TUserDo record);
}


TUserManagerImpl.java



//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Component
public class TUserManagerImpl implements TUserManager {
    //从spring中获取自动创建的实例
    @Autowired
    protected TUserMapper tUserMapper;


    public int insertSelective(TUserDo record) {
        return tUserMapper.insertSelective(record);
    }

    public int deleteByPrimaryKey(TUserDo record) {
        return tUserMapper.deleteByPrimaryKey(record);
    }

    public TUserDo selectByPrimaryKey(Long id) {
        return tUserMapper.selectByPrimaryKey(id);
    }

    public int updateByPrimaryKeySelective(TUserDo record) {
        return tUserMapper.updateByPrimaryKeySelective(record);
    }
}

3.4最后一步编写控制器类UserController.java

UserController.java


//声明控制器类
@Controller
/*
 * 相当于 http://你的ip:tomcat定义的端口(默认8080)/user/
 * 例: http://192.168.17.52:8080/user/
 * ip可以通过 win+R调出运行 输入cmd 在输入ipconfig 然后取IPv4地址
 */
@RequestMapping(value = "user")
//lombok注解 自动生成log类
@Log4j
public class UserController {
    @Autowired
    TUserManager tUserManager;

    /*
     * 请求参数uName,uAge,uSex
     */
    // @ResponseBody:controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
    @ResponseBody
    //相当于请求地址为http://192.168.17.52:8080/user/insert  请求方法为POST
    @RequestMapping(value = "insert", method = RequestMethod.POST)
    public String insert(HttpServletRequest request) {
        log.info("执行增加");
        //定义请求数
        String uName = request.getParameter("uName");
        int uAge = Integer.parseInt(request.getParameter("uAge"));
        String uSex = request.getParameter("uSex");
        log.info(uName+":"+uAge+":"+uSex);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUName(uName);
        tUserDo.setUAge(uAge);
        tUserDo.setUSex(uSex);
        int i = tUserManager.insertSelective(tUserDo);
        if (i > 0) {
            return "添加成功";
        } else {
            return "添加失败";
        }
    }

    /*
     *请求参数:uid
     */
    @ResponseBody
    @RequestMapping(value = "delete", method = RequestMethod.POST)
    public String delete(HttpServletRequest request) {
        log.info("执行删除");
        int id = Integer.parseInt(request.getParameter("uid"));
        log.info(id);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUid(id);
        int i = tUserManager.deleteByPrimaryKey(tUserDo);
        if (i > 0) {
            return "删除成功";
        } else {
            return "删除失败";
        }
    }

    /*
     *请求参数:uid
     */
    @ResponseBody
    @RequestMapping(value = "select", method = RequestMethod.POST)
    public String select(HttpServletRequest request) {
        log.info("执行查找");
        int id = Integer.parseInt(request.getParameter("uid"));
        log.info(id);
        TUserDo tUserDo = tUserManager.selectByPrimaryKey(id);
        JSONObject jsonObject = (JSONObject) JSON.toJSON(tUserDo);
        return jsonObject.toJSONString();
    }

    /*
     * 请求参数uName,uAge,uSex,id
     */
    @ResponseBody
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public String update(HttpServletRequest request) {
        log.info("执行修改");
        int id = Integer.parseInt(request.getParameter("uid"));
        String uName = request.getParameter("uName");
        int uAge = Integer.parseInt(request.getParameter("uAge"));
        String uSex = request.getParameter("uSex");
        log.info(id+":"+uName+":"+uAge+":"+uSex);
        TUserDo tUserDo = new TUserDo();
        tUserDo.setUid(id);
        tUserDo.setUName(uName);
        tUserDo.setUAge(uAge);
        tUserDo.setUSex(uSex);
        int i = tUserManager.updateByPrimaryKeySelective(tUserDo);
        if (i > 0) {
            return "修改成功";
        } else {
            return "修改失败";
        }

    }
}

4运行并调试

4.0 运行tomcat 如何运行可以参考我上篇文章

  当你的控制台弹出如下界面,并且浏览器自动打开了http://localhost:8080/ 说明运行成功了

4.1调试接口

   我这里使用的是fiddler(既可以作为接口调试工具,又可以作为抓包工具,神器,强推)

   如执行成功你会在mysql的表中看到你添加的数据,其他接口调试同理

   这里的localhost可以替换为你电脑的本地ip,如果你用android就必须使用ipv4地址,且电脑和手机在同一局域网

   这里在调试工具的url中输入中文你的tomcat会报如下错误

28-Jul-2018 13:41:53.167 信息 [http-nio-8080-exec-7] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:687)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

网上查了下,大概原因是:

在tomcat 8.0.35之后 ,tomcat对url的参数做了比较规范的限制,必须按照RFC 7230 and RFC 3986规范,对于非保留字字符,如果不做转义处理,一律都会报The valid characters are defined in RFC 7230 and RFC 3986 错误。

   解决这个问题的办法有几个:

   把非保留字字符做转义

   就是使用保留字字符

   要么就是换比较底一点的tomcat版本

   将json数据进行urlencode编码就可以了 即把json中的{}编码

实际上,我在使用app请求时并未发现该错误,因为app的情求会对请求参数自动编码。

5 结尾

   如果遇到什么问题,可以进天星的群找我,有问必答。如果有哪些地方写的不好,不合理,也请大家指出并给出意见,谢谢

天星群号:557247785 点击我加入群聊【天星】