1. 程式人生 > >《圖書資訊管理系統》,初學者搭建後端--ssh框架。

《圖書資訊管理系統》,初學者搭建後端--ssh框架。

資料庫:Mysql ;資料庫名:Library ;表名:Stack;

(溫馨提示:mysql中,資料庫名和表名這些都預設小寫,例如:create Library; 但是建立的還是小寫:library)

mysql 一些資料型別和寫法 與sql 不同,初學者要先分清楚。

--建立資料庫
create database library; 


--建立表
use library;


create table Stack(
cid int auto_increment,

title varchar(50),  --書名

writer varchar(30),--作者

bookdate datetime,--出版日期

price decimal(10,2),--價格

primary key(cid)   --設定主鍵和 cid的自動增長,從1001開始

)AUTO_INCREMENT=1001;


--多行插入資料
insert into Stack(cid,title,writer,bookdate,price) values
('1001','《臨界爵跡》','郭敬明','2011-1-1',19),
('1002','《斗羅大陸3》','唐家三少','2016-1-18',18),
('1003','《小說繪》','湖北知音傳媒','2009-9-1',10);

5.2 

-------- ssh.action : IndexAction  (mvc控制層)

public class IndexAction extends ActionSupport {	
	//宣告service,但不給它建立具體的實現類的例項,
	private IndexService is = null;
	public void setIs(IndexService is) {
		this.is = is;
	}
public String execute1() {
	List<BookCard> myBookCardList = is.getAllBookCard();
	System.out.println("結果集:"+myBookCardList.size());
	ActionContext ac = ActionContext.getContext();
	ac.put("myBookCardList", myBookCardList);
	return "success";
	}
	
public String formatDouble(double s){
DecimalFormat fmat=new DecimalFormat("\u00A4##.0");  // 是個給匯出的《圖書表》價格這列,前面增加 $符號 
	return fmat.format(s);
	}
}

5.3 

---------dao包:訪問資料庫  IndexDao
import java.util.List;

import ssh.entity.BookCard;

public interface IndexDao {
	public List<BookCard> getAllBookCard();
}
------------IndexDaoImple 介面


public class IndexDaoImpl implements IndexDao {
//在SSH的設計理念:要使用某個例項,那麼就定義宣告一個物件,然後
//給它新增set方法(用於spring注入進來),實現不要關注這個例項
//來自於那裡,以及怎麼建立,或者它是誰

	private SessionFactory sessionFactory;
	public void setSessionFactory(SessionFactory sf) {
		this.sessionFactory = sf;
	}


	@Override
	public List<BookCard> getAllBookCard() {
//sessionFactory這個例項可以自己按常規的hibernate傳統寫法建立
//也可以交給spring去託管
//sessionFactory = new Configuration().configurebuildSessionFactory();

Session session = sessionFactory.openSession();
System.out.println("sessionFactory:"+sessionFactory);
System.out.println("session:"+session);	
		
//後面當使用JPA的時候,EntityManager 類似於 SessionQuery query = session.createQuery("from BookCard");
	//System.out.println("query:"+query);
//這2行程式碼,會交給spring的AOP幫忙處理
	List<BookCard> list = query.getResultList();

	return list;
	}

}


5.4 

-----------------entity實體類:
public class BookCard {
	private int cid  ;
	private String name;
	private String sex ;
	private Date cardDate;
	private Double deposit;
------------------------------- BookCard.hbm.xml對映實體類資料
<!--name: 實體類的包名+類名   table:對應資料庫表名 定義主鍵  mane:實體類的屬性 column:資料庫的列名 --->

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping">
 
<class name="ssh.entity.BookCard" table="BookCard">
        <id name="cid" column="cid">
        	<generator class="native"></generator>
        </id>
<property name="name" type="string" length="50" column="name" not-null="true"></property>
        
<property name="sex" type="string" length="2" column="sex"></property>
        
<property name="cardDate" type="date" column="cardDate"></property> 
        
<property name="deposit" type="double" column="deposit"></property> 
    
</class>
</hibernate-mapping>
IndexService;

public interface IndexService {
	
	public List<BookCard> getAllBookCard();
	public void setId(IndexDao id);

}

-----------IndexServiceImpl  業務邏輯處理層介面

public class IndexServiceImpl implements IndexService {

