最近在学校做一个网络项目,要实现消息群发和事件提醒。可选择的工具很多,可以使用c++写socket,也可以用php做网站,想了想,最后还是采用java做后台,构建一个restful风格的后台项目,适用于移动端、pc端和web端。使用maven管理项目依赖关系,控制器选用jersey,web服务器用jetty,用spring管理对象关系,采用mysql数据库,mybatis持久层框架以及druid连接池。
首先去jersey的官网查看文档,得知使用maven创建一个web项目十分简单,jersey提供了一个非常小但是结构清晰完整的例程。在希望创建项目的目录执行以下命令即可(前提是已装好maven):
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=
false
\
-DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example \
-DarchetypeVersion=2.23.2
|
执行完毕后会在当前目录下生成一个simple-service文件夹,即jersey官方提供的样本,这是一个标准的java项目,没有webapp等web项目需要的文件,后面笔者自己新建了webapp、web.xml等文件。
接着引入jetty作为发布项目的服务器,到jetty官网一查,需要在pom.xml文件中添加以下配置(pom.xml文件的意义请读者自行查阅):
<dependency> <groupId>javax.servlet</groupId> | |
<artifactId>javax.servlet-api</artifactId> | |
<version>3.1.0</version> | |
</dependency> | |
<!-- dependencies for native jetty websocket --> | |
<dependency> | |
<groupId>org.eclipse.jetty.websocket</groupId> | |
<artifactId>websocket-server</artifactId> | |
<version>${jetty.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.eclipse.jetty.websocket</groupId> | |
<artifactId>websocket-servlet</artifactId> | |
<version>${jetty.version}</version> | |
</dependency> | |
<!-- dependencies for javax.websocket (JSR-356) websocket --> | |
<dependency> | |
<groupId>org.eclipse.jetty.websocket</groupId> | |
<artifactId>javax-websocket-server-impl</artifactId> | |
<version>${jetty.version}</version> | |
</dependency> | |
</dependencies> | |
<build> | |
<plugins> | |
<plugin> | |
<groupId>org.apache.maven.plugins</groupId> | |
<artifactId>maven-compiler-plugin</artifactId> | |
<version>2.3.2</version> | |
<configuration> | |
<source>1.8</source> | |
<target>1.8</target> | |
</configuration> | |
</plugin> | |
</plugins> | |
</build> |
此举是加入jetty核心包及其所需要的包。
然后便是定义有关jersey的配置,既然我们希望发布成为一个web项目,那么便需要新建web.xml文件定义wen项目的各种属性,以下是笔者的web.xml文件(在webapp/WEB-INF文件夹下):
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>cn.edu.stu.dongdong</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/dongdong/*</url-pattern>
</servlet-mapping>
</web-app>
此文件定义了spring配置文件路径,以及定义了捕获请求的Jersey Web Application服务,并且说明了包名以cn.edu.stu.dongdong开头的包下面的类会被jersey解析,如果有javax所定义的注解(如path、get、post等),jersey便可正确的解析并加载它。
马上就到spring了。spring在这里有两个功能,一个是管理对象关系,一个是托管数据源。首先添加spring依赖:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
此项配置spring和jersey以及数据库的依赖,如果要使用spring的大部分注解,还需要添加spring的其他依赖,读者可去spring官网查找并酌情自行添加
接下来是持久层的mybatis框架,持久层的框架很多,比较流行的算是hibernate,但是笔者这里没有用是因为另外一个项目正在使用hibernate,这里笔者想尝试一下另一个,也有一部分原因是mybatis框架比较简单,其代码生成器生成的代码更加符合面向对象而不是数据库的编程习惯。在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.3.2</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-maven-plugin -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
此部分说明了mybatis的核心包、generator代码生成器的核心包和插件以及和spring的依赖包,并且还说明了mysql数据库以及阿里巴巴的连接池druid。接下来是重头戏,也就是有关spring扫描构件以及托管数据源的配置了,根据前文web.xml文件的说明,配置文件名称应该命名为applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis="http://www.mybatis.org/schema/mybatis"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://10.21.34.14:3306/dongdong" />
<property name="username" value="root" />
<property name="password" value="publiczyl" />
</bean>
<!-- 扫描dao层,spring会自动扫描以base-package包名字为前缀的包下面的类的注解,将它们纳入spring容器管理 -->
<context:component-scan base-package="cn.edu.stu.dongdong" />
<!-- 扫描mapper配置文件的地址,mapper配置文件是mybatis的核心,它定义了java类和数据库表之间的映射(即OR映射)-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.edu.stu.dongdong.mapper" />
</bean>
<!-- 使用连接池创建数据库连接配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--事务配置-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
此文件的配置比较清晰简单,注释也都有说明,如还是不明白,请读者自行查阅每一部分的含义。
至此,web项目的所有配置和构件都已经齐全,以后再想加什么相当于高屋建瓴,笔者也要投入紧张的开发中了(怎么使用jersey框架以及设计web项目的架构笔者也是皮毛都不懂,请读者自行寻找大神)
注:附上简单的java类,以及运行效果:
package cn.edu.stu.dongdong.test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* Root resource (exposed at "myresource" path)
*/
@Path("test")
public class MyResource {
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@Path("test")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
}
启动命令:mvn jetty:run
访问地址:localhost:8080/dongdogn/test/test
结果:
Got it!