作者:Sumn 時間: 2018.7.28
餘囊平平,業亦未精
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.im/post/5b2b61… 專案完整目錄結構如下圖:
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 點選我加入群聊【天星】