1. 程式人生 > >IDEA 下寫出第一個 SSH 整合框架練手專案(二,整合SSH及登陸頁面的完成)

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 &copy; 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 語句。