	//dao例項使用注入方式
	//??為什麼要讓Dao為空的?
	//答:new 實現類的程式碼不見了,這樣本類就不用關注具體的實現類是誰</span>
	private IndexDao id;
//用於注入使用
	public void setId(IndexDao id) {
		System.out.println("有人給我注入了一個dao例項:"+id);
		this.id = id;
	}


	@Override
	public List<BookCard> getAllBookCard() {
		<span style="color:#3366ff;">//本類應該編寫業務邏輯的程式碼,
		//但本例沒有業務邏輯,就不用寫。
		
		//訪問資料庫的程式碼,不會出現在service這一層
		//交給dao來操作資料庫</span>
List<BookCard> myBookCardList = id.getAllBookCard();
		
		//進行其它的業務邏輯操作,比如增加多一個選項,是否過期
		//本例不需要
		//....
		
	return myBookCardList;
	}

}

5.6 

-------------------applicationContext.xml
引入外部屬性(插入jdbc.properties,方便資料庫資訊變動的時候做出修改。),
	不需要new物件,防止緊密耦合,直接由spring管理類, 注入資料庫連線池,檢查連線資訊。


<?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"  
		xmlns:aop="http://www.springframework.org/schema/aop"   
		xmlns:context="http://www.springframework.org/schema/context"  
		xmlns:jee="http://www.springframework.org/schema/jee"  
		xmlns:tx="http://www.springframework.org/schema/tx"  
		xsi:schemaLocation="    
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd  
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
	
	<!-- 引入外部屬性檔案 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
		
	<!-- 類似於財務部門一樣,類就是錢,所有需要類的例項都由spring去管理 -->
	<bean id="myIndexAction" class="ssh.action.IndexAction" scope="prototype">
		<!-- setIs(myIndexService) -->
		<property name="is" ref="myIndexService"/>
	</bean>
	
	<!-- myIndexService = new ssh.service.IndexServiceImpl() -->
	<bean id="myIndexService" class="ssh.service.IndexServiceImpl" scope="prototype">
		<property name="id" ref="myIndexDao"/>
	</bean>
	
	<bean id="myIndexDao" class="ssh.dao.IndexDaoImpl" scope="prototype">
		<span style="color:#3366ff;"><!-- 晚點再注入能用的seesionFactory --></span>
		<property name="sessionFactory" ref="mySessionFactory"></property>
	</bean>
	
<!-- 
	錯誤的做法,new org.hibernate.internal.SessionFactoryImpl()
	不可以,需要configuration來建立
	bean id="mySessionFactory" class="org.hibernate.internal.SessionFactoryImpl"></bean
	
	 -->
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 注入連線池,包含了資料庫使用者名稱,密碼等等資訊 -->
	<property name="dataSource" ref="myDataSource"/>
		
<!-- 配置Hibernate的其他的屬性 -->
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <span style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 21.6px; white-space: nowrap;"><span style="color:#3366ff;"><!-- 配置資料庫驅動,這裡使用mysql --></span></span>
			<prop key="hibernate.show_sql">true</prop><span style="color:#3366ff;"> <!-- 顯示資料庫資訊 --></span>
			<prop key="hibernate.format_sql">true</prop> <span style="color:#3366ff;"><!-- 格式化資料庫資訊 --></span>
			<prop key="hibernate.connection.autocommit">false</prop><span style="color:#3366ff;"> <!-- 自動提交資料庫資訊-off --></span>
			<span style="color:#3366ff;"><!-- 開機自動生成表資訊 --></span>
			<prop key="hibernate.hbm2ddl.auto">update</prop>
		</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>ssh/entity/BookCard.hbm.xml</value>
			</list>
		</property>
		
	</bean>	
	 
	<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}"/>
		<property name="jdbcUrl" value="${jdbc.url}"/>
		<property name="user" value="${jdbc.user}"/>
		<property name="password" value="${jdbc.password}"/>
		<span style="color:#3366ff;"><!-- 每300秒檢查所有連線池中的空閒連線 --></span>
		<property name="idleConnectionTestPeriod" value="300"></property>
		<span style="color:#3366ff;"><!-- 最大空閒時間,900秒內未使用則連線被丟棄。若為0則永不丟棄 --></span>
		<property name="maxIdleTime" value="900"></property>
		<span style="color:#3366ff;"><!-- 最大連線數 --></span>
		<property name="maxPoolSize" value="2"></property>
		
	</bean>
