IDEA 下寫出第一個 SSH 整合框架練手專案(二,整合SSH及登陸頁面的完成)
這是SSH 整合專案的第二章,第一章基於Meavn 整合 Spring 和 Hibernate 框架並進行了進行了自動建表,這一章則在此基礎上加入 Struts 2 框架以及完成一個簡單的登陸頁面。
1. 配置 Struts 2
選中 Project Struts <---- Modules 的 Web 後,點選 2號位 “+” 新增 Struts 2 後點3號位 “+” 將其中的兩個檔案都新增進去。(不加這兩個檔案,會在Struts 的配置檔案中看到非常多的不識別,不影響程式執行,但很不美觀。)
在 resources 中新建一個
然後在 web.xml 新增 struts 2 過濾器
<!-- 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.匯入頁面素材並進行更改
此時,去編寫login.jsp ,因為介面是老師提供好的,所以我直接所有的jsp和相關檔案都傳到百度雲上了 “點選開啟百度雲” , 密碼為:li9j
下載後直接複製到 web 目錄下,將 login.html 中的內容直接複製到login.jsp,,然後照著下面這份程式碼進行修改,需要修改的地方已經寫上註釋
<%@ 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;
}
}
最後,配置applicationContext.xml 中struts 的自動注入部分
在<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 語句。