基于ssm框架的绩效管理系统
技術(shù)選型:mybatis,spring,springMVC,quartz,oracle
功能模塊:績效匯報表的查詢、填寫、審批;郵件的發(fā)送;定時任務(wù)
工作流程:員工填寫完績效匯報表,提交后,系統(tǒng)發(fā)送郵件給主管,提醒主管及時審批,當(dāng)主管審批完績效匯報表后,系統(tǒng)發(fā)送郵件給填寫該績效匯報表的員工,提醒員工查看審批結(jié)果,若審批通過,則無需處理;若審批不通過,則該員工需修改績效匯報表等待再次審批。發(fā)送失敗的郵件會被記錄,系統(tǒng)會每30min查詢是否有發(fā)送失敗的郵件并發(fā)送。
在系統(tǒng)開發(fā)時遇到的問題如下:
1.在spring-mybatis的整合xml文件中,若數(shù)據(jù)庫需要從properties動態(tài)取值
直接刪掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
注意:在沒有配置這一行時,必須配置一個以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。
2.不支持org.springframework.jdbc.datasource.DriverManagerDataSource數(shù)據(jù)源嗎?
當(dāng)修改為org.apache.commons.dbcp.BasicDataSource數(shù)據(jù)源時編譯成功。
反正我當(dāng)時是報錯了,另外查了一下,這個數(shù)據(jù)源沒有用到連接池,推薦的也是下面這種呢
3.mybatis從數(shù)據(jù)庫查詢到數(shù)據(jù),超級智能的,我這里試過修改構(gòu)造器,刪除get、set方法,他依然能獨處數(shù)據(jù),究竟是采用的什么詭異的方法?
根據(jù)測試結(jié)果寫入采用的是構(gòu)造器的方式。
4.Oracle數(shù)據(jù)庫自增序列:
create sequence table_autoincminvalue 1maxvalue 9999999999start with 1increment by 1nocycle 觸發(fā)器: create or replace trigger insert_table_autoincbefore insert on PerformanceTablefor each rowbeginselect table_autoinc.nextval into :new.PerformanceId from dual;end;實現(xiàn)數(shù)據(jù)表中ID的自增,即使你輸入了ID值,也會被序列值取代。
5.當(dāng)jsp有頁面請求時,例如src="${pageContext.request.contextPath }/js/checkCode.js"。
這時,我們需在springmvc配置文件聲明默認(rèn)的servlet。
<mvc:default-servlet-handler/>
否則,他會去controller中尋找對應(yīng)requestmapping,然后報錯。
6、textaera的換行問題
問題出在EL表達(dá)式中,在js中使用EL表達(dá)式會不能正確獲得參數(shù),導(dǎo)致錯誤顯示內(nèi)容。
采用隱藏域的方式獲取后臺傳來的值,替代EL表達(dá)式。
經(jīng)過測試,textaera里面的換行似乎也是使用的\n。
7.在頁面中使用EL表達(dá)式:
若在jsp頁面中,可以直接使用,但是要加引號,因為js的數(shù)據(jù)類型和EL表達(dá)式的數(shù)據(jù)類型不匹配,加上引號則會將EL表達(dá)式的內(nèi)容轉(zhuǎn)換成String類型,所以當(dāng)EL表達(dá)式的值為null,false,true這些關(guān)鍵字時,其也是以String類型存在的。
若在js文件中使用,目前還沒有找到很好的辦法,但我的解決思路是在jsp頁面獲取其值,然后存入input的hidden域中,在js文件中就可以直接調(diào)用。
8.EL表達(dá)式獲取不到值時若為字符串則為空串,而<%=%>獲取不到值時,若為字符串則為null。
9.郵件發(fā)送
郵件的發(fā)送我最開始用的126的服務(wù)器,查詢錯誤信息,發(fā)現(xiàn)服務(wù)器一直將我發(fā)送的郵件當(dāng)垃圾郵件處理而發(fā)送失敗。
當(dāng)我使用公司的exchange服務(wù)器的時候,發(fā)送郵件才成功,但是在一段時間內(nèi)發(fā)送郵件有數(shù)量限制。
我的發(fā)送郵件的方法是一個靜態(tài)方法,當(dāng)我用quartz來執(zhí)行這個靜態(tài)方法的時候,總是導(dǎo)致我的tomcat重啟,問題很詭異,還沒有找到原因。
我把發(fā)送郵件的方法修改為普通方法之后問題解決。
<!-- 郵件發(fā)送器 --><bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value="${mail.host}" /><property name="username" value="${mail.username}" /><property name="password" value="${mail.password}" /><property name="defaultEncoding" value="UTF-8"></property><property name="javaMailProperties"><props><prop key="mail.smtp.auth">${mail.smtp.auth}</prop><prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop><prop key="mail.smtp.port">${mail.smtp.port}</prop></props></property></bean>@Component public class MailSend {@Autowiredprivate JavaMailSender mailSender;public void send(Mail mail) {JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();MimeMessage mailMsg = senderImpl.createMimeMessage();try {MimeMessageHelper messageHelper = new MimeMessageHelper(mailMsg, true, "utf-8");// 接受者messageHelper.setTo(mail.getRecipient());// 發(fā)送者messageHelper.setFrom("huangjiangbo@jlpay.com");// 主題messageHelper.setSubject(mail.getSubject());// 郵件內(nèi)容,注意加參數(shù)true,表示啟用html格式messageHelper.setText(mail.getContent(), true);mailSender.send(mailMsg);} catch (MessagingException e) {e.printStackTrace();}}}
10.線程池相關(guān)。
因為涉及到發(fā)送郵件功能,該功能可能非常耗時,我決定為其開辟線程執(zhí)行該功能。
<!-- 異步線程池 --><bean id="threadPoolTaskExecutor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><!-- 核心線程數(shù) --><property name="corePoolSize" value="${corePoolSize}" /><!-- 最大線程數(shù) --><property name="maxPoolSize" value="${maxPoolSize}" /><!-- 隊列最大長度 >=mainExecutor.maxSize --><property name="queueCapacity" value="${queueCapacity}" /><!-- 線程池維護線程所允許的空閑時間 --><property name="keepAliveSeconds" value="${keepAliveSeconds}" /><property name="rejectedExecutionHandler"><!-- AbortPolicy:直接拋出java.util.concurrent.RejectedExecutionException異常 --><!-- CallerRunsPolicy:主線程直接執(zhí)行該任務(wù),執(zhí)行完之后嘗試添加下一個任務(wù)到線程池中,可以有效降低向線程池內(nèi)添加任務(wù)的速度 --><!-- DiscardOldestPolicy:拋棄舊的任務(wù)、暫不支持;會導(dǎo)致被丟棄的任務(wù)無法再次被執(zhí)行 --><!-- DiscardPolicy:拋棄當(dāng)前任務(wù)、暫不支持;會導(dǎo)致被丟棄的任務(wù)無法再次被執(zhí)行 --><bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /></property></bean>mailThread繼承了Thread類,在run方法中發(fā)送郵件,發(fā)送郵件相關(guān)的類我都是通過構(gòu)造器傳入的。
taskExecutor是注入的上面寫的bean。
lfcs是我繼承ListenableFutureCallback<Boolean>接口后重寫了onsuccess和onFailure方法,很顯然,你可以把你想要處理線程正常完成或者拋出異常的內(nèi)容寫在里面。
所以最關(guān)鍵的一行代碼是futureTask.addCallback(lfcs)
@SuppressWarnings("unchecked")public void sendMail(Mail mail) {Thread mailThread = new MailThread(mail, mailSend);lfcs.setMail(mail);ListenableFutureTask<Boolean> futureTask = (ListenableFutureTask<Boolean>) taskExecutor.submitListenable(mailThread);futureTask.addCallback(lfcs);}11、filter如果要引用bean的情況。攔截器中是可以通過@autowire來獲取的。
作者:容偉新鏈接:https://www.zhihu.com/question/22977026/answer/23317656
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
眾所周知,web應(yīng)用啟動的順序是:listener->filter->servlet,而因為項目應(yīng)用了spring mvc,所以我們會有兩個配置文件(applixationContext.xml和springMVC-sevlet.xml),我們在配置spring時會用到spring的listener,它會讀取application.xml里的配置對spring context進(jìn)行初始化;而springMVC-servlet.xml則是在spring mvc的dispathServlet啟動的時候讀取進(jìn)行配置。而如果項目里用到了注解,則需要在springMVC-servlet.xml中加上“”。ok,經(jīng)過上面的鋪墊后,進(jìn)入重點。問題就是項目啟動時,先初始化listener,因此配置在applicationContext.xml里的bean會被初始化和注入;然后再來就filter的初始化,再接著才到我們的dispathServlet的初始化,因此,當(dāng)我們需要在filter里注入一個注解的bean時,就會注入失敗,因為filter初始化時,注解的bean還沒初始化,沒法注入。所以,如果想要在filter里注入注解bean的話,就要在applicationContext.xml里配置context,也就是上面說的那句配置。在這里配置時需要注意的是,需要把tx和aop的配置放在最下面,否則也會導(dǎo)致spring的context初始化失敗。把配置弄好之后,我們就在filter的init方法里,通過獲取webApplicationContext的getBean方法對需要的bean進(jìn)行注入。以上是個人折騰了很久后的總結(jié),希望能幫助到同樣遇到這問題的小伙伴們……
12、開發(fā)環(huán)境和服務(wù)器環(huán)境使用一樣的JDK,不然會出現(xiàn)任務(wù)的class not found。
總結(jié)
以上是生活随笔為你收集整理的基于ssm框架的绩效管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 学习13——Vue元素过渡
- 下一篇: 【牛客】中国牛市