我們先實現一個最基本的需求..添加,然後保存以後返回列表頁面.這裏先不包括驗證什麼的..都假設輸入是正確的.驗證到下一節說明..
我們從需求出發...一步步實現.我這裏用的是myeclipse6.0 .struts2.0.16.spring2.0 hibernate3 mysql5.1
1.準備工作...當然是數據庫了..在mysql數據庫裏,創建一個名爲"user"的數據庫.創建一個表也叫"user". 表裏面就三個字段,id ,username ,age這裏我的數據庫名爲 root 密碼爲11.
2.創建一個web project .工程名是myTest1.選擇JAVA EE 5.0..點finish.
3導入hibernate.點工程右鍵,MyEclipse 選擇Add hibernate capabilities.上面的不變.下面下面的JAR Library Installation .選擇Copy cheched Library..點next .這裏不需要修改,點Next.將最上面的勾去掉.我們等下自己寫這個factory.點next.再將上面的勾去掉.點finish..
4.導入spring..點工程右鍵,MyEclipse 選擇Add spring capabilities..其中Libraries選擇前四個.還有一個Spring 2.0 Web libraries ..一共是五個..下面的JAR Library Installation .選擇Copy cheched Library...這個.也就是將加入的jar包複製到lib目錄下..點next .在產生applicationContext.xml的目錄裏選擇WebRoot/WEB-INF 點next.把上面的√去掉.等下我們自己寫...最後點FINISH.spring就導入成功了
5 導入struts2..現在myeclipse還不支持導入struts2.所以這裏我們需要手動導入.方法也很簡單..將struts2.0.16客戶端的jar包裏.選擇freemarker.jar,ognl.jar.struts2-spring-plugin.jar.xwork.jar.struts-core.jar.這裏不需要導入common-logging.jar.因爲spring裏面已經有這個jar包了.所以不需要再次導入..然後在src目錄下創建一個struts.xml..這樣就差不多了.
這裏特別注意一下.需要將common-pool.jar包放到Lib目錄下..貌似myeclipse6.5就會自動導入.6.0不會的說
6 準備工作差不多了.終於開始寫頁面了...首先,我們先做一個save.jsp..裏面有一個表單,輸入名字和年齡..
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'save.jsp' starting page</title>
</head>
<body>
<s:form action="userAction">//注意,我們這裏選擇模型驅動.而不是字段驅動.
還有,這個action name 設置爲 userAction ..
<s:textfield name="user.username" label="username"></s:textfield>
<s:textfield name="user.age" label="age"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>
7創建bean..這個很簡單.就是在com.test.model下面創建一個User.java.標準的bean.沒啥可說的
package com.test.model;
public class User {
private Integer id;
private String username;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
7 開始寫action .首先在src下面創建一個com.test.action包.在這個包下面創建UserAction.java
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.test.model.User;
import com.test.service.UserService;
public class UserAction extends ActionSupport {
private UserService userservice;
private User user;
public UserService getUserservice() {
return userservice;
}
public void setUserservice(UserService userservice) {
this.userservice = userservice;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute(){
userservice.saveUser(user);
return SUCCESS;
}
}
這裏在流程上已經有點偏了.因爲這裏我直接寫出了userserive.這個類我們還沒實現..而在實現這個service以前我們又必須實現userDAO.下一步,我們實現userDAO
8 新建一個包.com.test.DAO 這個是存放DAO接口的..spring要求我們必須面向接口編程 創建一個UserDAO.java
package com.test.DAO;
//這裏定義了五個方法.分別是增刪改查..查裏面有兩個,一個是根據ID查,一個是查所有.
import java.util.List;
import com.test.model.User;
public interface UserDAO {
public void addUser(User user);
public void delUser(User user);
public void updateUser(User user);
public User selectById(Integer id);
public List<User> selectAll();
}
9 創建一個com.test.DAO.impl包.實現上面定義的UserDAO ...類名是UserDAOimpl
package com.test.DAO.impl;//這裏結合了hibernate.所以我們繼承 HibernateDaoSupport來實現相應的操作.都很簡單的..就要注意下selectALL方法.裏面用到了hql語句
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.test.DAO.UserDAO;
import com.test.model.User;
public class UserDAOimpl extends HibernateDaoSupport implements UserDAO {
@Override
public void addUser(User user) {
this.getHibernateTemplate().save(user);
}
@Override
public void delUser(User user) {
this.getHibernateTemplate().delete(user);
}
@Override
@SuppressWarnings("unchecked")
public List<User> selectAll() {
String hql= "from User";
return (List<User>)this.getHibernateTemplate().find(hql);
}
@Override
public User selectById(Integer id) {
return (User)this.getHibernateTemplate().get(User.class, id);
}
@Override
public void updateUser(User user) {
this.getHibernateTemplate().update(user);
}
}
10創建好了DAO實現數據庫的操作..現在開始寫Service業務層...由於我們沒有任何事務,所以Service就是調用一次DAO層...首先還是創建一個包來放接口.com.test.service ..裏面的類UserService.java
package com.test.service;
import java.util.List;
import com.test.model.User;
public interface UserService {//這裏也對應DAO.寫了五個方法..
public void saveUser(User user);
public void delUser(User user);
public void updateUser(User user);
public User findById(int id);
public List<User> findAll();
}
11同理,當然是寫這個service的實現類..com.test.service.impl包..UserServiceImpl.java
package com.test.service.impl;//這裏沒寫什麼業務,只是調用了一次dao.
import java.util.List;
import com.test.DAO.UserDAO;
import com.test.model.User;
import com.test.service.UserService;
public class UserServiceImpl implements UserService {
private UserDAO userdao;
public UserDAO getUserdao() {
return userdao;
}
public void setUserdao(UserDAO userdao) {
this.userdao = userdao;
}
@Override
public void delUser(User user) {
userdao.delUser(user);
}
@Override
public List<User> findAll() {
return userdao.selectAll();
}
@Override
public User findById(int id) {
return userdao.selectById(id);
}
@Override
public void saveUser(User user) {
userdao.addUser(user);
}
@Override
public void updateUser(User user) {
userdao.updateUser(user);
}
}
12 最重要的地方開始了.就是配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">//配置dataSource.這個部分在hibernate裏面說的比較多了.不多說了
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost/user</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>11</value>
</property>
</bean>
<bean id="factory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="mappingResources">
<value>com/test/model/User.hbm.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="UserDao" class="com.test.DAO.impl.UserDAOimpl">
<property name="sessionFactory">//這個部分也說明了.其實就是在DAO裏面注入一個factory.我們在調用this.getHibernateTemplate() 的時候必須有這個factory.
<ref bean="factory"/>
</property>
</bean>
<bean id="UserService" class="com.test.service.impl.UserServiceImpl">
<property name="userdao">//在類UserServiceImpl裏面定義了一個userdao.這裏的這個name屬性必須和那裏的名字相同.因爲要調用那裏的set方法.
<ref bean="UserDao"/>//依賴注入.spring裏面說了很多了...
</property>
</bean>
<bean id="userAction" class="com.test.action.UserAction">
<property name="userservice">
<ref bean="UserService" />
</property>
</bean>
<bean id="listActionClass" class="com.test.action.ListAction">
<property name="service">//這個是配置下面list頁面的時候用的...先放上來了...免得重複黏貼
<ref bean="UserService"/>
</property>
</bean>
</beans>
13 save頁面的最後一步當然是配置struts.xml.結果頁面下面再說
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="user" extends="struts-default">
<action name="userAction" class="userActionClass">
<result type="redirect">ListAction.action</result>//這裏重定向到ListAction.顯示list頁面
<result name="input">/save.jsp</result>
</action>
<action name="ListAction" class="listActionClass">
<result >/list.jsp</result>//list頁面的action配置
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
14 至此,save頁面已經全部完成.但是提交以後總要顯示列表信息吧..也就是將數據庫裏的數據全部取出來顯示.所以,我們在com.test.action下面再寫一個action.叫ListAction.java
package com.test.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.test.service.UserService;
public class ListAction extends ActionSupport {
private UserService service;
public UserService getService() {
return service;
}
public void setService(UserService service) {
this.service = service;
}
@SuppressWarnings("unchecked")
@Override
public String execute() throws Exception {
Map request = (Map)ActionContext.getContext().get("request");獲取一個request的MAP對象
request.put("list", service.findAll());//放入MAP
return SUCCESS;
}
}
15 這裏,還忘記一個重要的東西..就是bean對應的hbm.xml 因爲我使用Middlegen自動生成的,所以代碼多一些..ID的生產策略是加一..
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="com.test.model.User"
table="user"
>
<meta attribute="class-description" inherit="false">
@hibernate.class
table="user"
</meta>
<id
name="id"
type="java.lang.Integer"
column="id"
>
<meta attribute="field-description">
@hibernate.id
generator-class="assigned"
type="java.lang.Integer"
column="id"
</meta>
<generator class="increment" />
</id>
<property
name="username"
type="java.lang.String"
column="username"
not-null="true"
length="50"
>
<meta attribute="field-description">
@hibernate.property
column="username"
length="50"
not-null="true"
</meta>
</property>
<property
name="age"
type="int"
column="age"
not-null="true"
length="10"
>
<meta attribute="field-description">
@hibernate.property
column="age"
length="10"
not-null="true"
</meta>
</property>
<!-- Associations -->
</class>
</hibernate-mapping>
16 我忘記了一個非常重要的配置..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">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
17又忘記一個jar包.就是jdbc連mysql的驅動包..我用的是mysql-connector-java-5.1.7-bin.jar
18 最後是我們的列表頁面.list.jsp .裏面用到ognl表達式.有空得去學習下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'list.jsp' starting page</title>
</head>
<body>
<h1><font color="red"><center>User List</center></font></h1>
<table align="center" border="1" width="80%">
<tr>
<td>序號
</td>
<td>名字
</td>
<td>年齡
</td>
<td>刪除
</td>
<td>修改
</td>
</tr>
<s:iterator value="#request.list" id="us">
<tr>
<td><s:property value="#us.id"/>
</td>
<td><s:property value="#us.username"/>
</td>
<td><s:property value="#us.age"/>
</td>
<td><s:a href="deleteUser.action?user.id=%{#us.id}">刪除</s:a>
</td>
<td><s:a href="updatePUser.action?user.id=%{#us.id}">修改</s:a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
19 最後..終於測試通過.
SSH框架的第一個整合例子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.