一、新建项目以及Intellij的一些操作。
1.需要配置gradle
导入的时候作为Gradle项目导入即可
新建类配置自定义注释语句:
Settings–>搜索template–>File and Code Template
2.配置Tomcat,如果EditConfiguation里面没有,需要进入初始页面添加;
配置tomcat
这里Type也要注意一下,忘了标了:
把本项目的webapp路径添加进去,这个是重点
然后一步一步走就好了。
这样就不会报404了。。。但是如果添加路径还会报错!!!搞了一天,终于搞出来了,一切以底下为主!!!:
这里显示这个war文件是最重要的!
二、连接数据库
1.右侧database按钮–>datasource–>mysql,输入用户名,密码,对了,还有初次进入的时候左下角提示下载文件才可以测,这个别忘了。
三、配置Gradle
// Gson json
compile 'com.google.code.gson:gson:2.8.0'
// Guava java 类封装
compile 'com.google.guava:guava:21.0'
// Jersey 轻量级Restful接口框架
compile 'org.glassfish.jersey.core:jersey-client:2.26-b03'
compile 'org.glassfish.jersey.core:jersey-server:2.26-b03'
compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.26-b03'
// 也是一个 Json 解析库
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.26-b03'
// 数据库操作框架
// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile 'org.hibernate:hibernate-core:5.2.9.Final'
// https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager
compile 'org.hibernate:hibernate-entitymanager:5.2.9.Final'
// https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0
compile 'org.hibernate:hibernate-c3p0:5.2.9.Final'
// MySQL 驱动库
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
testCompile group: 'junit', name: 'junit', version: '4.12'
添加完发现关键字都是灰色的说明没同步,点击右侧Gradle,展开的窗口中点击同步按钮即可。
四、连接数据库
1.在resource文件夹下新建一个文件:hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库链接驱动 -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!--链接地址用户名密码 -->
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/DB_I_T_PUSH?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!--<property name="connection.url">jdbc:mysql://qiujuer.net:6968/DB_I_T_PUSH?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false</property>-->
<!-- JDBC 链接池大小 -->
<property name="connection.pool_size">5</property>
<!-- SQL 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
<!-- Hibernate session 上下文为线程级别 -->
<property name="current_session_context_class">thread</property>
<!-- 配置C3P0缓存链接池 -->
<property name="cache.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--在连接池中可用数据库连接的最小数目-->
<property name="c3p0.min_size">6</property>
<!--在连接池中所有数据库连接的最大数目-->
<property name="c3p0.max_size">50</property>
<!--设定数据库连接的超时时间-->
<!--<property name="c3p0.time_out">1800</property>-->
<property name="c3p0.timeout">100</property>
<!--可以被缓存的PreparedStatement的最大数目-->
<property name="c3p0.max_statement">50</property>
<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
<property name="c3p0.acquire_increment">1</property>
<!-- 连接对象因该多长时间被自动校验的时间段,以秒为单位-->
<property name="c3p0.idle_test_period">100</property> <!-- seconds -->
<!--最多可以创建Statements对象的个数. . 就是可以执行SQL语句的对象的个数-->
<property name="c3p0.max_statements">0</property>
<!-- SQL语句输出 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 自动更新数据库的级别 -->
<property name="hbm2ddl.auto">update</property>
<!--
create:表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.Group"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.GroupMember"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.User"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.UserFollow"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.Message"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.PushHistory"/>-->
<!--<mapping package="net.qiujuer.web.italker.push.bean.db"-->
<!--class="net.qiujuer.web.italker.push.bean.db.Apply"/>-->
</session-factory>
</hibernate-configuration>
上面是基本配置,每个项目基本都差不多,现在不必深究,但这个还是得学的。
五、配置servlet
在webapp下新建文件夹WEB-INF ,文件夹里放一个web.xml文件,xml里就是放置servlet配置语句:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>iTalker</display-name>
<servlet>
<servlet-name>ITalkerApiServlet</servlet-name>
<!--容器-->
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<!--映射的包名,用于搜索处理类-->
<param-value>net.qiujuer.web.italker.push.service</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>net.qiujuer.web.italker.push.Application</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射-->
<servlet-mapping>
<servlet-name>ITalkerApiServlet</servlet-name>
<!--访问路径-->
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
</web-app>
在java文件夹下新建一个service包,新建一个Application类,所有映射的处理都在service包里
六,完成第一个restful接口请求
@Path("/account")//注册路径访问,所有映射想走到本类,访问路径就为:
// 和web.xml最底下的映射路径结合即为:127.0.0.1/api/account...
public class AccountService {
//实际路径 127.0.0.1/api/account/login
@GET
@Path("/login")
public String get(){
return "You get the login";
}
@POST
@Path("/login")
@Consumes(MediaType.APPLICATION_JSON)//传入json
@Produces(MediaType.APPLICATION_JSON)//输出json
public User post(){
User user=new User();
user.setName("RyeCatcher");
user.setSex("男");
return user;
}
}
//实际路径为:http://localhost:8080/api/account/login,这里的api是servlet中xml配置的。
如果想调试post请求,用谷歌的DHC插件即可。
接下来,就是建数据表了。稍候贴数据库表结构源码,理一下相关逻辑。
1.现在先搞一下用户注册登录和信息完善,在push包下,新建两个包,provider和util包:
先解释一下这四个类,GsonProvider用来替换Application中的Jackson解析器,因为Jackson解析器在处理布尔变量时有些问题。
LocalDateTime是Java8里新增的,该工具类主要是为了解决LocalDateTime与Json字符串相互转换的问题。
Hib是Hibernate的缩写,一个常见的封装类,TextUtil,对string进行md5,base64转换等。
2,hibernate.cfg.xml,查看一下数据库名字,在mysql中创建相同名字的数据库。
接下来打开workbench新建数据库:
表名是跟hibernate.cfg.xml中的表名保持一致,编码格式也选上图的两个。如果没有这种工具,可以在右侧的dataSource中配置数据库。
需要知道的是,我们数据库的入口在hibernate.cfg.xml文件中,我们需要在这个文件中添加映射,将我们之间建的表跟数据库一一对应。
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.User"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.UserFollow"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.Group"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.GroupMember"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.Message"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.PushHistory"/>
<mapping package="net.ryecatcher.web.italker.push.bean.db"
class="net.ryecatcher.web.italker.push.bean.db.Apply"/>
这里package不是必须的,只要类名路径不错就好。
所有service包下的文件都是我们Http的入口!