今天是教育辦公系統(tǒng)的第一天,我本以為這個(gè)系統(tǒng)是一個(gè)全面些,功能強(qiáng)的項(xiàng)目。實(shí)際確實(shí)如此,功能強(qiáng)大、全面!但我們只需要完成其中的一小部分,核心的部分。其實(shí)想想,這么好的一個(gè)系統(tǒng),如果真把它做出來并通過測(cè)試,我估計(jì)至少需要二個(gè)月左右的時(shí)間。而我們只有9天的時(shí)間,這9天的時(shí)間將項(xiàng)目的核心部分學(xué)習(xí)一下還是相當(dāng)不錯(cuò)的。
其實(shí)在企業(yè)開發(fā)中,這種規(guī)模的項(xiàng)目是不可以由一個(gè)人來完成的。所以從這個(gè)角度考慮,我們學(xué)習(xí)的內(nèi)容還是相當(dāng)精致的。
佟老師今天先帶領(lǐng)大家把整個(gè)項(xiàng)目瀏覽了一遍,然后先出其中一個(gè)功能來做實(shí)踐——員工管理,其中涉及到員工信息、部門、簡(jiǎn)歷、出勤和權(quán)限管理。
一、搭建SSH框架
這個(gè)十分重要哦?自己如何才能搭建出SSH框架這取決于對(duì)SSH的工作流程的理解程度。這在以后工作中是十分重要的。在面試中極有可能被提出。搭建SSH框架已經(jīng)在上一次的日志中總結(jié)過了,今天再總結(jié)一下做個(gè)回顧。其實(shí)最好的學(xué)習(xí)方式就是動(dòng)手實(shí)踐。
1.向動(dòng)態(tài)WEB工程中添加struts:
1).jar文件:
如果一下子導(dǎo)入struts目錄下lib目錄中的所有Jar文件顯得自己像個(gè)新手。所以在struts的apps目錄下,為我們提供了一些例子程序。我們可以解壓縮這些例子程序中的某個(gè),然后將它所使用到的jar拷貝到自己的工程中:
“struts-extras-1.3.10.jar”這個(gè)jar包是特別導(dǎo)入的,這個(gè)jar包中包含DispatchAction、MappingDispatchAction等類型。
2).struts的配置文件:
同樣我們?cè)?/span>struts為我們提供的例子程序中拷貝所需要的配置文件:
struts-config.xml、validation.xml,還記得validation.xml嗎?在我們學(xué)習(xí)struts1的時(shí)候,它被用做表單校驗(yàn),是struts的一個(gè)插件。我們需要?jiǎng)h除這兩個(gè)配置文件中的大部分內(nèi)容,以后需要什么再添加。配置文件放在工程的config源碼目錄下。
我們拷貝過來的 struts-config.xml已經(jīng)將 validation.xml配置好了,所以將<plug-in className="org.apache.struts.validator.ValidatorPlugIn">注釋掉,但不要?jiǎng)h除。
同時(shí)將例子程序中的MessageResources.properties文件也拷貝進(jìn)來,這個(gè)文件用于為Action和validation插件提供錯(cuò)誤或警告信息等。
3).向web.xml中添加struts的ActionServlet,向WEB應(yīng)用中整合sturts。如果你忘記具體怎么配置了,也可以到Struts提供的例子程序中粘貼。
2.向工程中添加spring并與struts整合:
1).jar文件:
spring-framework-2.5.6.SEC01目錄下:dist\spring.jar、lib\c3p0\c3p0-0.9.1.2.jar、lib\cglib\cglib-nodep-2.1_3.jar、lib\jakarta-commons\commons-logging.jar、dist\modules\spring-webmvc-struts.jar、lib\aspectj\*.jar、lib\slf4j\*.jar、lib\log4j\log4j-1.2.15.jar。
2).spring的配置文件:
將工程添加到Spring環(huán)境。新建一個(gè)“Spring Bean Definition”的xml文件,命名為“applicationContext.xml”。配置文件放在工程的config源碼目錄下。
我們?yōu)榱耸钩绦蚯逦乐乖?applicationContext.xml文件中添加過多的內(nèi)容。所以又新建了 applicationContext-hibernate.xml和 applicationContext-beans.xml,然后在 applicationContext.xml文件中導(dǎo)入他們。
3).在web.xml中添加spring的監(jiān)聽器:
忘記怎么添加了?沒關(guān)系打開spring的手冊(cè),搜索listener,打開The ApplicationContext這一項(xiàng),在頁(yè)面的下方有如下內(nèi)容:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
|
OK,將它們拷貝到web.xml中。如果能把它們記在腦子里更好,不過JavaEE這么多東西,想把各細(xì)節(jié)都記到腦子里是一件很困難的事。
4).struts與spring整合:
向struts-config.xml添加controller。如果忘記怎么配置了,查看struts手冊(cè),搜索controller打開struts這一項(xiàng)。找到:
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>
|
之后,我們使用到的Bean全部在applicationContext-beans.xml文件中配置,包含ActionBean。
3.向工程中添加hibernate并與spring整合:
1).jar文件:
hibernate-distribution-3.3.2.GA目錄下:hibernate3.jar、lib\required\*.jar、lib\optional\ehcache\ehcache-1.2.3.jar。將工程中重復(fù)的jar文件刪除,保留高版的。還有mysql的JDBC驅(qū)動(dòng):
2).hibernate的配置文件:
“hibernate-distribution-3.3.2.GA\project\tutorials\web\src\main\resources\hibernate.cfg.xml”在這里可以拷貝到hibernate.cfg.xml文件。還有log4j.properties文件,也要添加到工程的config源碼目錄中。
3).hibernate與spring整合:
我們需要新建一個(gè)jdbc.properties文件,記錄hibernate的連接信息:
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///ccems
user=root
password=root
|
applicationContext-hibernate.xml文件內(nèi)容:
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
<!-- 導(dǎo)入配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 數(shù)據(jù)源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}" />
<property name="jdbcUrl" value="${jdbcUrl}" />
<property name="user" value="${user}" />
<property name="password" value="${password}" />
<property name="initialPoolSize" value="2" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="acquireIncrement" value="2" />
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- 配置事務(wù) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事務(wù)屬性 -->
<tx:advice id="ccemsTxAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 如果為查詢操作時(shí),使用只讀事務(wù) -->
<tx:method name="get*" read-only="true" />
<!-- 任何操作,不能超過30秒,否則回滾事務(wù)! -->
<tx:method name="*" timeout="30" />
</tx:attributes>
</tx:advice>
<!-- 配置事務(wù)的應(yīng)用 -->
<aop:config>
<aop:pointcut expression="execution(* com.ccems.*Service.*(..))"
id="ccemsTxPointCut" />
<aop:advisor advice-ref="ccemsTxAdvice" pointcut-ref="ccemsTxPointCut" />
</aop:config>
</beans>
|
OK,hibernate被整合到spring中了!
4.測(cè)試SSH框架
在index.jsp頁(yè)面添加一個(gè)”測(cè)試SSH“連接,指向TestAction。在TestAction中定義一個(gè)SessionFactory成員,通過Spring注入。在處理請(qǐng)求的方法中,獲取一個(gè)TestDao的Bean,使用hibernate保存到數(shù)據(jù)庫(kù)中。
點(diǎn)擊看看,是否測(cè)試通過?
二、創(chuàng)建實(shí)體
今天我們所使用到的實(shí)體是直接從例子程序中拷貝過來的,內(nèi)容非常多。我先不一一手動(dòng)的鍵入了,不過后天休息時(shí),我需要回頭復(fù)習(xí)一下。實(shí)體的UML圖:
三、登陸模塊
登陸模塊的重點(diǎn)在于登陸信息的校驗(yàn),分為前臺(tái)校驗(yàn)和后臺(tái)校驗(yàn)。前臺(tái)校驗(yàn)校驗(yàn)用戶輸入的登陸信息是否合法。后臺(tái)校驗(yàn)同樣需要校驗(yàn)用戶輸入的信息是否合法,因?yàn)榍芭_(tái)校驗(yàn)是能被繞過的。后臺(tái)校驗(yàn)還需要校驗(yàn)用戶輸入的合法信息,是否為注冊(cè)用戶且密碼正確。如果后臺(tái)校驗(yàn)通過,則登陸成功,否則失敗。
1.前臺(tái)校驗(yàn)
今日實(shí)現(xiàn)的前臺(tái)校驗(yàn)有兩種方式:
1).在頁(yè)面中添加JavaScript代碼進(jìn)行校驗(yàn):
// 去除空格
function trim(str){
var reg = /^(\s*)|(\s*)$/g;
return str.replace(reg, "");
}
$(function(){
$(":submit").click(function(){
var result = true;
var loginname = null;
// 遍歷用戶名框和密碼框
$(":input:not(:last)").each(function(){
var val = $(this).val();
// 去除首尾空格
val = trim(val);
// 取出標(biāo)簽名稱
var labelText = $(this).prev("b").text();
// 用戶名
if ($(this).is(":text")) {
loginname = val;
}
// 如果為空
if (val == null || val == "") {
alert(labelText + "不能為空!");
result = false;
}
else {
// 如果長(zhǎng)度小于6個(gè)字符
if (val.length < 6) {
alert(labelText + "不能少于6個(gè)字符!");
result = false;
}
}
});
// 前面的驗(yàn)證合法
if (result) {
var reg1 = /^[a-zA-Z]\w+\w$/gi;
// 是否包含非法字符
if (!reg1.test(loginname)) {
alert("用戶名不能包含特殊字符!");
result = false;
}
}
return result;
});
});
|
2).使用validation框架進(jìn)行校驗(yàn):
在struts-config.xml中添加的插件現(xiàn)在派上用場(chǎng)所了,validation.xml內(nèi)容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<formset>
<!-- 登陸表單 -->
<form name="loginForm">
<!-- 用戶名 ,depends是校驗(yàn)規(guī)則-->
<field property="loginname" depends="required,minlength,mask">
<!-- key對(duì)應(yīng)MessageResources.properties中的信息:用戶名 -->
<arg key="ccems.employee.login.loginname" />
<arg position="1" name="minlength" key="${var:minlength}"
resource="false" />
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]\w+\w$</var-value>
</var>
</field>
<!-- 密碼 ,depends是校驗(yàn)規(guī)則-->
<field property="loginpassword" depends="required,minlength">
<!-- key對(duì)應(yīng)MessageResources.properties中的信息:密碼 -->
<arg key="ccems.employee.login.loginpassword" />
<arg position="1" name="minlength" key="${var:minlength}"
resource="false" />
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
|
將struts-config.xml中的插件打開,它將為我們自動(dòng)完成校驗(yàn)!
2.后臺(tái)校驗(yàn)
后臺(tái)校驗(yàn)使用正則表達(dá)式進(jìn)行合法性校驗(yàn)。合法性校驗(yàn)通過后,根據(jù)用戶名讀取數(shù)據(jù)庫(kù),查看用戶是否存在。如果存在,則對(duì)比密碼。密碼正確,校驗(yàn)通過。
這個(gè)過程比較簡(jiǎn)單,但為了使提示信息顯示的更加詳細(xì)。比如,如果用戶名錯(cuò)了,我們提示用戶名錯(cuò)誤。如果用戶名正確了,密碼錯(cuò)誤了,我們提示密碼錯(cuò)誤。因?yàn)槲覀兪褂玫氖?/span>Struts框架來處理用戶請(qǐng)求的,如何更好的顯示這些信息?struts-config.xml的Action元素的子元素——exception可以幫助我們解決這個(gè)問題,我們?cè)?/span>Action處理方法(或Service方法)中根據(jù)不同情況拋出自定義的異常。Struts會(huì)自動(dòng)捕獲我們?cè)?/span>struts-config.xml文件中配置的異常,并返回相應(yīng)的錯(cuò)誤提示信息到頁(yè)面!
OK,這就不在此列出了!
佟佟今天最后講到了一個(gè)超級(jí)Bean,比湯兄弟還牛。他讓我們回來研究一下,明天講。我現(xiàn)在得研究去了...