bos物流系统_物流平台系统

(29) 2024-09-21 16:01:01

bos物流系统

建包

总工程(统一管理依赖):new/project/Maven Projece/勾选Create a simple project../Group id包结构com.itheima/Artifact id工程名common_parent/打包方式Packaging选pow /finish

在总工程身上点右键/new/project/Maven Projece/勾选Create a simple project../Group id包结构com.itheima/Artifact id工程名bos_management/打包方式Packaging选pow /Parent project里指定上一级父工程/finish

在后台bos_management工程身上点右键/new/project/Maven Module/勾选Create a simple project../Module name模块名bos_management_domain/打包方式Packaging选jar/finish/在src/main/java里建包/ com.itheima.bos.domain.base

在后台bos_management工程身上点右键/new/project/Maven Module/勾选Create a simple project../Module name模块名bos_management_dao/打包方式Packaging选jar/finish/在src/main/java里建包/ com.itheima.bos.dao.base

在后台bos_management工程身上点右键/new/project/Maven Module/勾选Create a simple project../Module name模块名bos_management_service/打包方式Packaging选jar/finish/在src/main/java里建包/ com.itheima.bos.service.base

在后台bos_management工程身上点右键/new/project/Maven Module/勾选Create a simple project../Module name模块名bos_management_web/打包方式Packaging选war/finish/右键tools生成web.xml/在src/main/java里建包/ com.itheima.bos.web.action.base /在src/main/resources里粘贴applicationContext.xml log4j.properties

从dao模块开始建依赖 dao模块身上右键/mawen/add dependency 搜domain.. service搜dao web搜service

总工程里的pom.xml

\pom\下面全替换

<properties> <spring.version>4.2.4.RELEASE</spring.version> <struts2.version>2.3.24</struts2.version> <hibernate.version>5.0.7.Final</hibernate.version> <slf4j.version>1.6.6</slf4j.version> <springdataredis.version>1.4.1.RELEASE</springdataredis.version> <activemq.version>5.2.0</activemq.version> <shiro.version>1.2.2</shiro.version> <springdatajpa.version>1.10.4.RELEASE</springdatajpa.version> <jedis.version>2.6.2</jedis.version> <poi.version>3.11</poi.version> <c3p0.version>0.9.1.2</c3p0.version> <cxf.version>3.0.1</cxf.version> <servlet.version>2.5</servlet.version> <junit.version>4.11</junit.version> </properties> <dependencies> <!-- 权限控制 框架 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>${shiro.version}</version> </dependency> <!-- spring 框架 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</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-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- spring data jpa 数据库持久层 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${springdatajpa.version}</version> </dependency> <!-- 消息队列 MQ --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency> <!-- struts2 框架 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts2.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts2.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>${struts2.version}</version> </dependency> <!-- hibernate 框架 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 数据库连接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency> <!-- 日志框架 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- 工具包 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${springdataredis.version}</version> </dependency> <!-- oracle数据库驱动,需要手动安装 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>10.2.0.2.0</version> </dependency> <!-- Excel解析工具类 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>${poi.version}</version> </dependency> <!-- Servlet、JSP --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 导入webservice依赖 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> <!-- 对象转为json 工具包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.37</version> </dependency> <dependency> <groupId>com.colobu</groupId> <artifactId>fastjson-jaxrs-json-provider</artifactId> <version>0.3.1</version> </dependency> <!-- 引入json-lib的依赖 --> <!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j --> <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${jedis.version}</version> <scope>compile</scope> </dependency> <!-- 缓存 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.6.11</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.apache.xbean</groupId> <artifactId>xbean-spring</artifactId> <version>4.2</version> </dependency> <!-- itext --> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <!-- groovy --> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.2.0</version> </dependency> <!-- jasperreport --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>5.2.0</version> <exclusions> <exclusion> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>

导入Oracle驱动

mvn install:install-file -DgroupId=com.Oracle -DartifactId=ojdbc14
-Dversion=10.2.0.2.0 -Dpackaging=jar
-Dfile=C:\Users\Administrator\Desktop\ojdbc14-10.2.0.2.0.jar ,地址根据实际情况自己修改

粘贴applicationContext.xml和log4j.properties代码到bos_management_web项目/Java Resources/src/main/resources下 修改好数据库连接地址 用户名 和密码 dumain扫描路径等

applicationContext.xml 包xyz oracle

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" 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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <!-- ######################################################### 指定连接池配置 ######################################################### --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUrl" value="jdbc:oracle:thin:@PC5268-:1521:ORCL" /> <property name="user" value="HEIMA28" /> <property name="password" value="root" /> </bean> <!-- spring整合JPA --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- ######################################################### 指定JPA扫描的实体类所在的包 ######################################################### --> <property name="packagesToScan" value="com.xyz.bos.domain" /> <!-- 指定持久层提供者为Hibernate --> <property name="persistenceProvider"> <bean class="org.hibernate.ejb.HibernatePersistence" /> </property> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- 自动建表 --> <property name="generateDdl" value="true" /> <property name="database" value="ORACLE" /> <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="showSql" value="true" /> </bean> </property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- ######################################################### 开启IOC注解. 指定Spring进行扫描的包,如果该包中的类使用了@Component @Controller@Service等注解,会把这些类注册为bean !!!!不要扫描DAO !!!! DAO包下的类要使用Spring Data JPA框架进行扫描 ######################################################### --> <context:component-scan base-package="com.xyz.bos.service,com.xyz.bos.web" /> <!-- 开启事 务注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- ######################################################### 指定Spring Data JPA要进行 扫描的包,该包中的类框架会自动为其创建代理 ######################################################### --> <jpa:repositories base-package="com.xyz.bos.dao" /> </beans>

applicationContext.xml 包xyz mysql

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" 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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <!-- mysql用C3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/heima28" /> <property name="user" value="root" /> <property name="password" value="root" /> </bean> <!-- spring整合JPA --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 指定JPA扫描的实体类所在的包 --> <property name="packagesToScan" value="com.xyz.bos.domain" /> <!-- 指定持久层提供者为Hibernate --> <property name="persistenceProvider"> <bean class="org.hibernate.ejb.HibernatePersistence" /> </property> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- mysql自动建表 --> <property name="generateDdl" value="true" /> <property name="database" value="MYSQL" /> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> <property name="showSql" value="true" /> </bean> </property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- ######################################################### 开启IOC注解. 指定Spring进行扫描的包 ,如果该包中的类使用了@Component @Controller@Service等注解,会把这些类注册为bean !!!!不要扫描DAO !!!! DAO包下的类要使用Spring Data JPA框架进行扫描 ######################################################### --> <context:component-scan base-package="com.xyz.bos.service,com.xyz.bos.web" /> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- ################ ######################################### 指定Spring Data JPA要进行扫描的包,该包中的类框架会自动为其创建代理 ######################################################### --> <jpa:repositories base-package="com.xyz.bos.dao" /> </beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>bos_web</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 指定Spring框架配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置Spring框架的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置Struts的前端控制器 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app>

com.itheima.bos.domain.base下放实体类粘贴前端代码到web目录

上传到github网站

安装小乌龟/选openssh,git default ssh client/向导页面/指定git exe path选git的bin目录/下面留空/填写真实邮箱和密码/完成

git设置一下身份的名字和邮箱:执行bash.exe/打命令git config --global user.name "loveyouluobin" / git config --global user.email“loveyouluobin@.com" /在windows用户目录C:\Users\Administrator\.ssh/id_rsa.pub复制里面的密钥放到github里面去/bash.exe里再打命令ssh-keygen -t rsa -C "loveyouluobin@.com"/ 出现生成成功消息按回车/ssh -T git@github.com/跳出提示 输入命令yes回车/搞定

​ 先到github创建一个仓库(new repository)复制仓库地址/在本地磁盘打开工作空间目录/右键使用小乌龟执行gif clone/粘贴地址点OK /会新建有个bos的目录

​ eclipce里删除项目右键两个项目(非物理删除)/在目录里把两项目移到bos目录/

​ bos目录里.project身上点右键/TortoiseGit/Add to ignore list /.project/ok/打开这个文件完完完整的忽略文件和文件夹列表

.project .settings .classpath target

​ 提交:在目录里点右键/Git Commit->”master”…/全选进行版本控制的文件/commit 提交就上传了

已试验最快速方法

1.设置TortoiseGit中的SSH客户端为Git中的SSH客户端,网络/@邮件 D:\eclipse\Git**TortoiseGi**t\bin\TortoiseGitPlink.exe

