視頻地址: 基於SSH實現員工管理系統之案例實現篇
javascript
個人整個完整源碼地址 : 點擊進入 githubcss
這是SSH 整合項目的第二章,第一章基於Meavn 整合 Spring 和 Hibernate 框架並進行了進行了自動建表,這一章則在此基礎上加入 Struts 2 框架以及完成一個簡單的登錄頁面。
html
1. 配置 Struts 2
java
選中 Project Struts <---- Modules 的 Web 後,點擊 2號位 「+」 添加 Struts 2 後點3號位 「+」 將其中的兩個文件都添加進去。(不加這兩個文件,會在Struts 的配置文件中看到很是多的不識別,不影響程序運行,但很不美觀。)
git
在 resources 中新建一個
github
而後在 web.xml 添加 struts 2 過濾器web
<!-- 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>/*</url-pattern> </filter-mapping>
2.導入頁面素材並進行更改
spring
此時,去編寫login.jsp ,由於界面是老師提供好的,因此我直接全部的jsp和相關文件都傳到百度雲上了 「點擊打開百度雲」 , 密碼爲:li9j數據庫
下載後直接複製到 web 目錄下,將 login.html 中的內容直接複製到login.jsp,,而後照着下面這份代碼進行修改,須要修改的地方已經寫上註釋apache
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%-- 將聲明頭更改成jsp 的聲明頭文件 ,而且增長一個標籤庫, 控制標籤能夠完成輸出流程控制,例如分支,循環等操做,也能夠完成對集合的合併,排序等操做。(具體用法建議 百度) --%> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8"> <title>登錄</title> <link type="text/css" rel="stylesheet" href="style/reset.css"> <link type="text/css" rel="stylesheet" href="style/main.css"> <!--[if IE 6]> <script type="text/javascript" src="js/DD_belatedPNG_0.0.8a-min.js"></script> <script type="text/javascript" src="js/ie6Fixpng.js"></script> <![endif]--> </head> <body> <div class="headerBar"> <div class="logoBar login_logo"> <div class="comWidth"> <div class="logo fl"> <a href="#"><img src="images/logo.jpg" alt="慕課網"></a> </div> <h3 class="welcome_title">歡迎登錄</h3> </div> </div> </div> <s:form action="employee_login" method="post" namespace="/"> <%-- <s:form action="login" namespace="/"> 它表示的是<form id="login" name="login" action="login.action" method="post"> 由於它使用了struts標籤,後面會自動加「.action」,並且namespace會起做用 employee_login將在 struts 2的配置文件中 struts.xml 中被配置 --%> <div class="loginBox"> <h3><s:actionerror/></h3> <%--輸出登錄失敗的錯誤信息,將在Action的login()方法被賦值,null時不顯示--%> <div class="login_cont"> <ul class="login"> <li class="l_tit">用戶名</li> <li class="mb_10"><input type="text" name="username" class="login_input user_icon"></li> <%--添加了 name = "username"--%> <li class="l_tit">密碼</li> <li class="mb_10"><input type="password" name="password" class="login_input user_icon"></li> <%--更改 type="password", 添加了 name = "password" ……END……--%> <li><input type="submit" value="" class="login_btn"></li> </ul> <div class="login_partners"> <p class="l_tit">使用合做方帳號登錄網站</p> <ul class="login_list clearfix"> <li><a href="#">QQ</a></li> <li><span>|</span></li> <li><a href="#">網易</a></li> <li><span>|</span></li> <li><a href="#">新浪微博</a></li> <li><span>|</span></li> <li><a href="#">騰訊微薄</a></li> <li><span>|</span></li> <li><a href="#">新浪微博</a></li> <li><span>|</span></li> <li><a href="#">騰訊微薄</a></li> </ul> </div> </div> </div> </s:form> <div class="hr_25"></div> <div class="footer"> <p><a href="#">慕課簡介</a><i>|</i><a href="#">慕課公告</a><i>|</i> <a href="#">招納賢士</a><i>|</i><a href="#">聯繫咱們</a><i>|</i>客服熱線:400-675-1234 </p> <p>Copyright © 2006 - 2014 慕課版權全部 京ICP備09037834號 京ICP證B1034-8373號 某市公安局XX分局備案編號:123456789123</p> <p class="web"><a href="#"><img src="images/webLogo.jpg" alt="logo"></a><a href="#"><img src="images/webLogo.jpg" alt="logo"></a><a href="#"><img src="images/webLogo.jpg" alt="logo"></a><a href="#"><img src="images/webLogo.jpg" alt="logo"></a></p> </div> </body> </html>
3.明確業務邏輯
而後新建一些類,如圖所示。(業務邏輯爲: jsp點擊後 ———> web.xml 中配置的攔截器--------> 查詢struts.xml,將攔截到的信息發給 EmployeeAction.java 負責與struts.xml 聯繫。-------->EmployeeServiceImpl.java實現業務邏輯(實現EmoployeeService.java 接口) --------------> EmployeeDaoImpl.java 實現操做數據庫(實現EmployeeDao.java) )
4.基於業務邏輯實現登錄界面的功能。
而後進入 struts.xml 文件中進行攔截,使用戶輸入的信息被判斷後跳轉。
那麼,我先配置web.xml 中增長struts 的攔截器.在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>/*</url-pattern> </filter-mapping>struts.xml更改後爲:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts><!--增長包-->
<package name="ssh" extends="struts-default" namespace="/"> <action name="employee_*" class="com.test.ssh.action.EmployeeAction" method="{1}"> <result name="input">/login.jsp</result> <!--返回值爲"input"時,跳轉至login.jsp,並經過login.jsp中的s:actionerror 告訴用戶錯誤信息--> <result name="success" type="redirect">/frame.jsp</result> <!--返回值爲「success」時,跳轉到管理界面--> </action> </package> </struts>EmployeeAction.java 改成:
package com.test.ssh.action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.test.ssh.domain.Employee; public class EmployeeAction extends ActionSupport implements ModelDriven<Employee> { //模型驅動使用的對象 private Employee employee = new Employee(); public String login() { return "success"; } @Override public Employee getModel() { return employee; } public void setEmployee(Employee employee) { this.employee = employee; } }而後運行測試,進入login.jsp 頁面,直接點擊,若是跳轉進入了管理系統,則struts 配置成功
而後進行登錄功能的實現。
咱們已經在 login.jsp中實現了跳轉功能,web.xml中也已經使用了struts的攔截器,
因此開始寫服務器端的 login方法。
EmployeeAction.java 改成: login成功返回「success」,失敗返回「input」,並將失敗緣由改寫:「用戶或密碼錯誤」
package com.test.ssh.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.test.ssh.domain.Employee; import com.test.ssh.service.EmployeeService; public class EmployeeAction extends ActionSupport implements ModelDriven<Employee> { //模型驅動使用的對象 private Employee employee = new Employee(); //進入業務層類 private EmployeeService employeeService; public String login() { //此時,還未定義public Employee login(Employee employee)方法,會有報錯 Employee existEmployee = employeeService.login(employee); if(existEmployee == null){ //方法返回值爲空,登錄失敗 this.addActionError("用戶名或密碼錯誤"); return INPUT; }else { //成功查詢並返回,登錄成功 ActionContext.getContext().getSession().put("existEmployee",existEmployee); return SUCCESS; } } @Override public Employee getModel() { return employee; } //Employee 和 EmployeeService 的 setter,可使 Spring 進行注入 public void setEmployee(Employee employee) { this.employee = employee; } public void setEmployeeService(EmployeeService employeeService) { this.employeeService = employeeService; } }
在Action 層調用了 Service 層的 login 函數,先在接口 EmployeeService.java 中定義
public Employee login(Employee employee);而後再在接種的實現類EmployeeServiceImpl.java 中實現這個方法
EmployeeServiceImpl.java
package com.test.ssh.service.impl; import com.test.ssh.dao.impl.EmployeeDaoImpl; import com.test.ssh.domain.Employee; import com.test.ssh.service.EmployeeService; public class EmployeeServiceImpl implements EmployeeService{ //先進行對 EmployeeDao 的注入 private EmployeeDaoImpl employeeDao; @Override public Employee login(Employee employee) { return employeeDao.login(employee); } public void setEmployeeDao(EmployeeDaoImpl employeeDao) { this.employeeDao = employeeDao; } }同理,在Dao和DaoImpl中分別修改
EmployeeDao.java
package com.test.ssh.dao; import com.test.ssh.domain.Employee; public interface EmployeeDao { public Employee login(Employee employee); }EmployeeDaoImpl.java
package com.test.ssh.dao.impl; import com.test.ssh.dao.EmployeeDao; import com.test.ssh.domain.Employee; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import java.util.List; /** * 這裏繼承了HibernateDaoSupport,該類主要提供兩個方法,方便 DAO 的實現 * public final void setSessionFactory(SessionFactory sessionFactory) * 用來接收Spring的ApplicationContext的依賴注入 * public final HibernateTemplate getHibernateTemplate() * 用來根據剛纔的SessionFactory產生Session,最後生成HibernateTemplate來完成數據庫訪問。 */ public class EmployeeDaoImpl extends HibernateDaoSupport implements EmployeeDao{ @Override public Employee login(Employee employee) { String hql = "FROM Employee WHERE username = ? AND password = ?"; List<Employee> list = this.getHibernateTemplate().find(hql, employee.getUsername(), employee.getPassword()); if (list.size() > 0) { return list.get(0); } return null; } }
在<beans></beans>中添加如下代碼
<!--配置 Struts Actionl欸 Bean,,,Scope 爲Prototype --> <bean id="employeeAction" class="com.test.ssh.action.EmployeeAction" scope="prototype"> <property name="employeeService" ref="employeeService"/> </bean> <bean id="employeeService" class="com.test.ssh.service.impl.EmployeeServiceImpl"> <property name="employeeDao" ref="employeeDao"/> </bean> <bean id="employeeDao" class="com.test.ssh.dao.impl.EmployeeDaoImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean>而後在數據庫中添加一條數據
而後運行,在登錄界面輸入「test」,"000000"便可跳轉而且在控制檯輸出一大堆Sql 語句。