bos物流系统

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值