環境說明
本文章是根據個人的搭建經驗完成的輕量級SSH框架,也是實際應用中比較全面的基礎框架。其中SSH指:Struts,Spring, Hibernate,是一個將MVC思想發揮的很好的web框架。
開發平臺: Windows 7 + MyEclipse 2014 + Tomcat 8.0.3+ JDK 1.7 + Mysql
不同的版本大同小異。
其中SSH所需的包均直接使用MyEclipse2014內集成的jar包,這樣無需手動添加,比較方便。
建立工程目錄
新建工程
打開MyEclipse, 新建一個web project:
file -> new -> Web Project
如下圖所示:
然後next兩步,到下面時,修改一點:
之後直接next到finish即可, 建立後目錄如下:
建立src目錄
爲了使得目錄結構清晰,將不同層次的源程序放到不同包內,分別建立
如下4個目錄:
- com.ssh.action :存放Action代碼
- com.ssh.service :存放Service代碼
- com.ssh.dao :存放Dao代碼
- com.ssh.entity :存放數據庫實體類
直接右擊src
, 然後new -> package
如下圖:
然後直接finishi即可。同樣的步驟建立剩下三個目錄。
這一步完成後的目錄如下:
導入Struts,Spring,Hibernate環境
就是導入SSH環境了,這裏使用的是MyEclipse集成的jar包
導入Struts
過程:右擊項目名SSH
然後 MyEclipse ->Project Facets[capabilities]->Install Apache Struts 2.x Facet
初始圖如下:
next到這步修改爲第三項:
之後一直到finish即可。
安裝完了之後,會發現在目錄下多了關於struts的jar包目錄。
導入Spring
導入Spring與Struts 過程幾乎相同
右擊項目名稱:MyEclipse ->Project Facets[capabilities]->Install Apache Spring Facet
之後一路next到finish即可。
導入hibernate
這個比較複雜一些,需要先配置數據庫連接。
建立數據庫
這裏建立一個數據庫表來測試搭建是否成功。
create database sshtest;
use sshtest;
create table t_user
(
id int not null auto_increment,
name varchar(20) not null,
password varchar(10) not null,
primary key (id)
);
insert into t_user values(1,'shomy','123')
建立連接
建立數據庫之後,在MyEclipse裏面通過中間鍵來連接。過程如下:
首先切換到數據庫視圖:
菜單欄 Window -> open perspective -> show MyEclipse database explorer
如下圖:
開始只有一個MyEclipse Derby, 我們新建一個, 右擊它, 然後new ,如下圖:修改如下,這裏需要一個連接數據庫的jar
完成之後,點擊 Test Driver
如果出現建立成功即可。
然後在程序的右上角,切換到MyEclipse視圖。
導入Hibernate
建立了數據庫連接之後, 就可按照導入struts,與spring 的樣子,導入
Hibernate。
右擊工程MyEclipse ->Project Facets[capabilities]->Install Apache Spring Facet
如下圖:
然後next到此處: 修改目錄:
在next 到此處加入 上一步新建的數據庫連接。
建立完成之後,直接yes即可。
映射數據庫表
然後在切換到Database視圖。如圖:
選擇: Hibernate Reverse Engneering.
next 到此處時: 注意修改
然後finish即可。之後切換到MyEclipse視圖,此時目錄結果如下:
此時SSH的jar包以及數據庫的映射完成。
建立Java與Jsp文件
上一步結束之後,開始在四個目錄裏面寫東西了。
其中 dao與service
都是建立一個接口,一個實現。
首先是 com.ssh.dao
,:
在dao目錄右擊,new ->interface
: 名字處填寫:UserDAO
,代碼如下
package com.ssh.dao;
import com.ssh.entity.TUser;
public interface UserDAO {
public TUser queryUserByName(String name);//查詢函數
}
然後創建dao的實現: new -> class
名字爲 : UserDAOImpl
代碼如下:
package com.ssh.dao;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.ssh.entity.TUser;
public class UserDAOImpl implements UserDAO {
private SessionFactory sessionFactory;
public TUser queryUserByName(String name) {
Query query = sessionFactory.getCurrentSession().createQuery(
"from TUser as u where u.name = ?");
query.setString(0, name);
TUser u = (TUser) query.uniqueResult();
return u;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
然後創建service代碼:
先建立一個interface:在com.ssh.service
目錄裏面,new -> interface
名字: UserService
代碼如下:
package com.ssh.service;
public interface UserService {
public boolean login(String name,String password);
}
在 new -> class
: UserServiceImpl` 代碼如下:
package com.ssh.service;
import com.ssh.dao.UserDAO;
import com.ssh.entity.TUser;
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public boolean login(String name, String password) {
TUser u = userDAO.queryUserByName(name);
if (u == null) {
return false;
} else {
if (u.getPassword().equals(password)) {
return true;
} else {
return false;
}
}
}
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
最後建立action
文件 ,在 com.ssh.action
目錄下: new -> class
名字爲: LoginAction
代碼爲:
package com.ssh.action;
import com.ssh.service.UserService;
public class LoginAction {
private String name;
private String password;
private UserService userService;
public String login() {
/* NAME和PASSWORD爲空則返回登錄頁面,否則驗證登錄 */
if (null == name && null == password) {
return "login";
} else {
Boolean u = userService.login(name, password);
if (u) {
return "ok";
} else {
return "error";
}
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
到此java 文件建立完成。
下面建立三個測試的jsp文件:
在 WebRoot
下建立三個jsp 步驟: 右擊webroot, new -> jSP(..)
, 分別命名爲: login.jsp
, loginOk.jsp
, loginError.jsp
; 代碼分別如下:
login.jsp
:
<html><body>
<center><form method="post" action="login" >
UserName<input type="text" name="name" id="name"/><br/>
Password<input type="password" name="password" id="password"/><br/>
<input type="submit" value="login" /></form></center>
</body></html>
loginOk.jsp:
代碼
<html>
<body>
<center><h1>Login Is Ok</h1></center>
</body>
</html>
loginError.jsp:
代碼
<html>
<body>
<center><h1>Login Is Error</h1></center>
</body>
</html>
至此,jsp,java文件均已完成,下面也是最關鍵的,修改配置文件。
修改配置文件
首先修改struts.xml
在src 下, 將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>
<package name="default" extends="struts-default">
<action name="login" class="com.ssh.web.LoginAction" method="login">
<result name="login">login.jsp</result>
<result name="ok">loginOk.jsp</result>
<result name="error">loginError.jsp</result>
</action>
</package>
</struts>
然後修改同一個目錄下的:ApplicationContent.xml
可以看出,原來的文件裏面已經有了不少內容,且都是由bean塊組成。我們需要修改並添加一些內容,完整的代碼如下:數據庫名字,數據庫密碼等因人而異。
<?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.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/shopping"></property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/entity/TUser.hbm.xml</value></list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<!-- 指明進行事務管理業務方法名[*是通配符] -->
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="edit*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 登錄Action -->
<bean id="loginAction" class="com.ssh.action.LoginAction" scope="singleton">
<property name="userService" ref="userService" />
</bean>
<!-- userDAO -->
<bean id="userDAO" class="com.ssh.dao.UserDAOImpl" parent="daoTemplate" />
<bean id="userService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.ssh.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
</bean>
</property>
</bean>
<bean id="daoTemplate" abstract="true">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" /></beans>
其中新加的關鍵部分就是 ,每次添加新的功能時,都需要照貓畫虎的,加上兩個相應的bean。
<!-- 登錄Action -->
<bean id="loginAction" class="com.ssh.action.LoginAction" scope="singleton">
<property name="userService" ref="userService" />
</bean>
<!-- userDAO -->
<bean id="userDAO" class="com.ssh.dao.UserDAOImpl" parent="daoTemplate" />
<bean id="userService" parent="baseTransactionProxy">
<property name="target">
<bean class="com.ssh.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
</bean>
</property>
</bean>
最後添加 jdbc.properties
在src目錄下,new ->file
名字直接填:
jdbc.properties
修改內容如下: 數據庫名字,數據庫密碼等因人而異。
proxool.maxConnCount=5
proxool.minConnCount=2
proxool.statistics=1m,15m,1h,1d
proxool.simultaneousBuildThrottle=5
proxool.trace=false
proxool.verbose=false
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sshtest?useUnicode=true&characterEncoding=gbk
jdbc.username=root
jdbc.password=123
具體的原理,看代碼也大概看的差不多。多加幾個慢慢就熟悉了。我這就不細講每一行的作用了。
測試
至此,環境搭好了,不過還有一點點瑕疵,就是struts包與Hibernate包裏面有重複的antlr.jar 不過版本不同,可能會引起錯誤。因此我們移除掉struts的antlt2.7.2.jar
:
右擊項目 -> build path ->configure build path
如下:
點擊Edit 彈出:
之後點擊ok即可。
最後可以修改一下 web.xml
文件
在WebRoot/WEB-INFO
下, 修改一下默認頁面如下:
最後開始運行: 右擊項目->run as -> MyEclipse Server Application
在彈出的的窗口中,選擇自己相應的服務器,我這裏是tomcat 8.0.3. 然後點擊OK, 服務器開始啓動,
可以通過console 查看進度,等完全啓動,會顯示:
然後在瀏覽器地址欄裏輸入:localhost:8080/SSH
彈出輸入框,輸入正確的用戶名 密碼, 顯示Login is Ok
,並且,輸入錯誤的用戶名密碼,顯示login is Error
表示搭建成功。
至此,整個SSH 框架藉助MyEclipse 搭建成功,一開始也各種問題,各種404,500. 但是搭建成功之後,不得不說,SSH很完善,封裝擴展性很好,層次分明。多寫幾個ACTION, 就會熟悉框架的用法了。
附代碼
附件是 搭建成功的SSH 框架,可以,修改一點數據庫的東西,就可以使用,可以作參考。其中 muysql-java.jar
在工程裏面。