SSH整合教程(struts2+spring3+hibernate3)(含登陆示例)
1.建立web項目
打開MyEclipse,我用的是8.6,項目名稱就叫ssh好了,注意把項目語言統一設成utf-8。
完成之后的項目結構為:
2.把該加的包復制到項目里 找到項目所在文件夾,把下載的包復制粘貼到lib文件夾里,然后在MyEclipse里面刷新項目。
3.去數據庫里建表,數據庫我用的是mysql5.1 新建數據庫,命名為ssh。 新建表user_info,sql如下: CREATE TABLE `user_info` ( ?`id` int(4) NOT NULL AUTO_INCREMENT, ?`username` varchar(30) NOT NULL, ?`password` varchar(20) NOT NULL, ?PRIMARY KEY (`id`), ?UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into user_info values(1,'a','a'); 4.建立數據庫連接,添加hibernate 在MyEclipse中,將視圖切換到MyEclipse Database Explorer,新建一個數據庫連接
點擊“Add JARs”,選擇項目中lib文件夾里的mysql-connector-java-5.0.6-bin.jar
接下來,可以點擊“Next”選擇要添加的數據庫,也可以直接Finish。 在左側雙擊剛才新增的數據庫連接,輸入密碼,就可以看到ssh下面的user_info表了。
回到MyEclipse默認視圖,為項目添加hibernate支持,右鍵點擊項目名稱-MyEclipse-Add Hibernate Capabilities
然后點擊finish,可能有些包已經存在了,沒關系,下面繼續。 在src下新建一個package,model.system。 回到數據庫視圖,右鍵點擊user-info表,選擇Hibernate Reverse Engineering
直接點Finish。這里為什么要選identity,請見附錄說明。 現在可以看到已經添加好的文件,為了方便,現在開始ssh項目使用navigator視圖(右鍵點項目-Show In-Navigator)。
點開hibernate.cfg.xml看一下,它應該是這樣子的:
5.修改web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5"? 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_2_5.xsd"> ? <!-- spring相關配置 --> <context-param> ?<param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml,classpath*:/context/applicationContext*.xml</param-value> ?</context-param> ?<listener> ?<listener-class> ?org.springframework.web.context.ContextLoaderListener ?</listener-class> ?</listener> ?<!-- 以下3項參數與log4j的配置相關 --> ??? ???<context-param> ? ???????<param-name>log4jConfigLocation</param-name> ? ???????<param-value>/WEB-INF/log4j.properties</param-value> ? ???</context-param> ? ???<context-param> ? ???????<param-name>log4jRefreshInterval</param-name> ? ???????<param-value>60000</param-value> ? ???</context-param> ? ???<listener> ? ???????<listener-class> ? ???????????org.springframework.web.util.Log4jConfigListener ? ???????</listener-class> ? ???</listener> ? <!-- end -->? ?<!-- 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> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> ???<welcome-file>index.jsp</welcome-file> ?</welcome-file-list> </web-app>
6.添加applicationContext.xml 在WEB-INF下新建applicationContext.xml文件
內容如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--指明hibernate配置文件的位置 ?--> <bean id="sessionFactory" ???class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ??<property name="configLocation" value="classpath:hibernate.cfg.xml" /> </bean> <!--定義DAO ?--> <bean id="userDao" class="dao.system.UserDao"> ??<property name="sessionFactory">? ??????<ref bean="sessionFactory"/> ? ??</property> </bean> <!-- ??配置LoginAction.java類文件 --> <bean id="LoginAction" class="action.login.LoginAction" scope="prototype"> <property name="userService" ref="userService" /> </bean> ? ???<!-- 配置service層 --> <bean id="userService" class="service.system.UserService"> ???????<property name="userDao"> ???????<ref bean="userDao"/> ?????</property> ?</bean> </beans>
7.添加spring支持 右鍵點擊項目-MyEclipse-Add Spring Capabilities
記得選上Spring 3.0 Web Libraries。
選擇剛才新建的applicationContext.xml文件
點擊Finish。
8.添加dao,service和action 結構如下:
UserDao.java內容如下: package dao.system;
import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import model.system.UserInfo;
public class UserDao extends HibernateDaoSupport{ public void add(UserInfo m) { getHibernateTemplate().save(m); } @SuppressWarnings("unchecked") public List<UserInfo> showAllUsers() { return getHibernateTemplate().find("from user"); } public void update(UserInfo m) { ???????getHibernateTemplate().update(m); } public void delete(String id) { getHibernateTemplate().delete(getHibernateTemplate().get(UserInfo.class, id)); }
public UserInfo getUserById(String id) { UserInfo m=(UserInfo)getHibernateTemplate().get(UserInfo.class, id); return m; }
//普通用戶登錄驗證 @SuppressWarnings("unchecked") public boolean checkUser(String userName,String userPassword){ ?boolean flag = false; ?String hql = "from UserInfo as user where user.username = '"+userName+"' and user.password = '"+userPassword+"'"; ?List<UserInfo> userList = this.getHibernateTemplate().find(hql); ?if(userList.size()>0){ ??flag = true; ?} ?return flag; } }
UserService.java內容如下: package service.system;
import dao.system.UserDao;
public class UserService{ private UserDao userDao;
public boolean checkUser(String userName,String userPassword) { return userDao.checkUser(userName, userPassword); } public UserDao getUserDao() { return userDao; }
public void setUserDao(UserDao userDao) { this.userDao = userDao; } ? }
LoginAction.java內容如下: package action.login;
import com.opensymphony.xwork2.ActionSupport;
import service.system.UserService;
public class LoginAction extends ActionSupport{ private static final long serialVersionUID = 3989633817331294940L; private String username; private String password; private UserService userService = new UserService(); public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public String getUsername() { ?return username; } public void setUsername(String username) { ?this.username = username; } public String getPassword() { ?return password; } public void setPassword(String password) { ?this.password = password; } public String execute(){ boolean flag = false; if (username == null || username.trim().equals("")) { this.addFieldError("username", "用戶名不能為空"); return "fail"; } else if (password == null || password.trim().equals("")) { this.addFieldError("password", "密碼不能為空"); return "fail"; } else { flag = userService.checkUser(username, password); if (flag) { return "success"; } else { return "fail"; } } } }
9.添加struts支持 右鍵點擊項目-MyEclipse-Add Struts Capabilities
其他的選默認就行,然后Finish。
10.修改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>
<!--下述語句是將struts2交給spring管理 --> <constant name="struts.objectFactory" value="spring" />
<!--將action內容放在package元素下,package元素的name值與extends值可以使用默認值,如下所示 --> <package name="ssh" extends="struts-default"> <!--例如與用戶登錄相關的LoginAction,配置如下,其中,class值與applicationContext.xml文件中該action的id值相對應,name值作為標識--> ???<action name="loginAction" class="LoginAction"> <!--result元素設置頁面跳轉值,其中name值為目標頁面的字符串標識,如下,登錄失敗時回到fail.jsp頁面,成功時,轉向success.jsp頁面 --> ???<result name="fail">/jsp/login/fail.jsp</result> ???<result name="success">/jsp/login/success.jsp</result> ???</action> </package> </struts>
11.添加頁面 累了吧?快成功了,下面繼續。 在WebRoot文件夾下面新建一個jsp文件夾,存放頁面。 結構如下:
fail.jsp內容如下: <%@ page language="java" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ???<base href="<%=basePath%>"> ???<title>Fail</title> ?</head> ?<body> ???登陸失敗。<br> ?</body> </html>
success.jsp內容如下: <%@ page language="java" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ?<head> ???<base href="<%=basePath%>"> ???<title>Success</title> ?</head> ?<body> ???登陸成功。<br> ?</body> </html>
修改index.jsp,內容如下: <%@ page language="java" pageEncoding="utf-8"%> <!-- 導入struts2標簽庫 --> <%@taglib uri="/struts-tags" prefix="s"%>
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>
<html>? <head> ??<title>用戶登錄</title> </head> <body> <center> <div id="login"> ???<s:form action="loginAction" method="post"> ????<s:textfield label="用戶名" name="username"></s:textfield> ????<s:password label="密碼" name="password"></s:password> ????<s:submit value="登錄"></s:submit> ???</s:form> ??</div> </center> </body> </html>
12.新增log4j.properties文件 放在WEB-INF下
內容如下: #newhappy ?log4j.properties start
log4j.rootLogger=DEBUG,myConsole,R #console appender log4j.appender.myConsole=org.apache.log4j.ConsoleAppender log4j.appender.myConsole.layout=org.apache.log4j.PatternLayout log4j.appender.myConsole.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n log4j.appender.myConsole.threshold=INFO
# R is set to be a DailyRollingFileAppender.? log4j.appender.R=org.apache.log4j.DailyRollingFileAppender? log4j.appender.R.File=D\:\\workspaces\\job\\job\\WebRoot\\WEB-INF\\backup.log? log4j.appender.R.DatePattern = '.'yyyy-MM-dd? log4j.appender.R.layout=org.apache.log4j.PatternLayout? log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%c]-[%p] %m%n? log4j.appender.R.threshold=INFO
#rolling file appender #log4j.appender.myLogFile=org.apache.log4j.RollingFileAppender #log4j.appender.myLogFile.File=mylog.log #log4j.appender.myLogFile.MaxFileSize=500KB #log4j.appender.myLogFile.MaxBackupIndex=2 #log4j.appender.myLogFile.layout=org.apache.log4j.PatternLayout #log4j.appender.myLogFile.layout.ConversionPattern=%d{mmm d,yyyy hh:mm:ss a} : %p [%t] %m%n #log4j.appender.myLogFile.threshold=ERROR
#newhappy log4j.properties end
log4j.logger.org.hibernate=info #log4j.logger.org.hibernate=debug
### log HQL query parser activity #log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL #log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ### log4j.logger.org.hibernate.type=info #log4j.logger.org.hibernate.type=debug
### log schema export/update ### log4j.logger.org.hibernate.tool.hbm2ddl=debug
log4j的配置是從網上找的,如果有問題再自己調一下吧。
13.運行調試 配置好tomcat,然后發布,運行一下看看。 報錯了? 沒關系,因為起初先導入了一些包,后期又分別添加了hibernate,srping和struts,所以可能有包重復了。 解決辦法:先關掉MyEclipse,找到項目所在文件夾,把lib里面的包全部刪除,換上我們一開始下載的那些包。別忘了把tomcat下webapps/ssh,lib里面的包也全部更換。這樣應該就不會報錯了。
就知道你懶得一步步搭環境,想要這個ssh小項目的源代碼,請往右看->http://115.com/lb/5lbxl190# ssh.rar ???115網盤禮包碼:5lbxl190
14.可能出錯的地方 本來看上去很簡單的過程,我才不告訴你我居然折騰了快兩個星期呢。 一開始我沒有自己導入包,按照網上的一個教程,全部是用MyEclipse自帶的,自動生成的applicationContext.xml文件放在src文件夾下,然后web.xml里面寫的是:
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/applicationContext*.xml</param-value>
這樣寫似乎是無法找到src下的這個配置文件,于是我的struts和spring一直整合不成功,后來看了這個帖子:
http://bbs.csdn.net/topics/380074729?page=1#post-394873936
改成:
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml,classpath*:/context/applicationContext*.xml</param-value>
就好了。
整合過程中可能出現的問題基本是就是這樣,要么是包沖突、包重復、包缺失,要么就是配置文件找不到,或者文件路徑不對。?
15.附錄 前面還有一點遺留問題,ID的generator為什么要選identity呢? 我之前找到的一個關于整合SSH的PPT里是這樣解答的:
Hibernate中,<id>標簽下的可選<generator>子元素是一個Java類的名字,用來為該持久化類的實例生成惟一標示,所有的生成器都實現net.sf.hibernate.id.IdentifierGenerator接口。這是一個非常簡單的接口,某些應用程序可以選擇提供它們自己的特定實現。當然,Hibernate提供了很多內置的實現。
下面是一些內置主鍵生成器(Key Generator):
1)assigned
主鍵由外部程序負責生成,無需Hibernate參與。
讓應用程序在save()之前為對象分配一個標示符。
這是 <generator>元素沒有指定時的默認生成策略。
2)hilo
通過hi/lo 算法實現的主鍵生成機制,需要額外的數據庫表保存主鍵生成歷史狀態。
使用一個高/低位算法高效的生成long, short或者int類型的標識符。
給定一個表和字段(默認分別是hibernate_unique_key 和next_hi)作為高位值的來源。?
高/低位算法生成的標識符只在一個特定的數據庫中是唯一的。
3)seqhilo
與hilo 類似,通過hi/lo 算法實現的主鍵生成機制,只是主鍵歷史狀態保存在Sequence中,適用于支持Sequence的數據庫,如Oracle。
使用一個高/低位算法來高效的生成long, short 或者 int類型的標識符,給定一個數據庫序列(sequence)的名字。?
4)increment
主鍵按數值順序遞增此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。
這種方式可能產生的問題是:如果當前有多個實例訪問同一個數據庫,那么由于各個實例各自維護主鍵狀態,不同實例可能生成同樣的主鍵,從而造成主鍵重復異常因此,如果同一數據庫有多個實例訪問,此方式必須避免使用。
用于為long,short或者int類型生成唯一標識。只有在沒有其他進程往同一張表中插入數據時才能使用。在集群下不要使用。
5)identity
采用數據庫提供的主鍵生成機制如DB2 SQL Server MySQL中的主鍵生成機制。
對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內置標識字段提供支持。?
返回的標識符是long, short 或者int類型的。
?
6)sequence
采用數據庫提供的sequence機制生成主鍵如Oralce中的Sequence。
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。
返回的標識符是long, short或者 int類型的。
7)native
由Hibernate根據底層數據庫自行判斷,采用identity hilo sequence其中一種作為主鍵生成方式。
8)uuid.hex
用一個128-bit的UUID算法生成字符串類型的標識符, 這在一個網絡中是唯一的(使用了IP地址)。UUID被編碼為一個32位16進制數字的字符串。
由Hibernate基于128 位唯一值產生算法生成16 進制數值(編碼后以長度32 的字符串表示)作為主鍵例如:5abefd3890cat33llsica3ee43bk222
??????
9)uuid.string
與uuid.hex 類似,只是生成的主鍵未進行編碼(長度16),在某些數據庫中可能出現問題(如PostgreSQL)。
10)guid
在MS SQL Server?和?MySQL?中使用數據庫生成的GUID字符串。
?
?
11)select
通過數據庫觸發器選擇一些唯一主鍵的行并返回主鍵值來分配一個主鍵。
?
?
12)foreign
使用另外一個相關聯的對象的標識符。通常和<one-to-one>聯合起來使用。?
????一般而言,利用uuid.hex方式生成主鍵將提供最好的性能和數據庫平臺適應性。另外由于常用的數據庫,如Oracle DB2 SQLServer MySql 等,都提供了易用的主鍵生成機制(Auto-Increase 字段或者Sequence)。我們可以在數據庫提供的主鍵生成機制上,采用generator-class=native的主鍵生成方式。不過值得注意的是,一些數據庫提供的主鍵生成機制在效率上未必最佳,大量并發insert數據時可能會引起表之間的互鎖。
????數據庫提供的主鍵生成機制,往往是通過在一個內部表中保存當前主鍵狀態(如對于自增型主鍵而言,此內部表中就維護著當前的最大值和遞增量),之后每次插入數據會讀取這個最大值,然后加上遞增量作為新記錄的主鍵,之后再把這個新的最大值更新回內部表中,這樣,一次Insert操作可能導致數據庫內部多次表讀寫操作,同時伴隨的還有數據的加鎖解鎖操作,這對性能產生了較大影響因此,對于并發Insert要求較高的系統,推薦采用uuid.hex 作為主鍵生成機制。
總結
以上是生活随笔為你收集整理的SSH整合教程(struts2+spring3+hibernate3)(含登陆示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用JS提交表单的几种方法和验证
- 下一篇: 三栏布局(两边固定,中间自适应)