2.生成密钥:运行TortoiseGit开始菜单中的Pageant程序,程序启动后将自动停靠在任务栏中,双击该图标,弹出key管理列表。在弹出的key管理列表中,点击add key,将第4步中保存的私钥(.ppk)文件加进来,关闭对话框即可。

3.克隆项目:加载putty密钥 选刚刚生成的密钥就可以了.

4.上传 右键提交完再推送

测试JPA操作数据库

dao工程com.itheima.bos.dao.base包

new接口 StandardRepository.java 继承extends JpaRepository

public interface StandardRepository extends JpaRepository<Standard, Long>{ 
    //两个泛型 第一个是要操作的实体 第二个是主键类型 }

选中接口右键/new/JUnit Test Case测试用例放到web的test模块里,并新建包com.itheima.bos.dao.test/下一步选StandardRepository接口 finish

bos_management_web/src/test/java 文件夹下包com.itheima.bos.dao.test 测试类

测试添删改查 save save传id是修改 find delete

@RunWith(SpringJUnit4ClassRunner.class)//测试类上固定写法 @ContextConfiguration("classpath:applicationContext.xml")//导入xml public class StandardRepositoryTest { 
    private static final Iterable Standard = null; @Autowired private StandardRepository standardRepository;//声明接口并注入 @Test public void fun1() { 
  //找到所有标准表里 列的集合 List<Standard> list = standardRepository.findAll(); System.out.println(list); } @Test public void fun2() { 
  //添加一行 Standard standard2 = new Standard(); standard2.setName("李四"); standard2.setMaxLength(200); System.out.println(standard2); standardRepository.save(standard2); } @Test public void test3() { 
  // save兼具修改并再保存一个的功能,修改的话,必须传入id Standard standard = new Standard(); standard.setId(2L); standard.setName("张三三"); standard.setMaxWeight(9999); standardRepository.save(standard); } @Test public void test5() { 
  //删除id为2的行 standardRepository.delete(2L); } @Test public void test4() { 
  //查id为2的行 Standard standard = standardRepository.findOne(2L); System.out.println(standard); } } 

自定义查

接口 一定只能大字属性名 不能加减 findByNameList是不对的

//JPA提供一套命名规范,只能定义查询的操作方法 可以跟据属性名首字母必须大字的方法 以findBy大字属性名开头 //Standard findByName(String name);//定义一个以姓名查询一行的方法  List<Standard> findByName(String name);//定义一个以姓名查询多个的方法 这两个只能用一个名

测试类

@Test

/* @Test public void test51() {//查自定义的以属性姓名查找 Standard findByName = standardRepository.findByName("张三三"); System.out.println(findByName); }*/ @Test public void test52() {//查自定义的以属性姓名查找 List<Standard> list = standardRepository.findByName("张三"); for (Standard standard : list) { System.out.println(standard); } } 

// 根据名字进行模糊查询

 Standard findByNameLike(String name); //接口 @Test public void testFindByNameLike() { // 根据名字进行模糊查询 只要有张三的 Standard standard = dao.findByNameLike("%张三%"); System.out.println(standard); }

// 查询名字为空的数据

List<Standard> findByNameIsNull();//接口 @Test public void testDelete11() { // 查询名字为空的数据 List<Standard> list = dao.findByNameIsNull(); System.out.println(list.size()); } 

// 多条件查询

Standard findByNameAndOperator(String name,String operator);//接口 @Test public void testFindByNameAndOperator() { // 多条件查询 Standard standard = dao.findByNameAndOperator("张三", "1"); System.out.println(standard); } 

// 使用JPQL进行非标准命名查询

@Query("from Standard s where s.name like ?") Standard findByNamexxxxxLikeJPQL(String name);//接口 @Test public void testJPQL() { // 使用JPQL进行非标准命名查询 Standard standard = dao.findByNamexxxxxLikeJPQL("张三"); System.out.println(standard); } 

// 使用JPQL进行非标准多条件查询// 默认情况下,问号的顺序和传入的参数顺序是一致的
// 可以在问号后面追加数字,改变和参数的匹配顺序
// 下面的示例中,传入的第一个参数匹配到第二个问号,传入的第二个参数匹配到第一个问号

 // 使用标准SQL进行非标准命名查询 @Query(value = "select * from T_STANDARD s where s.C_NAME like ?", nativeQuery = true) Standard findByNamexxxxxLikeSQL(String name); } @Test public void testFindByNameAndOperatorJPQL() { // 使用JPQL进行非标准多条件查询 Standard standard = dao.findByNameAndOperatorJPQL("1", "张三"); System.out.println(standard); } }

自定义更新删除操作

// 泛型参数1 : 实体类 // 泛型参数2 : 实体类中主键的类型 public interface StandardDAO extends JpaRepository<Standard, Integer> { 
    // =========================自定义增删改操作====================================== @Transactional // 使用事务 @Modifying // 执行修改操作 @Query("delete from Standard s where s.name = ?") void deleteByName(String name); @Transactional @Modifying // 执行修改操作 @Query("update Standard s set s.operator = ?2 where s.name = ?1") void updateOperatorByName(String name, String operator); } @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringDataJPATest { 
    @Autowired private StandardDAO dao; @Test public void testDeleteByName() { // 使用JPQL进行自定义删除操作 dao.deleteByName("张三"); }
 @Test public void testUpdateOperatorByName() { // 使用JPQL进行自定义更新操作 dao.updateOperatorByName("张三","333"); } }

用jQuery将json数据遍历并显示到页面里的表格

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用jQuery将json数据遍历并显示到页面表格</title> <script src="js/jquery-1.8.3.js"></script> <script type="text/javascript"> var json = [ { "name": "张三", "sex": "男", "age": "20" }, { "name": "李四", "sex": "男", "age": "18" }, { "name": "王五", "sex": "男", "age": "19" } ]; $(function(){ 
     var s = ""; for(var i = 0; i < json.length; i++) { 
   //遍历出每一行都是三列 每一列放不同的属性名第1列姓名 2姓别 s = "<tr><td>" + json[i].name + "</td><td>" + json[i].sex + "</td><td>" + json[i].age + "</td></tr>"; $("#tab").append(s);//在表里再加遍历出的每一行 } }); </script> </head> <body style="text-align: center;"> <table border="1px" id="tab"> <caption>遍历的表三行三列</caption> <tr height="20px"> <th>姓名</th> <th>性别</th> <th>年龄</th> </tr> </table><br> <table border="1px" id="tab"> <caption>未遍历的表一行三列</caption> <tr height="20px"> <th>姓名</th> <th>性别</th> <th>年龄</th> </tr> </table> </body> </html>

遍历出来的三列 总共有三条数据

姓名 性别 年龄
张三 20
李四 18
王五 19

没有遍历的原始表一行三列

姓名 性别 年龄
这一行都是没有(md显示必须要两行) 没有遍历的原始表一行三列

收派标准standard

增加:

pages/base/standard.html 点击工具栏上的增加按钮 就打开一个div弹窗 为表单

//工具栏 var toolbar = [ { id : 'button-add', text : '增加',//增加按钮 iconCls : 'icon-add', handler : function() { 
    $("#standardWindow").window("open")//打开id为standardWindow的标准添加的 div 弹出窗口 方法为open }

弹窗里为保存按钮添加点击事件//方法 οnclick=”submitData()” 就到js方法

<div class="easyui-window" title="对收派标准进行添加或者修改" id="standardWindow" collapsible="false" minimizable="false" maximizable="false" modal="true" closed="true" style="width: 600px; top: 50px; left: 200px"> <div region="north" style="height: 31px; overflow: hidden;" split="false" border="false"> <div class="datagrid-toolbar"> <a id="save" onclick="submitData()" icon="icon-save" href="#" class="easyui-linkbutton" plain="true">保存</a> </div> </div>

到js的 submitData() 校验表单中必填项是否都已经填写了 才可以点保存

<script type="text/javascript"> function submitData() { 
    //submitData方法 from方法 validate校验方法 // 校验表单中必填项是否都已经填写了  var result = $("#standardForm").form("validate") if (result) { // 提交表单 $("#standardForm").submit()//只有全部填写了就可以点保存 } } </script>

弹窗里的 表单 提交到action=”../../standardAction_save.action” 上两级里面的standardAction_save 和com.itheima.bos.web是一级了

<form id="standardForm" method="post" action="../../standardAction_save.action"> <table class="table-edit" width="80%" align="center"> <tr class="title"> <td colspan="2">收派标准信息 <!--提供隐藏域 装载id --> <input  type="hidden" name="id" /> </td> </tr> <tr>

后台

bos_managment_web 工程中src/main/java,创建com.itheima.bos.web.action.base. StandardAction

package com.itheima.bos.web.base; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.itheima.bos.domain.base.Standard; import com.itheima.bos.service.base.StandardService; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; @Namespace("/") // 等价于struts.xml文件中package节点namespace属性 @ParentPackage("struts-default")// 等价于以前struts.xml中<package>节点的extends属性 @Scope("prototype")// 等价于以前applicationContext.xml中<bean>节点的scope属性 @Controller// 代表本类是一个控制器,即web层 public class StandardAction extends ActionSupport implements ModelDriven<Standard> { private Standard model=new Standard();//模型驱动声明和返回 @Override public Standard getModel() { return model; } @Autowired //注入service接口 private StandardService standardService; // value : // 等价于struts.xml文件中action节点中的name属性 // 多个结果就使用@Result注解标识 // name : 结果 是常量的小写 // location: 跳转页面路径 /pages/base/standard.html // type : 使用的方式,重定向或转发 redirect重定向 //org.apache.struts2.convention.annotation.Action; @Action(value = "standardAction_save", results = { @Result(name = "success",location = "/pages/base/standard.html", type = "redirect")}) public String save() { standardService.save(model); return SUCCESS; }  }

bos_managment_service工程中,创建com.itheima.bos.service.base.StandardService接口

public interface StandardService {

 void save(Standard standard); }

bos_managment_service工程中,创建 com.itheima.bos.service.base.impl.StandardServiceImpl实现

@Transactional// 代表本类中的方法需要使用事务 @Service // 代表本类属于Service层 public class StandardServiceImpl implements StandardService { 
    @Autowired private StandardDao standarDao; @Override public void save(Standard standard) { standarDao.save(standard); } }

bos_managment_dao工程中,创建com.itheima.bos.dao.base.StandardDAO

public interface StandardDao { void save(Standard standard); }

bos_managment_dao工程中,创建com.itheima.bos.dao.base.impl 创StandardDAOImpl

@Transactional// 代表本类中的方法需要使用事务 @Service // 代表本类属于Service层 public class StandardServiceImpl implements StandardService { 
    @Autowired //注入jpa接口 private StandardRepository standardRepository; @Override public void save(Standard standard) { standardRepository.save(standard); } }

com.itheima.bos.dao.base.StandardRepository 接口

public interface StandardRepository extends JpaRepository<Standard, Long>{ 
   

com.itheima.bos.web.action.base web层 包名一定要带action

分页显示

前端

查出来的json 显示在中间选项卡里

<div region="center" border="false"> <table id="grid"></table> </div>

修改bos_managment_web项目/class=”datagrid-toolbar” pages/base/standard.html页面grid的请求地址为standardAction_pageQuery.action”,

// 收派标准信息表格 $('#grid').datagrid({ 
  //发起请求 请求后果的Action发过来的json显示到#grid表格里 iconCls : 'icon-forward', fit : true, border : false, rownumbers : true, striped : true, pageList : [ 30, 50, 100 ],//一页显示多少条 pagination : true, toolbar : toolbar, url : "../../standardAction_pageQuery.action", idField : 'id', columns : columns }); });
实现
 private int page;//第几页 private int rows;//每页显示多少条 public void setPage(int page) { 
  //属性驱动获取前端数据 this.page = page; } public void setRows(int rows) { this.rows = rows; } @Action(value = "standardAction_pageQuery")//AJAX请求不需要跳转页面 public String pageQuery() throws IOException { Pageable pageable = new PageRequest(page-1, rows);//EasyUI的页码是从1开始的 Page<Standard>page=standardService.findAll(pageable);//用jpa查出page 集合 long total = page.getTotalElements();//总条数 List<Standard> list = page.getContent();//不要封闭对象直接拿到 当前页实现的内容的集合 Map<String, Object>map=new HashMap<>();//封闭成map里转成json map.put("total", total);//把总条数加到map map.put("rows", list);//把当前的内容加 // JSONArray封闭数组JSONObject封闭对象或map 包net.sf.json.JSONObject; String json = JSONObject.fromObject(map).toString();//转成json HttpServletResponse response = ServletActionContext.getResponse();//响应流对象 response.setContentType("application/json;charset=UTF-8");//设置编码和格式是json response.getWriter().write(json);//输出流json return NONE;//无返回 } 

Page<Standard> findAll(Pageable pageable); service接口

StandardServiceImpl实现

public Page<Standard> findAll(Pageable pageable) { return standardRepository.findAll(pageable); } 

修改

id : 'button-edit', text : '修改', iconCls : 'icon-edit', handler : function() { 
    //判断用户勾选了哪些条信息 var result=$("#grid").datagrid("getSelections");//得到所有选中的 if (result.length==1) { 
  //数组中第一条 因为只能选一条 $("#standardWindow").window("open")//打开窗口] $("#standardForm").form("load",result[0])//load方法回填数据 数组中第一条 }else{ 
  //没选 中或多选  $.messager.alert("提示","必须选也只能选一条修改","info") } 

点击保存的时候 同时也可以修改功能 只需有id就可以 表单里有个id的隐藏域 就实现了修改保存的功能

快递员courier

增加

页面位置 : bos_managment_web中/pages/base/courier.html

ComboBox下拉列表的使用 class=”easyui-combobox”

td表格里 会显示查出来的json

<td>取派标准</td> <td> <input type="text" name="standard.id" class="easyui-combobox" data-options="required:true,valueField:'id',textField:'name', url:'../../standard_findAll.action'"/> </td> 

查出所有取派标准

 @Action(value = "standard_findAll")//AJAX请求不需要跳转页面 public String findAll() throws IOException { Page<Standard>page= standardService.findAll(null);//传null就查询所有的派送标准 List<Standard> list = page.getContent();//所有数据都拿出来封闭成list String json = JSONArray.fromObject(list).toString();//转json HttpServletResponse response = ServletActionContext.getResponse();//响应流对象 response.setContentType("application/json;charset=UTF-8");//设置编码和格式是json response.getWriter().write(json);//输出流json return NONE;//无返回 }

保存

couricer.html 保存按钮到js

<div class="easyui-window" title="对收派员进行添加或者修改" id="addWindow" collapsible="false" minimizable="false" maximizable="false" style="top:20px;left:200px"> <div region="north" style="height:31px;overflow:hidden;" split="false" border="false"> <div class="datagrid-toolbar"> <a id="save" onclick="submitDate()" icon="icon-save" href="#" class="easyui-linkbutton" plain="true">保存</a> </div> </div>

submitDate js

function submitDate(){ 
    if ($("#courierForm").form("validate")) { 
  //如果表单数据都输有了 $("#courierForm").submit();//就提交 } }

并把表单提交到 ../../courierAction_save.action

<form id="courierForm" method="post" action="../../courierAction_save.action"> <table class="table-edit" width="80%" align="center"> <tr class="title"> <td colspan="4">收派员信息</td>

CourierAction

@Namespace("/") @ParentPackage("struts-default") @Controller @Scope("prototype") public class CourierAction extends ActionSupport implements ModelDriven<Courier> { 
    private Courier model=new Courier(); @Override public Courier getModel() { return model; } @Autowired private CourierSerice courierSerice; @Action(value="courierAction_save",results={ @Result(name="success",location="/pages/base/courier.html",type="redirect") }) public String save() { courierSerice.save(model); return SUCCESS; }

service接口

public interface CourierSerice { void save(Courier courier);

实现

@Transactional @Service public class CourierSericeImpl implements CourierSerice { 
    @Autowired private CourierRepository courierRepository; @Override public void save(Courier courier) { courierRepository.save(courier); } }

dao接口

public interface CourierRepository extends JpaRepository<Courier, Long> { 
    }

分页查询 前端显示

div region="center" border="false"> <table id="grid"></table> </div>
// 取派员信息表格 $('#grid').datagrid( { iconCls : 'icon-forward', fit : true, border : false, rownumbers : true, striped : true, pageList: [30,50,100], pagination : true, toolbar : toolbar, url : "../../courierAction_pageQuery.action", idField : 'id', columns : columns, onDblClickRow : doDblClickRow });

后台处理成json

private int page; private int rows; public void setPage(int page) { this.page = page; } public void setRows(int rows) { this.rows = rows; } @Action(value="courierAction_pageQuery") public String pageQuery() throws IOException { Pageable pageable=new PageRequest(page-1, rows); Page<Courier> page=courierSerice.findAll(pageable); long total = page.getTotalElements(); List<Courier> list = page.getContent();//拿到当前页内容的集合 Map<String, Object> map = new HashMap<>(); map.put("total", total); map.put("rows",list); //查询时会懒加载,在开发中为了提高服务器性能在转为json时处理忽略不需要的字段 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{ 
  "fixedAreas","takeTime"}); String json = JSONObject.fromObject(map,jsonConfig).toString();//忽略不需要字段 HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(json); return NONE; } 

接口

public interface CourierSerice { Page<Courier> findAll(Pageable pageable);}

实现

 public Page<Courier> findAll(Pageable pageable) { return courierRepository.findAll(pageable); }

修改

修改的开机 调doEdit方法 到js

{ id : 'button-edit', text : '修改', iconCls : 'icon-edit', handler : doEdit },

js的 deEdit方法

function doEdit(){ 
    var result=$("#grid").datagrid("getSelections"); if (result.length==1) { $("#addWindow").window("open"); $("#courierForm").form("load",result[0]); } else { $.messager.alert("温馨提示您","必须选也只能选 一个","info"); } } 

表单一定要有name=id的隐藏域

<td colspan="4">收派员信息 <input type="hidden" name="id" /> <!--提供隐藏域 装载id --> </td>

是否作废

作废是js的doDelete方法

id : 'button-delete', text : '作废', iconCls : 'icon-cancel', handler : doDelete 

js

function doDelete() { 
    var rows = $("#grid").datagrid("getSelections")//全部选中的 if (rows.length == 0) { $.messager.alert("提示", "你至少要选择一条数据进行操作", "info") } else { $.messager.confirm( '删除对话框', '您确定要作废这些快递员吗?', function(r) { 
    if (r) { // 创建一个数组 var arr = new Array(); for (var i = 0; i < rows.length; i++) { // 向数组中插入数据 arr.push(rows[i].id) } // 如何发送请求 //form表单, AJAX, window.location.href window.location.href = "../../courierAction_batchDel.action?ids=" + arr.toString() } }); } }

action

 private String ids; public void setIds(String ids) { this.ids = ids; } @Action(value="courierAction_batchDel",results={ @Result(name="success",location="/pages/base/courier.html",type="redirect") }) public String batchDel() throws IOException { courierSerice.batchDel(ids); return SUCCESS; }

service接口 void batchDel(String ids);

实现

 @Override public void batchDel(String ids) { if (StringUtils.isNotEmpty(ids)) { 
  //包org.apache.commons.lang3.StringUtils; String[] split = ids.split(",");//用,号切割数据 for (String id : split) { courierRepository.updateDelTagById(Long.parseLong(id));//string转long 循环删除 } } 

dao接口

public interface CourierRepository extends JpaRepository<Courier, Long> { 
    // 根据ID更改删除的标志位 @Modifying @Query("update Courier set deltag = 1 where id = ?") void updateDelTagById(Long id); }

快递员多重条件搜索

在前端加一个搜索按钮

{ id : 'button-search',//增加 搜索按钮 text : '搜索', iconCls : 'icon-search', handler : openSearchWindow //转到js方法打个窗口 }

新增js方法 openSeachWindow

function openSearchWindow(){ 
   //打开搜索 窗口是个#searchwindow的表单 $("#searchWindow").window("open");//open方法 }

#searchWindow是个表单 表单里的 查询按钮添加事件 到js οnclick=”doSearch()” load走之前的这个查询方法

doSearch.js

// 执行查询 function doSearch() { 
    // 把form表单中input节点的name的值和用户输入的内容,拼接成json字符串 var result = $("#searchForm").serializeJson(); // 让Datagrid重新发起请求,并把用户输入的查询条件传递给后台 $('#grid').datagrid('load', result); }

在这个方法前有个serializeJson方法功能是: 把form表单中input节点的name的值和用户输入的内容,拼接成json字符串

$.fn.serializeJson = function() { 
    var serializeObj = {}; var array = this.serializeArray(); var str = this.serialize(); $(array).each( function() { 
    if (serializeObj[this.name]) { if ($.isArray(serializeObj[this.name])) { serializeObj[this.name].push(this.value); } else { serializeObj[this.name] = [ serializeObj[this.name], this.value ]; } } else { serializeObj[this.name] = this.value; } }); return serializeObj; };

后台还是在pageQuery 分页查询方法中 实现

package com.itheima.bos.dao.base;接口 多继承JpaSpecificationExecutor要结合CourierRepository不能单独使用 datagrid

public interface CourierRepository extends JpaRepository<Courier, Long>,JpaSpecificationExecutor<Courier> { 
   

CourierAction的 pageQuery方法 newSpecification\ 会重写内部方法toPredicate

@Action(value="courierAction_pageQuery") public String pageQuery() throws IOException { Specification<Courier> specification = new Specification<Courier>() { @Override // new Specification 会重写内部类 public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) { String courierNum = model.getCourierNum();//模型驱动获得前端工号 String company = model.getCompany();//公司  Standard standard = model.getStandard();//收派标准 String type = model.getType();//类型 ArrayList<Predicate> list = new ArrayList<>();//先定义个list集合如果有查询条件就增加进去 if (StringUtils.isNotEmpty(courierNum)) { 
  //如果工号不为空 就创建等值查询条件 Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courierNum); list.add(p1); } if (StringUtils.isNotEmpty(company)) { 
  //如果公司不为空 就创建模糊查询条件 Predicate p2 = cb.like(root.get("company").as(String.class), "%"+company+"%"); list.add(p2); } if (StringUtils.isNotEmpty(type)) { 
  //如果工号不为空 就创建等值查询条件 Predicate p3 = cb.equal(root.get("type").as(String.class), type); list.add(p3); } if (standard!=null) { 
  //如果收派标准对象 不为空 就创建联表查询条件 String name = standard.getName();//收派对象 if (StringUtils.isNotEmpty(name)) { 
  //的name不为空 Join<Object, Object> join = root.join("standard"); Predicate p4 = cb.equal(root.get("name").as(String.class), name); list.add(p4); } } if (list.size()==0) { 
  //如果用户没有输入查询条件就输出null return null; } //用户输入了查询条件 Predicate[]arr=new Predicate[list.size()];//新建Predicate对象的数组 长度为list的长度 list.toArray(arr);//list转数组 Predicate predicate = cb.and(arr);//cb让数组里的 查询条件同时满足 return predicate; } }; Pageable pageable=new PageRequest(page-1, rows); Page<Courier> page=courierSerice.findAll(specification, pageable); long total = page.getTotalElements(); List<Courier> list = page.getContent();//拿到当前页内容的集合 Map<String, Object> map = new HashMap<>(); map.put("total", total); map.put("rows",list); //查询时会懒加载,在开发中为了提高服务器性能在转为json时处理忽略不需要的字段 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{ 
  "fixedAreas","takeTime"});//忽略两个实体里字段 String json = JSONObject.fromObject(map,jsonConfig).toString();//忽略不需要字段 HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(json); return NONE; } private String ids; public void setIds(String ids) { this.ids = ids; } @Action(value="courierAction_batchDel",results={ @Result(name="success",location="/pages/base/courier.html",type="redirect") }) public String batchDel() throws IOException { courierSerice.batchDel(ids); return SUCCESS; } 

CourierSerice 接口

Page<Courier> findAll(Specification<Courier> specification, Pageable pageable);

CourierSericeImpl实现

 public Page<Courier> findAll(Specification<Courier> specification, Pageable pageable) { return courierRepository.findAll(specification,pageable); }

查询表单上添加modal=”true” 其它窗口就不能点击

文件上传js插件 引入jquery.ocupload-1.1.2.js 定义一个上传按钮 js入口就 初始化控件

 $(function() { 
    $("#btn").upload({ action : "../../upload.action" }) })

区域设置area

area.html 导入设置上传

{ id : 'button-import', text : '导入', iconCls : 'icon-redo'

导入的id是button-import 在入口函数加载上传插件 js:

// 给导入按钮绑定事件 $("#button-import").upload({ action:"../../areaAction_importXLS.action" })

服务器端接收上传的Excel文件

bos_managment_web工程创建com.itheima.bos.web.action.base.AreaAction类

area.html 导入按钮

{ id : 'button-import', text : '导入', iconCls : 'icon-redo' }

// 给导入按钮绑定事件

$("#button-import").upload({ action:"../../areaAction_importXLS.action" }) 

读取表格插件 poi

hssfworkbook workbook=new hssfworkbook(new fileinputstream(“”))

itheimaUtils工具类工程导入POI:

在总工程身上点右键/new/project/Maven Projece/勾选Create a simple project../Group id包结构com.itheima/Artifact id工程名itheimaUtils/打包方式Packaging选jar /Parent project里指定上一级父工程common_parent/finish

managment_service工程身上右键/mawen/add dependency 搜itheimaUtils

再在itheimaUtils里java 建包com.itheima.bos.utils 粘贴拼音pinyin4j.jar

AreaAction.java

@Namespace("/") @ParentPackage("struts-default") @Controller @Scope("prototype") public class AreaAction extends CommonAction<Area> { 
    public AreaAction() { super(Area.class); } @Autowired private AreaService areaService; private File file;//使用属性驱动获取用户上传的文件  public void setFile(File file) { this.file = file; } @Action(value="areaAction_importXLS",results={ @Result(name="success",location="/pages/base/area.html",type="redirect") }) public String importXMS() throws IOException, IOException{ 
  //上传表格写到数据库江显示的方法 HSSFWorkbook hssfWorkbook= new HSSFWorkbook(new FileInputStream(file));//new出对象并加载上传的文件 HSSFSheet sheet = hssfWorkbook.getSheetAt(0);//读出第一个工作簿 ArrayList<Area> list = new ArrayList<>();//储存Area对象集合 for (Row row : sheet) { 
  //遍历所有行 if (row.getRowNum()==0) { 
  //忽略第一行 continue; } String province = row.getCell(1).getStringCellValue();//读取第一列 省份 String city = row.getCell(2).getStringCellValue();//第二列 城市 String district = row.getCell(3).getStringCellValue();//第三列 地区 String postcode = row.getCell(4).getStringCellValue();//第四列 邮编 // 截掉最后一个字 省 市 区 province = province.substring(0, province.length()-1); city=city.substring(0, city.length()-1); postcode=postcode.substring(0, postcode.length()-1); String citycode = PinYin4jUtils.hanziToPinyin(city, "").toUpperCase();//城市编码 String[] headByString = PinYin4jUtils.getHeadByString(province+city+district);//简码 GDSZBA String shortcode = PinYin4jUtils.stringArrayToString(headByString); Area area = new Area(); area.setPostcode(postcode); area.setCity(citycode); area.setDistrict(district); area.setPostcode(postcode); area.setCity(citycode); area.setShortcode(shortcode); list.add(area);//添加到集合 } areaService.save(list); hssfWorkbook.close(); return SUCCESS; }

AreaService接口

public interface AreaService { void save(ArrayList<Area> list);

AreaServiceImpl实现

@Service @Transactional public class AreaServiceImpl implements AreaService { 
    @Autowired private AreaRepository areaRepository; @Override public void save(ArrayList<Area> list) { areaRepository.save(list); }}

dao接口

public interface AreaRepository extends JpaRepository<Area, Long> { 
   }

区域分页查询 显示

area.html页面 datagrid数据来源 // 区域管理数据表格

// 区域管理数据表格 $('#grid').datagrid({ iconCls : 'icon-forward', fit : true, border : false, rownumbers : true, striped : true, pageList : [ 30, 50, 100 ], pagination : true, toolbar : toolbar, url : "../../areaAction_pageQuery.action", idField : 'id', columns : columns, onDblClickRow : doDblClickRow });

AreaAction里的pageQuery方法

@Action(value="areaAction_pageQuery")//分页显示 public String pageQuery() throws Exception{ 
  //上传表格写到数据库江显示的方法 Pageable pageable = new PageRequest(page-1, rows); Page<Area>page=areaService.findAll(pageable);//查询出 全部页面 的集合 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{ 
  "subareas"}); page2Json(page, jsonConfig);//调用父类的page对象转json return NONE; }

接口 Page<Area> findAll(Pageable pageable);

实现

 public Page<Area> findAll(Pageable pageable) { return areaRepository.findAll(pageable); }

dao层接口

public interface AreaRepository extends JpaRepository<Area, Long> { 
   } 

保存

增加按键 绑定js方法 doAdd

{ id : 'button-add', text : '增加', iconCls : 'icon-add', handler : doAdd }

js方法是打开#addWindows窗口

function doAdd(){ 
    $('#addWindow').window("open"); }

窗口是个div

// 添加、修改区域窗口 只有基本长度高 $('#addWindow').window({ title: '添加修改区域', width: 400, modal: true, shadow: true, closed: true, height: 400, resizable:false });

div里有个保存按钮 绑定submitDate js方法

<div class="easyui-window" title="区域添加修改" id="addWindow" collapsible="false" minimizable="false" maximizable="false" style="top:20px;left:200px"> <div region="north" style="height:31px;overflow:hidden;" split="false" border="false"> <div class="datagrid-toolbar"> <a id="save" onclick="submitDate()" icon="icon-save" href="#" class="easyui-linkbutton" plain="true">保存</a>

save方法 判断#areaForm表单 有没有填满 填满就提交

function submitDate(){ 
    if ($("#areaForm").form("validate")) { 
  //如果表单数据都输有了 $("#areaForm").submit();//就提交 } }

表单 提交 随便提供name=id的隐藏域

 <form id="areaForm" method="post" action="../../areaAction_save.action" > <table class="table-edit" width="80%" align="center"> <tr class="title"> <td colspan="2">区域信息 <input type="hidden" name="id" /> <!--提供隐藏域 --> </td>

后台实现

areaAction_save

 @Action(value="areaAction_save",results={ @Result(name="success",location="/pages/base/area.html",type="redirect") }) public String save(){ areaService.save(getModel()); return SUCCESS; } 

接口 void save(Area area);

实现

 public void save(Area area) { areaRepository.save(area); }

修改

<td colspan="2">区域信息 <input type="hidden" name="id" /> <!--提供隐藏域 --> </td>

在修改处的 handler :function(){执行方法

id : 'button-edit', text : '修改', iconCls : 'icon-edit', handler :function(){ 
    var result=$("#grid").datagrid("getSelections")//#grid是中间的div的所有选 中 if (result.length==1) { $("#addWindow").window("open"); $("#areaForm").form("load",result[0]); } else { $.messager.alert("提示","必须选也只能选 一条修改" , "info") } }

s

抽取重复代码重构CommonAction:

bos_management_web/src/main/java的com.itheima.bos.web.action包下 CommonAction.java

package com.xyz.bos.web.action; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import org.springframework.data.domain.Page; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; public class CommonAction<T> extends ActionSupport implements ModelDriven<T> { private T model;//声明T类型model实体对象 private Class<T> clazz; public CommonAction(Class<T> clazz) { 
  //用构造函数 初始化new model this.clazz = clazz; try { model = clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } @Override//模型驱动返回model实体 public T getModel() { return model; } protected int page;// 第几页 使用属性驱动获取数据 protected int rows;// 每一页显示多少条数据 public void setPage(int page) { this.page = page; } public void setRows(int rows) { this.rows = rows; } //把分页的map转json public void page2json(Page<T> page, JsonConfig jsonConfig)throws IOException { long total = page.getTotalElements();// 查出总数据条数 List<T> list = page.getContent();// 当前页要实现的内容 Map<String, Object> map = new HashMap<>();// 声明封装数据的map map.put("total", total);//增加到map map.put("rows", list); String json;//声明json if (jsonConfig != null) { 
  //有排除对象/不是空 就排除再转成json json = JSONObject.fromObject(map, jsonConfig).toString(); } else { 
  //没有排除的对象就直接转 json = JSONObject.fromObject(map).toString(); } HttpServletResponse response = ServletActionContext.getResponse();//响应流对象 response.setContentType("application/json;charset=UTF-8");//设置编码 response.getWriter().write(json);//写到流 } //list转json public void list2json(List list, JsonConfig jsonConfig) throws IOException { String json;//声明json if (jsonConfig != null) { 
  //有排除对象/不是空 就排除再转成json json = JSONArray.fromObject(list, jsonConfig).toString(); } else { 
  //没有排除的对象就直接转 json = JSONArray.fromObject(list).toString(); } HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(json);//写到流 }}

派送标准 继承

public class StandardAction extends CommonAction<Standard> { 
   //继承父类 public StandardAction() { super(Standard.class); //用父构造方法 模型驱动具体的类 } @Autowired private StandardService standardService;//注入service @Action(value = "standardAction_save", results = { @Result(name = "success",location = "/pages/base/standard.html", type = "redirect")}) public String save() { standardService.save(getModel()); return SUCCESS; } @Action(value = "standardAction_pageQuery")//AJAX请求不需要跳转页面 public String pageQuery() throws Exception { Pageable pageable = new PageRequest(page - 1, rows); Page<Standard> page = standardService.findAll(pageable); page2Json(page, null);//直接调父类的page2Json方法 没有要排除的 return NONE; } 

管理分区 sub_area

增加:页面

区域下拉列表选择导入的区域

pages/base/sub_area.html 分区增加弹出窗口 里第一项是选择区域下拉列表选择导入的区域

<td>选择区域</td> <td> <input class="easyui-combobox" name="area.id" data-options="valueField:'id',textField:'name', url:'../../areaAction_findAll.action' " /> </td>

AreaAction

@Action(value="areaAction_findAll")//分页显示 public String findAll() throws Exception{ 
  //上传表格写到数据库江显示的方法 Page<Area>page=areaService.findAll(null);//不需要分页就传null List<Area> list = page.getContent();//拿到全部数据list集合 JsonConfig jsonConfig = new JsonConfig();//new出jsonconfig jsonConfig.setExcludes(new String[]{ 
  "subareas"});//设置排除懒加载列表 list2json(list, jsonConfig);//调父类list2json方法 return NONE; }

CommonAction父类 list2json方法

public void list2json(List<T> list,JsonConfig jsonConfig) throws Exception{ 
  //page对象输出json方法 String json;//声明json if (jsonConfig!=null) { 
  //判断有没有jsonConfig对象是不是空(有没有排除) json= JSONArray.fromObject(list,jsonConfig).toString();//有就排除传进去转成json }else{ json= JSONArray.fromObject(list).toString();//list转成json要肜JSONarray } HttpServletResponse response = ServletActionContext.getResponse();//响应流对象 response.setContentType("application/json;charset=UTF-8");//设置编码 response.getWriter().write(json);//写到流 }

下拉框中显示数据需要name字段,而Area实体类并没有该字段,所以需要自己在实体类中实现一个getName()方法 转json方法是按get方法只要有get方法就会转出json键值

 //加多getName()方法 由省市区拼接 public String getName() { return province+city+district; }

实体类

 //加多getName()方法 由省市区拼接 public String getName() { return province+city+district; }

下拉框 里可以用拼音 增强搜索的功能

sub_area.html里 的选择区域 加上textField:’name’,mode:’remote’, 就会重发一次请求并把输入值作为参数查询 这个属性的key为q 值为输入的

用属性驱动取出来 findAll

private String q; //属性驱动 前端过来的q 加上mode:'remote'的key public void setQ(String q) { this.q = q; } @Action(value="areaAction_findAll")//查找全部 public String findAll() throws Exception{ List<Area> list; if (StringUtils.isNoneEmpty(q)) { 
  //有输入值进行模糊查询 list=areaService.findByQ(q); }else { 
  //没有输入值就查询所有 Page<Area>page=areaService.findAll(null);//不需要分页就传null list= page.getContent();//拿到全部数据到list集合 } JsonConfig jsonConfig = new JsonConfig();//new出jsonconfig设置排除 jsonConfig.setExcludes(new String[]{ 
  "subareas"});//设置排除懒加载列表 list2json(list, jsonConfig);//调父类list2json方法 return NONE; }

接口 List<Area> findByQ(String q);

实现

 public List<Area> findByQ(String q) { q="%"+q.toUpperCase()+"%";//模糊匹配要加% 如果输入小写转大写 数据库简码全是大写 return areaRepository.findQ(q);//定义方法时不能用标准的ByQ }

dao接口

public interface AreaRepository extends JpaRepository<Area, Long> { 
    @Query("from Area where province like ?1 or city like ?1 or district like ?1 or postcode like ?1 or citycode like ?1 or shortcode like ?1 ") List<Area> findQ(String q);//自定义查询 ?后面加数字可以不用写那么多

保存分区信息

sub_area.html 弹窗保存绑定事件

<a id="save" onclick="submitDate()" icon="icon-save" href="#" class="easyui-linkbutton" plain="true">保存</a>

js submitDate(

function submitDate() { 
    if($("#subareaForm").form("validate")){ 
  //用form方法传validate校验表单 $("#subareaForm").submit();//成功了(都填了)就提交本页表格id=#subareaForm的这个表格 } }
<form id="subareaForm" method="post" action="../../subAreaAction_save.action"> <table class="table-edit" width="80%" align="center"> <tr class="title"> <td colspan="2">分区信息 <input type="hidden" name="id" /> <!--提供隐藏域 --> </td> </tr> <tr>

后台实现

dao接口

public interface SubAreaRepository extends JpaRepository<SubArea, Long> { 
   }

SubAreaAction

@Namespace("/") @ParentPackage("struts-default") @Controller @Scope("prototype") public class SubAreaAction extends CommonAction<SubArea> { 
    public SubAreaAction() { super(SubArea.class); } @Autowired private SubAreaService subAreaService; @Action(value = "subAreaAction_save", results = { @Result(name = "success",location = "/pages/base/sub_area.html", type = "redirect")}) public String save() { subAreaService.save(getModel()); return SUCCESS; }

SubAreaService接口

public interface SubAreaService { void save(SubArea model);}

SubAreaServiceImpl实现

@Service @Transactional public class SubAreaServiceImpl implements SubAreaService { 
    @Autowired private SubAreaRepository subAreaRepository; @Override public void save(SubArea model) { subAreaRepository.save(model); }

分页显示

// 分区管理数据表格 $('#grid').datagrid( { iconCls : 'icon-forward', fit : true, border : true, rownumbers : true, striped : true, pageList: [30,50,100], pagination : true, toolbar : toolbar, url : "../../subAreaAction_pageQuery.action", idField : 'id', columns : columns, onDblClickRow : doDblClickRow });

action

 @Action(value = "subAction_pageQuery") public String pageQuery() throws IOException { Pageable pageable = new PageRequest(page - 1, rows); Page<SubArea> page = subAreaService.findAll(pageable); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[] { 
  "subareas","couriers"}); page2json(page, jsonConfig); return NONE; }

接口

public interface SubAreaService { Page<SubArea> findAll(Pageable pageable);}

实现

 public Page<SubArea> findAll(Pageable pageable) { return subAreaRepository.findAll(pageable); } 

修改

js的 deEdit方法

function doEdit(){ 
    var result=$("#grid").datagrid("getSelections"); if (result.length==1) { $("#addWindow").window("open"); $("#subareaForm").form("load",result[0]); } else { $.messager.alert("温馨提示您","必须选也只能选 一个","info"); } }

表单一定要有name=id的隐藏域

<td colspan="2">分区信息 <input type="hidden" name="id" /> <!--提供隐藏域 装载id --> </td>

是否作废

JAX-RS方式的使用(掌握)

服务端开发

创建Maven工程,包 com.itheima 名cxf_rs_server 类型选择war 生成web.xml

导入坐标

<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.7.RELEASE</version> </dependency> <!-- rs服务核心包 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <!-- 修改的地方jaxws --> <version>3.0.1</version> </dependency> <!-- rs服务扩展包 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <!-- 转换json需要的坐标 --> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> </dependencies> 

web.xml 跟ws一样

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置cxf框架 --> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/webService/*</url-pattern> </servlet-mapping> 

实体类 com.itheima.ws.domain User

package com.itheima.ws.domain; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "user") public class User { 
    private int id; private String name; private String password; public User() {} public User(int id, String name, String password) { this.id = id; this.name = name; this.password = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; } } 

创建Service接口 com.itheima.ws.service 包import javax.ws.rs.core.MediaType;

package com.itheima.ws.service; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import com.itheima.ws.domain.User; @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) // 指定参数的数据传输格式json xml @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) // 指定返回值的数据传输格式 //@webService//rs不要这个注解 public interface UserService { 
    // http://localhost:8080/cxf_rs_server/webService/userService/user @POST//请求保存对应注解是POST @Path("/user") // 指定请求路径 public void save(User user); // http://localhost:8080/cxf_rs_server/webService/userService/user?id=1 @DELETE @Path("/user") public void delete(@QueryParam("id") int x); @PUT @Path("/user") public void update(User user); @GET @Path("/user") public List<User> findAll(); // http://localhost:8080/cxf_rs_server/webService/userService/findById?id=11 @GET @Path("/findById") public User findById(@QueryParam("id") int x); // http://localhost:8080/cxf_rs_server/webService/userService/user/1/icon @GET @Path("/user/{id}/icon") public User findIcon(@PathParam("id") int x); } 

创建Service实现 com.itheima.ws.service.impl

package com.itheima.ws.service.impl; import java.util.ArrayList; import java.util.List; import com.itheima.ws.domain.User; import com.itheima.ws.service.UserService; public class UserServiceImpl implements UserService { 
    @Override public void save(User user) { System.out.println("用户已经保存:" + user); } @Override public void delete(int id) { System.out.println("用户已经被删除:" + id); } @Override public void update(User user) { System.out.println("用户已经更新:" + user); } @Override public List<User> findAll() { List<User> list = new ArrayList<>(); list.add(new User(22, "李四", "123")); list.add(new User(11, "张三", "123")); return list; } @Override public User findById(int id) { return new User(11, "张三", "123"); } @Override public User findIcon(int x) { return new User(11, "张三", "123"); } } 

src/main/resources 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:jaxrs="http://cxf.apache.org/jaxrs" xmlns:soap="http://cxf.apache.org/bindings/soap" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd "> <bean id="serviceBean" class="com.itheima.ws.service.impl.UserServiceImpl"></bean><!-- 提供服务的对象--> <jaxrs:server address="/userService"><!-- 注册对象 指定地址--> <jaxrs:serviceBeans><!-- 注册对象的方法--> <ref bean="serviceBean" /> </jaxrs:serviceBeans> <jaxrs:inInterceptors><!-- 拦截请求--> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxrs:inInterceptors> <!-- 拦截响应信息,非必须 设置后,可以在控制台观察到响应信息 --> <jaxrs:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxrs:outInterceptors> </jaxrs:server> </beans>

http://localhost/cxf_ws_server/webService 可以看到的是Available RESTful services:下面列表

客户端开发

CXF框架,WebClient Apache的HttpClient Java的API

创建Maven工程,包com.itheima 名 cxf_rs_client 类型选择jar 导入坐标

<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- rs服务核心包 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.1</version> </dependency> <!-- rs客户端 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-client</artifactId> <version>3.0.1</version> </dependency> <!-- rs服务扩展包 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <!-- 转换json需要的坐标 --> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> </dependencies> 

将Server工程的实体类拷贝过来

cxf_rs_client/src/test/java 包com.itheima.rs.test 名Mytest 示例测试代码

package com.itheima.rs.test; import java.util.Collection; import javax.ws.rs.core.MediaType; import org.apache.cxf.jaxrs.client.WebClient; import org.junit.Test; import com.itheima.ws.domain.User; // accept:我接收的数据类型// type:我传过去的数据类型 public class Mytest { 
    @Test public void test1() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 WebClient.// create("http://localhost/cxf_rs_server/webService/userService/user")// 指定请求的地址 .post(new User(11, "张三", "123")); } @Test public void test2() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址 .query("id", 11)// 传递查询参数 .delete(); } @Test public void test3() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址 .put(new User(11, "张三", "123")); } @Test public void test4() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 Collection<? extends User> collection = WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址 .accept(MediaType.APPLICATION_JSON)// 指定客户端能处理的数据格式 .type(MediaType.APPLICATION_JSON)// 指定客户端传给服务端的数据格式 .getCollection(User.class); for (User user : collection) { System.out.println(user); } } @Test public void test5() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 User user = WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/findById")// 指定请求的地址 .query("id", 11).get(User.class); System.out.println(user); } // http://localhost:8080/cxf_rs_server/webService/userService/user/11/icon @Test public void test6() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 User user = WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/user/" + 11 + "/icon")// 指定请求的地址 .get(User.class); System.out.println(user); } // http://localhost:8080/cxf_rs_server/webService/userService/user/11/icon @Test public void test7() { // 主机名:端口号/项目名/web.xml文件中指定的路径/applicationContext.xml文件中指定的路径/接口上使用@Path注解指定的地址/方法上使用@Path注解指定的地址 User user = WebClient.// create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址 .path("/{id}/icon", 11).get(User.class); System.out.println(user); } } 

RESTFul常用注解

路径相关
  • @Path : 设置访问路径. 可以用在方法或类上面
参数类型相关 数据格式
  • @Consumers: 定义方法参数类型,常用值为 : “application/xml”, “application/json”
  • @Producers: 定义方法返回值类型,常用值为 : “application/xml”, “application/json”
参数相关
  • @QueryParam : 查询参数. 客户端传参:url?id=10
  • @PathParam : 路径参数. 客户端传参:url/10
操作类型相关
  • @GET: 查询操作
  • @POST: 添加操作
  • @DELETE : 删除操作
  • @PUT: 修改操作

定区管理

定区添加

fixed_area.html

增加按键 绑定js方法 doAdd

{ id : 'button-add', text : '增加', iconCls : 'icon-add', handler : doAdd }

js方法是打开#addWindows窗口

function doAdd(){ 
    $('#addWindow').window("open"); }

窗口是个div #addWindow

// 添加、修改定区 $('#addWindow').window({ title: '添加修改定区', width: 600, modal: true, shadow: true, closed: true, height: 400, resizable:false });

div #addWindow里有个保存按钮 绑定submitDate js方法

<div class="easyui-window" title="区域添加修改" id="addWindow" collapsible="false" minimizable="false" maximizable="false" style="top:20px;left:200px"> <div region="north" style="height:31px;overflow:hidden;" split="false" border="false"> <div class="datagrid-toolbar"> <a id="save" onclick="submitDate()" icon="icon-save" href="#" class="easyui-linkbutton" plain="true">保存</a>

save方法 判断#areaForm表单 有没有填满 填满就提交

function submitDate(){ 
    if ($("#fixedAreaForm").form("validate")) { 
  //如果表单数据都输有了 $("#fixedAreaForm").submit();//就提交 } }

表单 提交 随便提供name=id的隐藏域

<form id="fixedAreaForm" method="post" action="../../fixedAreaAction_save.action"> <table class="table-edit" width="80%" align="center"> <tr class="title"> <td colspan="2">定区信息 <input type="hidden" name="id" /> </td> 

后台实现

AixedAreaAction

public class FixedAreaAction extends CommonAction<FixedArea> { 
    public FixedAreaAction() { super(FixedArea.class); } @Autowired private FixedAreaService fixedAreaService; @Action(value = "fixedAreaAction_save", results = { @Result(name = "success",location = "/pages/base/fixed_area.html", type = "redirect") }) public String save(){ fixedAreaService.save(getModel()); return SUCCESS; }

接口 void save(FixedArea fixedArea);

实现

 public void save(FixedArea fixedArea) { fixedRepository.save(fixedArea);

dao接口 public interface FixedRepository extends JpaRepository<FixedArea, Long> {

定区分页查询

// 定区数据表格 $('#grid').datagrid( { iconCls : 'icon-forward', fit : true, border : true, rownumbers : true, striped : true, pageList: [30,50,100], pagination : true, toolbar : toolbar, url : "../../fixedAreaAction_pageQuery.action", idField : 'id', columns : columns, onDblClickRow : doDblClickRow });

action

@Action(value = "fixedAreaAction_pageQuery") public String pageQuery() throws Exception{ Pageable pageable = new PageRequest(page-1, rows); Page<FixedArea>page= fixedAreaService.findAll(pageable); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{ 
  "subareas","couriers"});//忽略两个实体里字段 page2Json(page, jsonConfig); return NONE; }

接口 Page<FixedArea> findAll(Pageable pageable);

实现

 public Page<FixedArea> findAll(Pageable pageable) { return fixedRepository.findAll(pageable)

修改

function doEdit(){ 
    var result=$("#grid").datagrid("getSelections"); if (result.length==1) { $("#addWindow").window("open"); $("#subareaForm").form("load",result[0]); } else { $.messager.alert("温馨提示您","必须选也只能选 一个","info"); } }

CRM 服务端

基于CXF发CRM项目是以后台服务的形式运行, 所以不会有Web层 新建数据库crm

创建新的Maven项目crm, war 继承自common_parent项目

在web.xml中增加以下配置

web.xml 指定路径时 /webservice 注意大小写

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置Spring框架的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置CXF的Servlet --> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping> </web-app>

配置Spring的配置文件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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:task="http://www.springframework.org/schema/task" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:soap="http://cxf.apache.org/bindings/soap" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd "> <!-- ######################################################### 指定连接池配置 ######################################################### --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUrl" value="jdbc:oracle:thin:@PC5268-:1521:ORCL" /> <!-- **********************修改用户名和密码************************ --> <property name="user" value="CRM" /> <property name="password" value="crm" /> </bean> <!-- spring整合JPA --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- ######################################################### 指定要扫描的实体类所在的包 ######################################################### --> <!-- **********************修改包名************************ --> <property name="packagesToScan" value="com.xyz.crm.domain" /> <!-- 指定持久层提供者为Hibernate --> <property name="persistenceProvider"> <bean class="org.hibernate.ejb.HibernatePersistence" /> </property> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!-- 自动建表 --> <property name="generateDdl" value="true" /> <property name="database" value="ORACLE" /> <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="showSql" value="true" /> </bean> </property> <property name="jpaDialect"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> </property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- ######################################################### 指定Spring进行扫描的包,如果该包中的类使用了@Component @Controller@Service等注解,会把这些类注册为bean 不要扫描DAO !!!!DAO包下的类要使用Spring Data JPA框架进行扫描 ######################################################### --> <!-- **********************修改包名************************ --> <context:component-scan base-package="com.xyz.crm.service" /> <!-- 配置注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- ######################################################### 指定Spring Data JPA要进行扫描的包,该包中的类框架会自动为其创建代理 ######################################################### --> <!-- **********************修改包名************************ --> <jpa:repositories base-package="com.xyz.crm.dao" /> <!-- 发布webService --> <jaxrs:server address="/customerService"> <jaxrs:serviceBeans> <ref bean="customerServiceImpl" /> </jaxrs:serviceBeans> <jaxrs:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxrs:inInterceptors> <jaxrs:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxrs:outInterceptors> </jaxrs:server> </beans> 

在项目中新建com.itheima.crm.domain包,并将资料中的Customer

package com.itheima.crm.domain; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.xml.bind.annotation.XmlRootElement; @Entity @Table(name = "T_CUSTOMER") @XmlRootElement(name = "customer")//后面加的 public class Customer { 
    @Id @GeneratedValue() @Column(name = "C_ID") private Long id; // 主键id @Column(name = "C_USERNAME") private String username; // 用户名 @Column(name = "C_PASSWORD") private String password; // 密码 @Column(name = "C_TYPE") private Integer type; // 类型 @Column(name = "C_BRITHDAY") @Temporal(TemporalType.DATE) private Date birthday; // 生日 @Column(name = "C_SEX") private Integer sex; // 性别 @Column(name = "C_TELEPHONE") private String telephone; // 手机 @Column(name = "C_COMPANY") private String company; // 公司 @Column(name = "C_DEPARTMENT") private String department; // 部门 @Column(name = "C_POSITION") private String position; // 职位 @Column(name = "C_ADDRESS") private String address; // 地址 @Column(name = "C_MOBILEPHONE") private String mobilePhone; // 座机 @Column(name = "C_EMAIL") private String email; // 邮箱 @Column(name = "C_Fixed_AREA_ID") private String fixedAreaId; // 定区编码,逻辑外键 ...

在Eclipse的Servers视图中,右键 new name crm 把crm加入 双击修改 修改三个端口号 其它都不改

运行Server上 如果数据库中有新的数据表生成,说明基础环境搭建成功

拷贝资料中customer.sql文件的语句,向数据库中插入模拟数据

insert into T_CUSTOMER (C_ID, C_ADDRESS, C_BRITHDAY, C_COMPANY, C_DEPARTMENT, C_EMAIL, C_FIXED_AREA_ID, C_MOBILEPHONE, C_PASSWORD, C_POSITION, C_SEX, C_TELEPHONE, C_TYPE, C_USERNAME) values (10001, '北京市海淀区建材城西路金燕龙办公楼一层', to_date('01-07-1998', 'dd-mm-yyyy'), 'A公司', 'A部门', 'aaa@163.com', null, '0', '', '经理', 1, '', 1, '张伟'); insert into T_CUSTOMER (C_ID, C_ADDRESS, C_BRITHDAY, C_COMPANY, C_DEPARTMENT, C_EMAIL, C_FIXED_AREA_ID, C_MOBILEPHONE, C_PASSWORD, C_POSITION, C_SEX, C_TELEPHONE, C_TYPE, C_USERNAME) values (10002, '北京市海淀区建材城西路育新花园9号楼111', to_date('01-07-1998', 'dd-mm-yyyy'), 'B公司', 'B部门', 'bbb@163.com', null, '0', '', '经理', 1, '', 1, '王芳'); insert into T_CUSTOMER (C_ID, C_ADDRESS, C_BRITHDAY, C_COMPANY, C_DEPARTMENT, C_EMAIL, C_FIXED_AREA_ID, C_MOBILEPHONE, C_PASSWORD, C_POSITION, C_SEX, C_TELEPHONE, C_TYPE, C_USERNAME) values (10003, '北京市海淀区中关村海龙大厦1111', to_date('01-07-1998', 'dd-mm-yyyy'), 'C公司', 'C部门', 'ccc@163.com', null, '0', '', '经理', 1, '', 1, '李秀英'); insert into T_CUSTOMER (C_ID, C_ADDRESS, C_BRITHDAY, C_COMPANY, C_DEPARTMENT, C_EMAIL, C_FIXED_AREA_ID, C_MOBILEPHONE, C_PASSWORD, C_POSITION, C_SEX, C_TELEPHONE, C_TYPE, C_USERNAME) values (10004, '北京市海淀区中关村软件园国际软件大厦112', to_date('01-07-1998', 'dd-mm-yyyy'), 'D公司', 'D部门', 'ddd@163.com', null, '0', '', '经理', 1, '', 1, '李静'); 

发布服务

修改CRM项目中的com.itheima.crm.domain.Customer,增加@XmlRootElement(name = “customer”)注解

创建com.itheima.crm.service包 CustomerService接口

package com.itheima.crm.service; import java.util.List; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import com.itheima.crm.domain.Customer; @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public interface CustomerService { @GET @Path("/findAll") List<Customer> findAll(); // 查询未关联定区的客户 @GET @Path("/findCustomersUnAssociated") List<Customer> findCustomersUnAssociated(); // 查询已关联到指定定区的客户 @GET @Path("/findCustomersAssociated2FixedArea") List<Customer> findCustomersAssociated2FixedArea( @QueryParam("fixedAreaId") String fixedAreaId); // 定区ID,要关联的数据 // 根据定区ID,把关联到这个定区的所有客户全部解绑 // 要关联的数据和定区Id进行绑定 @PUT @Path("/assignCustomers2FixedArea") void assignCustomers2FixedArea( @QueryParam("customerIds") Long[] customerIds, @QueryParam("fixedAreaId") String fixedAreaId); } 

创建实现 com.itheima.crm.service.impl CustomerServiceImpl名

package com.itheima.crm.service.impl; import org.springframework.transaction.annotation.Transactional; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.itheima.crm.dao.CustomerRepository; import com.itheima.crm.domain.Customer; import com.itheima.crm.service.CustomerService; @Service @Transactional public class CustomerServiceImpl implements CustomerService { 
    @Autowired private CustomerRepository customerRepository; @Override public List<Customer> findAll() { return customerRepository.findAll(); } // 查询未关联定区的客户 @Override public List<Customer> findCustomersUnAssociated() { return customerRepository.findByFixedAreaIdIsNull(); } // 查询已关联到指定定区的客户 @Override public List<Customer> findCustomersAssociated2FixedArea( String fixedAreaId) { return customerRepository.findByFixedAreaId(fixedAreaId); } @Override public void assignCustomers2FixedArea(Long[] customerIds, String fixedAreaId) { // 根据定区ID,把关联到这个定区的所有客户全部解绑 if (StringUtils.isNotEmpty(fixedAreaId)) { customerRepository.unbindCustomerByFixedArea(fixedAreaId); } // 要关联的数据和定区Id进行绑定 if (customerIds != null && fixedAreaId.length() > 0) { for (Long customerId : customerIds) { customerRepository.bindCustomer2FixedArea(customerId, fixedAreaId); } } } }

创建com.itheima.crm.dao CustomerRepository接口

package com.itheima.crm.dao; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import com.itheima.crm.domain.Customer; public interface CustomerRepository extends JpaRepository<Customer, Long> { // 查询未关联定区的客户 List<Customer> findByFixedAreaIdIsNull(); // 查询已关联到指定定区的客户 List<Customer> findByFixedAreaId(String fixedAreaId); // 把关联到指定定区的客户进行解绑操作 @Query("update Customer set fixedAreaId = null where fixedAreaId = ?") @Modifying void unbindCustomerByFixedArea(String fixedAreaId); // 把客户绑定到指定的定区 @Query("update Customer set fixedAreaId = ?2 where id = ?1") @Modifying void bindCustomer2FixedArea(Long customerId, String fixedAreaId); } 

在applicationContext.xml中引入cxf的命名空间,并注册服务

<!-- 发布webService --> <jaxrs:server address="/customerService"> <jaxrs:serviceBeans> <ref bean="customerServiceImpl" /> </jaxrs:serviceBeans> <jaxrs:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean> </jaxrs:inInterceptors> <jaxrs:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean> </jaxrs:outInterceptors> </jaxrs:server>

启动服务器,并访问CXF的Servlet,如果能看到类似下面的内容,说明成功http://localhost:81/crm/service

关联客户 fixed_area.html

在关联客户页面显示数据

页面地址 : /pages/base/fixed_area.html

THE END

发表回复