此篇講的是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>