此篇講的是MyEclipse9工具提供的支援搭建自加包有程式碼也是相同:使用者登入與註冊的例子,表字段只有name,password.

  SSH,xml方式搭建文章連結地址:http://www.cnblogs.com/wkrbky/p/5912810.html

一、Hibernate(資料層)的搭建:

實現流程

二、Spring(注入例項)的使用:

實現流程

三、Struts2(MVC)的搭建:

實現流程

這裡注意一點問題:

  Struts2與Hibernate在一起搭建,antlr包,有衝突。MyEclipse9中有這樣問題。朋友的MyEclipse10中沒有這個問題。

  我選擇把Struts中antlr包去掉。

DB Browser中反轉實體類:

sequence自動增長ID實體類中配置連線:http://www.cnblogs.com/wkrbky/p/5917985.html

 編輯web.xml檔案:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name> <!-- 這是一隻攔路虎 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!-- 讀取applicationContext.xml檔案 不寫預設Spring需要讀取 WebContent\WEB-INF\applicationContext.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 改變預設讀取路徑為src目錄下的 applicationContext.xml 在改變的路徑下還是沒找到,便自動到預設路徑查詢 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param> <!-- 定義Spring監聽器 class: spring 3.0 Web Libraries 下可以找到。 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 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>
</web-app>

 配置applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.:需要匯入的名稱空間
命名規範:
xsi:架構例項
beans:根節點
aop:事務
context:註解
tx:事務管理
xsi:schemaLocation
協議(一個命名規範對應一個協議) 注:若不知道自己使用的框架版本,可以把協議後的版本號去掉,此處已經去掉。 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 註解方式建立Bean
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml">
</property>
</bean> --> <!-- 資料來源連線池的寫法
注意:使用GUI建立的資料來源,本地會話工廠改為註解會話工廠
hibernate.dialect:方言改10g,預設9
packagesToScan:注意一下,這裡是匯入實體類的對映資訊。匯入實體類的包。
-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:orcl">
</property>
<property name="username" value="root"></property>
<property name="password" value="admin"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle10gDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com/entity</value>
</list>
</property>
</bean> <!-- 2註解配置元件(代表宣告開啟註解模式,不加的話三個框架整合的話或許有些問題,或許識別不了標註元件@)-->
<context:annotation-config />
<!-- 3配置註解的自動掃描範圍(多個包配置可配置多個context:component-scan)
base-package:需要掃描的包
-->
<context:component-scan base-package="com.dao.impl"/>
<context:component-scan base-package="com.service.impl"/>
<context:component-scan base-package="com.action"/> <!-- 4第二種方法,在dao類中定義一個模板物件,這是外部的類不是我們建立的,所以要寫在這裡,如果不寫,dao.iml中就找不到此模型 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" ></property>
</bean> <!-- (1)配置註解事務管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- (2)加入註解事務管理器 -->
<tx:annotation-driven transaction-manager="txManager"/> </beans>

配置struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts> <!-- 是否啟動動態方法呼叫
<constant name="struts.enable.DynamicMethodInvocation"value="false" /> --> <!-- 開啟開發者模式,作用,頁面中報錯資訊會更加詳細,預設false --> <constant name="struts.devMode" value="true" /> <!-- 指定由spring負責action物件的建立(必選) --> <constant name="struts.objectFactory" value="spring" /> <!-- 國際化設定,請求引數為utf-8編碼(必選) --> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 指定被struts2處理的請求字尾型別,如果有多個,用逗號隔開 <constant name="struts.action.extension" value="action" /> --> <!-- 指定上傳檔案的大小上限 <constant name="struts.multipart.maxSize" value="209715200" /> --> <!-- 當配置檔案改動後是否重新載入,生產環境下需要設定為false <constant name="struts.configuration.xml.reload" value="false" /> --> <!-- 是否使用struts2的開發模式,生產環境下需要設定為false <constant name="struts.devMode" value="false" /> --> <!-- 瀏覽器是否快取靜態內容,生產環境下需要設定為true <constant name="struts.serve.static.browserCache" value="true" /> --> <!-- <includefile="example.xml"/> --> </struts>

資料訪問層dao介面:

package com.dao;

import com.entity.Users;

/**
* 使用者介面
* @author asus
*
*/
public interface UsersDao { /** 登陸驗證 */
Users loginCheck(Users user); /** 新增的方法 */
int addUser(Users user);
}

資料訪問層dao.impl實現類:

