废话不多说,先上图,如果是你想要的或者能有所学习就可以接着往下看了。
前端使用的是插件datatable,外加了一些bootstroop的样式。完成的功能为对数据库的增删改查,页面的模糊查询和分页。源码呈上
在idea中new project–>maven–>右侧选中maven-archetype-webapp,然后一路next,新建的好的项目目录如下
成型的项目目录如下
因此需要在main文件夹下新家java,test,testResources三个文件夹,后两个用于测试,并不必需。新建后在file->Project Structure->Modiles页面将新建的文件夹赋予相应的属性,如将java文件夹mark as Sources,这样才能被spring识别。至此,总体结构上便完整了。
1、pom.xml依赖设置
简单而言就是添加项目所需要的jar包,但是maven大大简化了这个过程,只需要将依赖包名按标准加入,剩下的maven自动搞定,推荐一个查询依赖包的网站,http://mvnrepository.com/,只要记得包名就能找到。在该项目下添加的依赖如下,直接copy放入
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-ormartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>4.1.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-jpaartifactId>
<version>1.7.0.RELEASEversion>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.8version>
dependency>
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-entitymanagerartifactId>
<version>4.3.7.Finalversion>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.8.3version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.12version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.7version>
dependency>
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.21version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>6.11version>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.8.2version>
dependency>
<dependency>
<groupId>javax.persistencegroupId>
<artifactId>persistence-apiartifactId>
<version>1.0.2version>
dependency>
<dependency>
<groupId>com.mchangegroupId>
<artifactId>c3p0artifactId>
<version>0.9.5-pre9version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.38version>
dependency>
dependencies>
2、配置文件.xml设置
在文件夹下新建一个application.xml(名称无要求),添加代码如下,注解在代码中
<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:mvc="http://www.springframework.org/schema/mvc"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd ">
<context:component-scan base-package="com.zhang.Demo" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///demo"/>
<property name="user" value="root"/>
<property name="password" value="wangzhang"/>
<property name="maxPoolSize" value="1000"/>
<property name="minPoolSize" value="800"/>
<property name="initialPoolSize" value="500"/>
bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<property name="packagesToScan" value="com.zhang.Demo.entity" />
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategyprop>
<prop key="hibernate.show_sql">trueprop>
<prop key="hibernate.hbm2ddl.auto">updateprop>
props>
property>
bean>
<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
bean>
<jpa:repositories base-package="com.zhang.Demo.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager">
jpa:repositories>
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"/>
<property name="suffix" value=".jsp"/>
bean>
beans>
3、web.xml配置
在web.xml中加入过滤器与服务器映射
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>forceEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<servlet>
<servlet-name>Demoservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:application.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>Demoservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
至此,项目已经完成一小半了,所有的要用到的配置文件都已经配置好了,剩下的只剩下代码的编写了。
1、如目录结构,在java下新建一个package,在该package下新建4个package以对应springMVC结构,分别为controller控制层,entity实体层,repository持久层(控制数据库),service服务层。
<1>entity层
该层主要定义实体的字段,@Id定义主键,@GeneratedValue设置自增属性,不必须,但一般有,@Table属性为Jpa的自动建表,设置后会在数据库中自动建立一个名为user的表(数据库还是要自己建的),字段上也可以加各种属性,诸如非空,长度等。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
private String job;
private String phone;
//以下加字段的set 与get方法,alt+insert键弹出快捷窗
}
<2>controller层
加@Controller以注明其为控制层,@RequestMapping注解表示其访问路径。该层主要负责控制,将前端来的访问请求转发到对应的处理service层。第一步,注入service层
private MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
这样就可以直接调用seivice层接口,将处理过程交给service层,大幅缩减controller层代码,逻辑更加简明。自动注入之后编写的增删改查代码如下
@RequestMapping(value="/addOne",method= RequestMethod.GET)
@ResponseBody
public User inSave(@ModelAttribute User user)
{
myService.save(user);
return user;
}
@RequestMapping(value="/findOne",method= RequestMethod.GET)
@ResponseBody
public JSONObject findOne(int id)
{
User user = myService.findOne(id);
JSONObject json = new JSONObject();
json.put("data",user);
return json;
}
@RequestMapping(value="/deleteById",method= RequestMethod.GET)
@ResponseBody
public void deleteById(int id)
{
myService.delete(id);
return ;
}
@RequestMapping(value="/modifyOne",method= RequestMethod.GET)
@ResponseBody
//WebRequest request, ModelMap model,@RequestBody User user
public JSONObject modifyOne(@ModelAttribute User user){
User user1=myService.saveAndFlush(user);
JSONObject json = new JSONObject();
json.put("data",user1);
return json;
}
看起来是不是很简洁,因为它把所有的业务处理都交给service层了,由于Jpa的相当给力,你会发现service层也相当简洁,如果你没有自定义的一些方法。如果不结合datatable插件,那么查询所有的信息的代码也是很简洁的
@RequestMapping(value="/findAll",method= RequestMethod.GET)
@ResponseBody
public JSONObject findAll()
{
List userList = myService.findAll();
JSONObject json = new JSONObject();
json.put("data",userList);
return json;
}
补充一点,如果不加@ResponseBody注解,那么上图返回的内容为“json.jsp”或者其他网页格式,而不是json格式的字段。
<3>service层
在该层下,一般建立一个service接口与一个serviceImpl实现类,以符合分层思想与层之间以接口链接。
public interface MyService {
User save(User user);
List findAll();
User findById(int id);
List findByName(String name);
User findOne(int id);
void delete(int id);
User saveAndFlush(User user);
}
接口的实现类
@Service
@Transactional //事务标记
public class MyServiceImpl implements MyService{
private MyRepository myRepository;
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
public User save(User user)
{
myRepository.save(user);
return user;
}
public List findAll() {
List all = myRepository.findAll();
return all;
}
public User findById(int id) {
User user = myRepository.findById(id);
return user;
}
public List findByName(String name) {
List names = myRepository.findByName(name);
return names;
}
public User findOne(int id) {
User user=myRepository.findOne(id);
return user;
}
public void delete(int id) {
myRepository.delete(id);
}
public User saveAndFlush(User user) {
User user1=myRepository.saveAndFlush(user);
return user1;
}
<4>reposiory层
也被称为Dao层,主要负责对数据库的操纵,当继承了JpaRepository后,便含有findAll,save,delete等各种自带方法,如果没有也可以使用findByxxx复写方法,程序会自动进行识别查找相应的列,当然也可以加@Query注解完全自写数据库语句。
import com.zhang.Demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MyRepository extends JpaRepository<User,Integer>{
User findById(int id);
List findByName(String name);
}
至此,后台的业务逻辑处理就基本完成了,源码中还有其他的一些代码,那个是处理前台传输过来的dataTable封装好的json格式数据的,想看完整的功能还是建议参照源码一起看。注:每层的类都需要注明属性,诸如实体层@Entity。
<1>前端datatable的固定定义代码