</beans>

5.7 

jdbc.properties
(資料庫連線資訊的文字,和applicationContext分開是方便資料庫變動後的修改) 
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/carddb
jdbc.user=root
jdbc.password=

5.8 
s001.xml;
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<span style="color:#3366ff;"><!-- 上面的頭,注意版本,從樣例裡複製過來 showcase.war\WEB-INF\src\java\struts.xml -->
</span>
<struts>
	
<!-- 第1步:先定義一個包 --></span>
	<package name="mypck001" extends="struts-default">

<!-- 第2步:定義一個action,配置跳轉資訊 name 類似於Servlet @WebServlet("/IndexServlet") 
	          設計思想:關心了具體的實現類 ,必須改為不要關注那個實現類
			 加入spring後,struts的action節點的class屬性意義發生變化,
			 直接引用spring幫忙建立的例項  --></span>
		
<action name="Index" class="myIndexAction" method="execute1">
<!-- 跳轉是forward/WEB-INF/是防止jsp不經過action就可以訪問-->
			<result name="success">/WEB-INF/jsp/index2.jsp</result>
			<result name="error">/WEB-INF/jsp/s_tag.jsp</result>
		</action>
	</package>
</struts>

----------------s002.xml ; s003.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 上面的頭,注意版本,從樣例裡複製過來 showcase.war\WEB-INF\src\java\struts.xml -->

<struts>
	<package name="mypck002" extends="struts-default">
<!—s003.xml在這裡修改一個數字即可 -->
		
	</package>
</struts>
------------struts.xml  管理s001,002,003.xml資訊
<?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTDStruts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 上面的頭,注意版本,從樣例裡複製過來 showcase.war\WEB-INF\src\java\struts.xml -->
<!-- include檔案用於分割,實現多人併發不衝突 -->
<!-- 告知Struts2執行時使用Spring來建立物件 -->
<constantname="struts.objectFactory" value="spring" />
<include file="s001.xml"/>
<include file="s002.xml"/>
<include file="s003.xml"/>
</constantname>

5.9 

jSP: index.jsp 主頁,建表顯示資料庫表資訊
標頭檔案:</span>
<%@ taglib uri="/struts-tags" prefix="s" %>
<table border="1">
	<tr>		
		<td>全選</td>
		<td>序號</td>
		<td>卡號</td>
		<td>姓名</td>
		<td>性別</td>
		<td>辦卡日期</td>
		<td>押金</td>
	</tr>
<s:iterator value="#myBookCardList" status="bcs">
	<tr>	
	<td></td>
	<td><s:property value="#bcs.count" /></td> <span style="color:#3366ff;"> <!-- count:計算 -->
	<td><s:property value="cid"></s:property></td>
	<td><s:property value="name"></s:property></td>
	<td><s:property value="sex"></s:property></td>
	<td><s:date name="cardDate" format="yyyy年MM月dd日"> <!-- 注意日期格式不要寫錯了 -->
</s:date></td>
	<td><s:property value="%{formatDouble(deposit)}"> <!-- 價格 -->
</s:property></td>
	</tr>
</s:iterator>
<s:if test="myBookCardList.size()==0">
	<tr>					
		<td colspan="7">沒有查詢到資料</td>
	</tr>
</s:if>
</table>
-----------error.jsp 錯誤頁面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


我是錯誤頁面
<c:out value="${id}"></c:out>

5.10 
------------web.xml 這裡預設default.jsp 為主頁,其實default 不是主頁,只是重定向跳轉 主頁。(重定向在一些防毒軟體中會有警告提示。)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ssh_001</display-name>
  <welcome-file-list>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

<!-- struts2過濾器的配置:struts就像一條看門犬,有客戶訪問就釋放資源 -->
<filter>
    <filter-name>struts2</filter-name>  <!-- 下面這句程式碼略長,是struts的目錄的包 -->
<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>

<!-- spring監視器的配置:spring就像一隻鷹,長期掛起在伺服器,不間斷,有需求快速呼叫。 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

5.11 
---------default.jsp (用於重定向跳轉主頁,隱藏主頁。)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><%
    
    response.sendRedirect("Index.action"); <!-- sendRedirect:重定向跳轉主頁Index -->
 %>
頁面 資訊顯示: 由於小編我還是初學者,如果文章還有不完善的地方請多多指教;