1.2 项目前期

项目前期;一样平常是由客户经理从客户那边理解到有关该项目的招标信息,然后开拓公司再组织竞标;编写标书和详细的项目培植方案。
这个阶段一样平常由商务部门和开拓部门的管理层参与。
培植方案由部门经理或者项目经理帮忙完成。
项目培植方案中一样平常包括初步的系统功能、模块设计、软硬件设备、开拓组职员先容等。
供应这些信息给客户后他们再评估相应开拓公司是否有承建系统能力。

1.3 需求剖析

当项目中标后,公司的客户经理、项目经理再到客户环境进行详细的需求调研,完成调研后将初步的调研结果转化成正式的需求文档。
需求文档是所有后续流程的根本和非常主要的文档,开拓和测试都须要按照需求来开拓测试。
详细需求见《国税协同平台-纳税做事需求规格解释书.docx》

1.4 设计

在这个阶段紧张是针对需求进行详细的开拓前的剖析和对详细模块的设计。
在设计过程中可能包括到的有系统原型设计的完善、界面美工设计切图、数据库设计(观点、物理模型)等;终极须要出详细设计解释书。
见《国税协同平台-纳税做事详细设计解释书.docx》

jsp通过表单向表中添加记录十一天SSH项目快速实战课程第1天 Webpack

1.5 制订开拓操持

在需求和详细设计都已经确定的情形下;项目须要根据开拓的韶光和任务数来制订开拓操持;操持中须要描述所有的开拓阶段,从需求阶段到支配上线期间所有要做的任务,每个任务对应详细的开始韶光、结束韶光,前置任务,事情时长,资源名称。
后续的开拓都根据该操持进行在每周开周例会上确认开拓进度是否和操持保持同等,如果不一致则须要预测好相应方案;担保能准期提交系统给到客户。

1.6 开拓

根据开拓操持,项目经理将组织开拓团队完成详细的开拓任务,每周向公司部门、客户主管职员申报请示项目进度。
对应详细的开拓职员则熟习、理解需求,明白设计文档;按照操持中韶光点开拓功能,提交代码

2 框架整合2.1 新建数据库及web项目2.1.1 创建itcastTax数据库

-- 创建数据库

CREATE DATABASE itcastTax DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2.1.2 新建web项目

新建事情空间指定项目编码(或事情空间编码)为utf-8,再建 web project,配置buildpath

引入tomcat 的包:

如若对应的MyEclipse版本没有上述的“MyEclipse Server Library”;可以选择“My Eclipse Library”然后选择ee的包。

选择对应配置的tomcat版本即可。

添加jstl jar包和mysql驱动包;

2.2 框架整合2.2.1 添加struts2的jar包和配置文件

添加jar包:

commons-fileupload-1.3.1.jar,commons-io-2.2.jar,commons-lang-2.4.jar ,commons-lang3-3.2.jar,freemarker-2.3.19.jar,ognl-3.0.6.jar,struts2-core-2.x.jar

,struts2-spring-plugin-2.x.jar,xwork-core-2.x.jar 到web-inf/lib目录下。

添加struts.xml到src目录下。
可在“struts-2.x\apps\struts2-blank\WEB-INF\classes”下复制。

在struts.xml中添加几个常用属性:

<!-- 禁用动态方法访问 -->

<constant name=\公众struts.enable.DynamicMethodInvocation\"大众 value=\"大众false\"大众 />

<!-- 配置成开拓模式 -->

<constant name=\"大众struts.devMode\"大众 value=\"大众true\"大众 />

<!-- 配置拓展名为action -->

<constant name=\"大众struts.action.extention\"大众 value=\公众action\"大众 />

<!-- 把主题配置成simple -->

<constant name=\"大众struts.ui.theme\"大众 value=\公众simple\公众 />

配置web.xml:添加struts2 过滤器:

<filter>

<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>.action</url-pattern>

