余囊平平,业亦未精
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
//声明控制器类
@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(既可以作为接口调试工具,又可以作为抓包工具,神器,强推)
这里的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 点击我加入群聊【天星】