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-20140727: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@qq.com" /在windows用户目录C:\Users\Administrator\.ssh/id_rsa.pub复制里面的密钥放到github里面去/bash.exe里再打命令ssh-keygen -t rsa -C "loveyouluobin@qq.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-20140727: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, '01012345671', '123456', '经理', 1, '13602345259', 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, '01012345672', '123456', '经理', 1, '13211701470', 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, '01012345673', '123456', '经理', 1, '13642053585', 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, '01012345674', '123456', '经理', 1, '13411899625', 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