</filter-mapping>

2.2.2 添加hibernate的jar包和配置文件

添加hibernate jar包:

hibernate3.jar,lib/required/.jar,lib\jpa\hibernate-jpa-2.0-api-1.0.0.Final.jar,lib\bytecode\cglib\cglib-2.2.jar到web-inf/lib目录下。

至于hibernate.cfg.xml文件,因项目利用spring来整合管理实体和数据库的连接等hibernate原来的事情,以是这个配置文件不再须要。

2.2.3 添加spring的jar包和配置文件

添加spring3.0.2中的jar包:

添加spring配置文件applicationContext.xml 到src目录下;

在web.xml中注册spring监听器,启动spring容器:

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

2.3 整合测试项目2.3.1 整合struts 和 spring

预期:如果可以在action中能够精确调用service里面的方法实行并返回到一个页面中;那么我们认定struts和spring的整合是成功的。

编写JUnit测试类,测试spring加载是否精确:

编写 TestService 接口 和实现类 TestServiceImpl

在applicationContext.xml中添加bean扫描配置信息;这边利用导入配置文件的办法配置。
①首先在cn.itcast.test.conf中建立test-spring.xml,里面内容:

<!-- service -->

<context:component-scan base-package=\公众cn.itcast.test.service.impl\公众 />

里面的配置便是普通的bean扫描,只是将扫描范围缩小了。

②将test-spring.xml导入到applicationContext.xml中如下:

<import resource=\"大众classpath:cn/itcast//conf/-spring.xml\"大众 />

编写TestAction类

在test的conf文件夹下新建test-struts.xml中配置TestAction :

<struts>

<package name=\"大众test\"大众 namespace=\公众/\"大众 extends=\"大众struts-default\"大众>

<action name=\公众test_\"大众 class=\公众cn.itcast.test.action.TestAction\公众 method=\公众{1}\"大众>

<result name=\"大众success\"大众>/WEB-INF/jsp/test/test.jsp</result>

</action>

</package>

</struts>

将test-struts.xml导入到struts.xml文件中。

<include file=\"大众cn/itcast/test/conf/test-struts.xml\"大众/>

在webRoot目录下新建test/test.jsp

在浏览器中输入:http://localhost:8080/itcastTax/test.action 查看后台是否能输入service中的打印信息。

2.3.2 整合hibernate 和 spring

在applicationContext.xml中配置如下原来在hibernate.cfg.xml中须要配置的信息,在spring中配置后hibernate.cfg.xml 可删除。

1、 配置c3p0数据库连接源:

<!-- 导入外部的properties配置文件 -->

<context:property-placeholder location=\公众classpath:db.properties\公众 />

<!-- 配置c3p0数据源 -->

<bean id=\公众dataSource\"大众 class=\公众com.mchange.v2.c3p0.ComboPooledDataSource\"大众 destroy-method=\"大众close\"大众>

<property name=\"大众jdbcUrl\公众 value=\"大众${jdbcUrl}\公众></property>

<property name=\"大众driverClass\"大众 value=\"大众${driverClass}\公众></property>

<property name=\"大众user\"大众 value=\公众${user}\"大众></property>

<property name=\公众password\公众 value=\公众${password}\公众></property>

<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。
Default: 3 -->

<property name=\"大众initialPoolSize\"大众 value=\"大众${initialPoolSize}\"大众></property>

<!--连接池中保留的最小连接数。
Default: 3 -->

<property name=\"大众minPoolSize\"大众 value=\"大众3\公众></property>

<!--连接池中保留的最大连接数。
Default: 15 -->

<property name=\公众maxPoolSize\"大众 value=\"大众${maxPoolSize}\"大众></property>

<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。
Default: 3 -->

<property name=\"大众acquireIncrement\公众 value=\公众3\"大众></property>

<!--最大空闲韶光,1800秒内未利用则连接被丢弃,若为0则永不丢弃。
Default: 0 -->