package com.dao.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository; import com.dao.UsersDao;
import com.entity.Users;
/**
* 使用者介面實現類
* @author asus
*HibernateTemplate、HibernateDaoSupport兩種方法實現增刪改查
*第二種方法:(第一種在《SSH(Struts2+Spring+Hibernate)框架搭建流程》中有詳細介紹)
在dao類中定義一個HibernateTemplate類的物件,用該物件呼叫HibernateTemplate模板封裝好的方法,如下:
*/
@Repository(value="usersDaoImpl")//用於標註資料訪問元件,即DAO元件,value屬性可不寫預設是類名首字母小寫(觀看順序1)
public class UsersDaoImpl implements UsersDao { //定義一個模板物件(使用註解不需要生成Get'Set方法,屬性名必須類名首字母小寫才能註解方式自動賦值)
//@Autowired//註釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,丟擲異常,這樣的話就不友好了不是,所有Spring提供了一個配套使用的@Qualifier(完全自動)
//@Qualifier(value="hibernateTemplate")//指定注入 Bean 的名稱與@Autowired配套使用
@Resource(name="hibernateTemplate")//spring元件setter方法注入(觀看順序2)
private HibernateTemplate hibernateTemplate; @Override
public Users loginCheck(Users user) { //得到一個集合
List<Users> list = hibernateTemplate.find("from Users where name=? and password=? ",user.getName(),user.getPassword()); //使用三元運算子,防止list.get(0)時報空指標。
return (Users) (list.size()>0?list.get(0):null);
} @Override
public int addUser(Users user) { try {
hibernateTemplate.save(user);
return 1;
} catch (DataAccessException e) { e.printStackTrace();
}
return 0;
} }

業務邏輯層介面service:

package com.service;

import com.entity.Users;

/**
* 使用者業務邏輯層
* @author asus
*
*/
public interface UsersService { /** 登陸驗證 */
Users loginCheck(Users user); /** 新增的方法 */
int addUser(Users user);
}

資料訪問層dao.impl實現類

package com.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.dao.UsersDao;
import com.entity.Users;
import com.service.UsersService;
/**
* 使用者業務邏輯層實現類
* @author asus
*
*/
//@Transactional //給實現類的所有新增事務(也可以個某一個方法新增此標註)
@Service(value="usersServiceImpl")//用於標註業務層元件(觀看順序3)
public class UsersServiceImpl implements UsersService { //這裡以前是new的,現在不需要了,交給Spring來例項(使用註解不需要生成Get'Set方法)
@Resource(name="usersDaoImpl")//spring元件setter方法注入(觀看順序4)
private UsersDao udd; @Override
public Users loginCheck(Users user) { return udd.loginCheck(user);
} @Transactional//給單個方法新增事物(若類上添加了全體事物,則不需要新增此區域性事物)
@Override
public int addUser(Users user) { return udd.addUser(user);
} }

控制器類Action:

package com.action;

import javax.annotation.Resource;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.entity.Users;
import com.opensymphony.xwork2.ActionSupport;
import com.service.UsersService;
/**
* 使用者控制器類
* @author asus
*
*/
//Action類[觀看順序5]
@Controller(value="usersAction")//用於標註控制層元件(如struts中的action)
@Scope("prototype")//單列模式
@ParentPackage("struts-default")
@Namespace("/")
/* Results({}):集合,對應的結果有多個
* Result():一個結果
* name:Action return返回的值
* location:返回結果的頁面
*/
@Results({
@Result(name="success",location="/success.jsp"),
@Result(name="login",location="/login.jsp"),
@Result(name="register",location="/register.jsp")
})
public class UsersAction extends ActionSupport { //接收頁面的值
private Users user;
//一樣交給Spring例項(使用註解不需要生成Get'Set方法)
@Resource(name="usersServiceImpl")//spring元件setter方法注入(觀看順序6)
private UsersService uss; public String execute(){ return SUCCESS;
} /** 判斷使用者輸入的賬號密碼 */
@Action("loginUser")//相當於sturts.xml中的action標籤的name,表單提交的url地址(觀看順序7)
public String login(){ Users checkNum=null;
if(user!=null){
checkNum = uss.loginCheck(user);
} return checkNum==null?LOGIN:SUCCESS;
} /** 新增使用者 */
@Action("addUser")
public String add(){ int addResult=0;
if(user!=null){
addResult = uss.addUser(user);
} return addResult==0?"register":SUCCESS;
}
//生成Get'Set
public Users getUser() {
return user;
} public void setUser(Users user) {
this.user = user;
} }

登陸頁面:

  <body>
<form action="loginUser.action" method="post" >
使用者名稱:<input type="text" name="user.name" />
密碼: <input type="password" name="user.password" />
<input type="submit" value="登入按鈕" >
</form>
</body>

註冊頁面:

    <body>
<form action="addUser.action" method="post">
使用者名稱:
<input type="text" name="user.name">
<br>
密碼:
<input type="password" " name="user.password">
<br>
<input type="submit" value="註冊">
</form>
</body>

成功頁面:

  <body>
操作成功!
</body>