《圖書資訊管理系統》,初學者搭建後端--ssh框架。
阿新 • • 發佈:2019-01-29
資料庫: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 -->
%>
頁面 資訊顯示:
由於小編我還是初學者,如果文章還有不完善的地方請多多指教;