<property name=\公众maxIdleTime\公众 value=\"大众1800\"大众></property>

</bean>

2、 db.properties

jdbcUrl=jdbc:mysql://localhost:3306/itcastTax?useUnicode=true&characterEncoding=utf8

driverClass=com.mysql.jdbc.Driver

user=root

password=root

initialPoolSize=10

maxPoolSize=30

3、 配置sessionFactory,并将dataSource指向c3p0创建的dataSource:

<bean id=\"大众sessionFactory\"大众

class=\"大众org.springframework.orm.hibernate3.LocalSessionFactoryBean\公众>

<property name=\"大众dataSource\"大众 ref=\公众dataSource\"大众></property>

<property name=\"大众hibernateProperties\"大众>

<props>

<prop key=\"大众hibernate.dialect\"大众>org.hibernate.dialect.MySQL5Dialect</prop>

<prop key=\公众hibernate.show_sql\公众>true</prop>

<prop key=\"大众hibernate.hbm2ddl.auto\公众>update</prop>

<prop key=\公众javax.persistence.validation.mode\"大众>none</prop>

</props>

</property>

<property name=\"大众mappingLocations\"大众>

<list>

<value>classpath:cn/itcast/nsfw//entity/.hbm.xml</value>

<value>classpath:cn/itcast/test/entity/.hbm.xml</value>

</list>

</property>

</bean>

编写实体类Person和对应的映射文件Person.hbm.xml:

映射文件的头部信息:

<?xml version=\"大众1.0\"大众 encoding=\"大众utf-8\"大众?>

<!DOCTYPE hibernate-mapping PUBLIC \"大众-//Hibernate/Hibernate Mapping DTD 3.0//EN\公众

\公众http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd\"大众>

编写完实体映射文件后,用JUnit测试hibernate和spring的整合,在测试用例中启动spring容器的时候将扫描Person类根据其创建数据库表,并在测试时将向表插入一条数据。

测试hibernate,添加一个人员

测试框架分层的整合(service 与 dao)

TestDao 中新增方法 save ,在TestService中通过调用testDao来保存职员信息。

2.3.3 配置spring事务管理

<!—事务管理-->

<bean id=\"大众txManager\"大众

class=\"大众org.springframework.orm.hibernate3.HibernateTransactionManager\"大众>

<property name=\"大众sessionFactory\"大众 ref=\"大众sessionFactory\公众 />

</bean>

<!—事务关照-->

<tx:advice id=\公众txAdvice\公众 transaction-manager=\"大众txManager\"大众>

<tx:attributes>

<tx:method name=\公众find\"大众 read-only=\"大众true\公众 />

<tx:method name=\"大众get\"大众 read-only=\公众true\"大众 />

<tx:method name=\公众load\"大众 read-only=\"大众true\"大众 />

<tx:method name=\"大众list\"大众 read-only=\"大众true\公众 />

<tx:method name=\"大众search\"大众 read-only=\"大众true\"大众 />

<tx:method name=\"大众\公众 rollback-for=\"大众Throwable\公众 />

</tx:attributes>

</tx:advice>

<!—配置须要进行事务掌握的类 -->

<aop:config>

<aop:pointcut id=\"大众serviceOperation\"大众 expression=\"大众bean(Service)\"大众 />

<aop:advisor advice-ref=\"大众txAdvice\"大众 pointcut-ref=\"大众serviceOperation\"大众 />

</aop:config>

【把稳:上面的pointcut expression 表示拦截以Service结尾的bean,或者可写成

execution( cn.itcast..service.impl..(..))】

完善 TestService接口和TestServiceImpl;利用service中的操作来验证上面配置的事务管理是否生效。

测试方法

Dao中

Service中

2.4 资源文件分类

1、 将配置文件归类到新建config文件夹;

2、 源代码目录按照功能模块进行划分:cn.itcast.子系统.功能模块.

3、 Jsp放置到WEB-INF目录下;

4、 其它:

2.5 日志工具配置

在掌握台会报出日志log4j没有配置好配置文件的信息。

Slf4j 接口jar(slf4j-log4j12-1.6.1.jar)

log4j的jar包(com.springsource.org.apache.log4j-1.2.15),配置log4j.properties文件。

测试:

2.6 编写基类BaseDao

DAO基类中配备增编削查的操作。

获取泛型类型:

// 利用反射得到T的真实类型

ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的工具的 泛型的父类 类型

this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型

}

3 用户管理3.1 实现CRUD的步骤及用户实体映射文件

1、 用户实体类及映射文件:Usre.java 和 User.hbm.xml

2、 实现UserDao、UserDaoImpl,直接继续BaseDao、BaseDaoImpl;

3、 编写UserService、UserService类,里面包括baseDao中的基本方法;

4、 UserAction中要实现增编削查,须要6个方法;我们约定须要跳转到页面的方法以UI结尾,如果addUI 则解释这是跳转到添加页面,须要对应一个addUI.jsp。
在删除、修正、添加完成后该当返回列表页面,这时为了避免重复提交返回利用重定向。

配置user-spring.xml,并将其导入到applicationContext.xml中,然后在applicatoinContext.xml中设置所有业务dao的父类dao,为baseDao中的HibernateDaoSupport注入sessionFactory。

在user-spring.xml中的内容:

3.2 实现用户管理的CRUD方法及显示列表

在UserAction中至少须要有的6个方法:

listUI() --- 返回到列表页面对应listUI.jsp

addUI() --- 返回到添加页面对应addUI.jsp

add() --- 重定向到listUI

edit() --- 重定向到listUI

editUI() --- 返回到编辑页面对应editUI.jsp

delete() --- 删除用户完后重定向到listUI

设置完action后,配置user-struts.xml文件,里面对应各个方法对应的页面;末了将user-struts.xml包含到struts.xml文件中。

接下来引入美工设计好的页面;将数据与页面结合展示。

3.3 完成美工设计页面显示

将美工设计好的页面复制到项目中:

将js、css、image、分别放置到WebRoot目录下;其它的jsp对应复制。
复制完成后针对jsp页面添补动态数据。

对应大多数页面样式和jquery都是须要的,以是我们把公共样式和jquery、struts标签库等信息抽出到一个header.jsp文件中,将此文件放入common公共文件目录。

3.4 批量删除

在用户列表listUI.jsp中设置好复选框<input type=\公众checkbox\公众 name=\"大众selectedRow\"大众 value='<s:property value=\公众id\公众/>'/> ,点击操作栏中的删除实行js脚本提交用户列表表单到后台UserAction,在action中利用数组吸收勾选的用户id,然后在对该数组进行遍历删除。

Js脚本:

3.5 日期组件wdatepicker

导入WdataPicker文件包到项目的js文件夹下;

在用户管理中的添加、编辑jsp页面对生日表单项引入日期组件:

<script type=\公众text/javascript\"大众 src=\"大众${basePath}js/datepicker/WdatePicker.js\"大众></script>

用法:

<s:textfield id=\公众birthday\"大众 name=\公众user.birthday\公众 readonly=\"大众true\"大众

onfocus=\"大众WdatePicker({skin:'whyGreen', el:'birthday',dateFmt:'yyyy-MM-dd'})\"大众/>

回显时,把稳设置好显示格式;可以如下设置:

<s:textfield id=\"大众birthday\"大众 name=\"大众user.birthday\"大众 readonly=\"大众true\"大众

onfocus=\公众WdatePicker({skin:'whyGreen', el:'birthday',dateFmt:'yyyy-MM-dd'})\"大众>

<s:param name=\公众value\公众><s:date name='user.birthday' format='yyyy-MM-dd' /></s:param>

</s:textfield>