日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVAweb之SSH框架

發(fā)布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVAweb之SSH框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SSH框架( struts+spring+hibernate)

開發(fā)環(huán)境 myeclipes2015 sqlserver2012 Java

簡述

SSH是 struts+spring+hibernate的一個集成框架,是06年之前較為流行的一種Web應用程序開源框架.。集成SSH框架的系統(tǒng)從職責上分為四層:表示層、業(yè)務邏輯層、數(shù)據(jù)持久層和域模塊層,以幫助開發(fā)人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。其中使用Struts作為系統(tǒng)的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,控制業(yè)務跳轉,利用Hibernate框架對持久層提供支持,Spring做管理,管理struts和hibernate。


SSH框架優(yōu)點
優(yōu)秀的解耦性,很少有軟件產(chǎn)品的需求從一開始就完全是固定的??蛻魧浖枨?#xff0c;是隨著軟件開發(fā)過程的深入,不斷明晰起來的。因此,常常遇到軟件開發(fā)到一定程度時,由于客戶對軟件需求發(fā)生了變化,使得軟件的實現(xiàn)不得不隨之改變。ssh三層構架,控制層依賴于業(yè)務邏輯層,但絕不與任何具體的業(yè)務邏輯組件耦合,只與接口耦合;同樣,業(yè)務邏輯層依賴于DAO層,也不會與任何具體的DAO組件耦合,而是面向接口編程。采用這種方式的軟件實現(xiàn),即使軟件的部分發(fā)生改變,其他部分也不會改變。

框架解析

Struts

(一般開發(fā)選用的是Struts2【Struts的升級版】})
Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數(shù)據(jù)交互。Struts 2是Struts的下一代產(chǎn)品,是在 struts 1和WebWork的技術基礎上進行了合并的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構差別巨大。Struts 2以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業(yè)務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產(chǎn)品。

spring

Spring就像是整個項目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數(shù)去調用實體類的構造方法來實例化對象。Spring,使用基本的實體JavaBean來完成以前只能用EJB完成的事情。而其核心則是控制反轉(IOC)和面向切面編程(AOP)。使用Spring,意味著一個對象的創(chuàng)建再也不是自己new出來的,而是全權交給了IOC容器去實例化。與此同時,Spring通過采用依賴注入(DI)的方式,通過屬性的Setter和Getter方法來注入這個對象的屬性,這樣的好處就是不完全依賴于容器的API,且查詢依賴與代碼實現(xiàn)了解耦。而AOP,則是將應用的業(yè)務邏輯和系統(tǒng)級服務(例如事務)分離開來,進行內聚性的開發(fā),應用對象只負責完成業(yè)務邏輯而不關心日志或者事務的處理。
spring優(yōu)勢
spring提高了一種對象管理方法,有效的組織系統(tǒng)中間層對象。是框架的完美“粘合劑”。有利于面向接口編程習慣的養(yǎng)成,使代碼結構清晰。

hibernate

Hibernate,是負責了跟數(shù)據(jù)庫的交接。通過持久化數(shù)據(jù)對象,進行對象關系的映射,并以對象的角度來訪問數(shù)據(jù)庫。通過封裝JDBC,使得開發(fā)人員可以以面向對象編程的思想來操控數(shù)據(jù)庫,從而擺脫了以往使用JDBC編程時的“死板”操作。通過hibernate.cfg.xml文件來取代以往的JDBC連接數(shù)據(jù)庫的一大串代碼,通過XXX(實體Bean的類名).hbm.xml文件來與數(shù)據(jù)庫的具體表進行映射。并且Hibernate有自己的HQL語句,與數(shù)據(jù)庫的SQL語句相似,但不同的是HQL語句在面向對象編程的角度上,通過Session的createQuery方法創(chuàng)建戶一個query對象,由這個對象來完成對數(shù)據(jù)庫的增刪改查等操作。通過Struts2中Action的返回值,來調用Dao層中的業(yè)務處理。
hibernate優(yōu)勢
hibernate是JDBC輕量級的封裝,占用內存較少,性能比較高。與JDBC相比,如果開發(fā)JDBC的人員技術能力非常強,hibernate執(zhí)行效率會比JDBC弱一些,但是大部分情況是程序員在使用JDBC時是不可能做到最高效率,hibernate可以幫大部分開發(fā)人員提高運行效率。可以引入第三方二級緩存,提高系統(tǒng)查詢效率,減少系統(tǒng)里存在大量單例類(singleton),大量的單例類,會降低系統(tǒng)的可測試性和面向對象程度。Hibernate兼容JDBC。理論上可以應用在任何使用JDBC的場景。
可以逆向工程,簡化了手寫model實體類的繁瑣。

整體設計

表示層(jsp頁面)用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面。login.jsp等layUI前端框架。
業(yè)務邏輯層(Iplm,DAO,接口及接口實現(xiàn),action,Servlet包)業(yè)務規(guī)則的制定、業(yè)務流程的實現(xiàn)等與業(yè)務需求有關的系統(tǒng)設計,對于數(shù)據(jù)訪問層而言,它是調用者;對于表示層而言,它卻是被調用者。UserDAO.java/ UserDAOImpl.java,AddcardAction.java/ FileUploadServlet.java
模塊層(hibernate逆向工程)實體層model包),以幫助開發(fā)人員在短期內搭建結構清晰、可復用性好、維護方便的Web應用程序。TUser.java/TUser.hbm.xml
數(shù)據(jù)持久層(SQL server,基類實現(xiàn),hql)主要是負責數(shù)據(jù)庫的訪問,可以訪問數(shù)據(jù)庫系統(tǒng)、二進制文件、文本文檔或是XML文檔。iHibBaseDAOImpl.java/ iHibBaseDAO.java

DAO接口模式為了減少業(yè)務邏輯和數(shù)據(jù)訪問邏輯之間的耦合,當一個持久層框架被應用時,該模式將會減少業(yè)務對象和該框架之間的耦合,這樣我們可以不修改業(yè)務對象而選擇不同的持久層框架的實現(xiàn)。
業(yè)務邏輯層:包含了系統(tǒng)所需要的所有功能上的算法和計算過程,并與數(shù)據(jù)訪問層和表現(xiàn)層交互。服務端返回數(shù)據(jù)的處理以及相應頁面的改變。

設計原則:
業(yè)務層接口的設計原則:一個實體類一個接口,一次提交一個業(yè)務方法。業(yè)務方法的參數(shù)來自表現(xiàn)層。
持久層接口的設計原則:一個實體類一個接口,一次數(shù)據(jù)庫操作一個持久方法。

實例手把手教學搭建

開發(fā)工具:myeclipes2015 sqlserver2012

  • 新建一個SSHtest的web project項目


    輸入項目名稱,根據(jù)需要選擇各項版本(一般默認即可),點擊下一步

    點擊下一步

    勾選后點擊下一步

    點擊Finish,項目就建好了。

  • 搭建框架

  • ●創(chuàng)建hibernate


    為了更好的與spring匹配我們這里選擇3.3版本的hibernate,選好后點擊下一步

    根據(jù)上圖操作就建立好了hibernate的session工廠。
    接下來我們看一下建好的hibernate配置文件
    在hibernate配置文件里配置與數(shù)據(jù)庫的連接,獲得數(shù)據(jù)持久化(相關配置會在后面步驟中介紹)

    ●創(chuàng)建spring
    Spring整合Hibernate(一般先建hibernate再建spring,因為后建spring的話,就會自動把一些相關配置整合到spring里,減少了手動操作的麻煩)


    spring一般選4.1版本,切合hibernate3.3,(記得選擇版本的時候,兩個版本要相對應,否則會因為缺失相應的架包而報錯)點擊下一步

    你不用管,直接下一步

    到此步,點擊Finish,現(xiàn)在spring就創(chuàng)建好了
    接下來我們來看創(chuàng)建好的spring配置文件

    ●創(chuàng)建Struts2


    選擇2.1版本,點擊下一步


    到此步點擊Finish,Struts2就創(chuàng)建好。
    接下來我們來看Struts2的配置文件

    現(xiàn)在我們已經(jīng)完成了基本SSH框架的搭建。
    我們的框架布局基本就搭建完成了,我們先來運行測試一下(一般運行沒錯,就說明搭建沒問題)
    將項目部署到Tomcat上:

    運行

    因為要連接數(shù)據(jù)庫,所以我們要新建一個數(shù)據(jù)庫
    ●以sqlserver2012為例,新建一個名為SSHtest的數(shù)據(jù)庫

    創(chuàng)建數(shù)據(jù)庫

    點擊確定,數(shù)據(jù)庫就創(chuàng)好了。
    我們在這了以用戶登錄為例,建一張用戶表T_User

    填寫數(shù)據(jù)

    3. 創(chuàng)建所需包
    4 . 配置框架
    ●hibernate連接數(shù)據(jù)庫,獲得持久化數(shù)據(jù)
    新建數(shù)據(jù)池database


    操作完以上點擊下一步

    點擊Finish,數(shù)據(jù)庫連接池就做好了

    hibernate配置

    操作完以上記得ctrl+s保存,這樣hibernate就配置好了。
    接下來我們看一下hibernate的配置文件

    hibernate逆向工程(獲得model實體類)



    點擊ok,

    下一步

    直接下一步

    點擊后會出現(xiàn)如下

    選擇yes

    到此步逆向工程就完成了。

    接下來可以寫一些類
    business.basic包(放置基類及幫助類)

    business.dao包(放置業(yè)務接口供給調用)
    創(chuàng)建一個用戶業(yè)務接口


    選擇interface,下一步

    點擊finish,接口類就創(chuàng)建好了。

    UserDAO代碼如下(一般書寫登錄及增刪查改接口)

    package business.dao; import java.util.List; import model.TUser;public interface UserDAO {/*** 用戶登錄業(yè)務方法* @param userid 用戶登錄名* @param password 登錄密碼* @return TUser 當前登錄的用戶對象*/public TUser login(String userid,String password);/*** 普通用戶的注冊方法* @param userid 用戶注冊的用戶名* @param password 用戶注冊錄密碼的的* @param username 用戶注冊的姓名* @return boolean 注冊成功返回true 失敗返回false*/public boolean addNormalUser(String userid,String password,String username);/*** 修改普通用戶信息* @param userid 要修改的用戶的用戶名* @param password 修改后的密碼* @param username 修改后的用戶網(wǎng)站昵稱* @return 修改成功返回true 失敗返回false*/public boolean modifyNormalUser(String userid,String password,String username); /*** 根據(jù)用戶輸入的用戶名返回對應的TUser對象* @param userid 用戶名* @return TUser對象*/public TUser getTUserById(String userid);/*** 判斷注冊用戶名是否可用* @param userid* @return 用戶名可用返回true, 否則返回false*/public boolean isValidateUserid(String userid);}

    business.impl包(放置接口實現(xiàn)類)
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XTSG4bfP-1574340786841)(https://img-blog.c sdnimg.cn/20191121192641243.png)]




    代碼如下

    package business.impl;import java.util.List; import model.TUser; import business.basic.iHibBaseDAO; import business.basic.iHibBaseDAOImpl; import business.dao.UserDAO;public class UserDAOImpl implements UserDAO {private iHibBaseDAO bdao = null;public void setBdao(iHibBaseDAO bdao) {this.bdao = bdao;}public UserDAOImpl(){bdao = new iHibBaseDAOImpl();}@Overridepublic TUser login(String userid, String password) {String hql="from TUser where userid = ? and password = ?";Object[] para = {userid,password};List<TUser> list = bdao.select(hql, para);if(list.size()>0){return (TUser)list.get(0);}else {return null;}}@Overridepublic boolean addNormalUser(String userid, String password, String username) {TUser user = new TUser();user.setUserid(userid);user.setPassword(password);user.setUsername(username); Object obj = bdao.insert(user);if(obj != null){return true;}else {return false;}}@Overridepublic boolean modifyNormalUser(String userid, String password,String username) {TUser user = (TUser)bdao.findById(TUser.class, userid);user.setPassword(password);user.setUsername(username);return bdao.update(user);}@Overridepublic TUser getTUserById(String userid) {return (TUser)bdao.findById(TUser.class, userid);}@Overridepublic boolean isValidateUserid(String userid) {TUser user = (TUser)bdao.findById(TUser.class, userid);if(user!=null && !user.getUserid().equals("")){return false;}else {return true;}}}

    business.factory包(放置工廠類)

    工廠里整合了接口和接口實現(xiàn)類,在action里直接調用工廠類,就不用再分開調用接口和接口實現(xiàn),不用再下實例化對象在調用。
    代碼如下
    動態(tài)工廠

    package business.factory; import business.dao.UserDAO; import business.impl.UserDAOImpl;/** 動態(tài)工廠*/ public class DAOFactory {/*** 返回一個用于對用戶信息操作的UserDAO對象* @return UserDAO*/public UserDAO getUserDAO(){return new UserDAOImpl();}}

    動態(tài)工廠

    package business.factory; import business.dao.UserDAO; import business.impl.UserDAOImpl; public class StaticDAOFactory {/*** (靜態(tài)方法)返回一個用于對用戶信息操作的UserDAO對象* @return UserDAO*/public static UserDAO getUserDAO(){return new UserDAOImpl();}}

    一般選用動態(tài)。

    spring配置
    可創(chuàng)建bean來管理接口及接口實現(xiàn)(將接口及接口實現(xiàn)、工廠注冊給bean,配置好后交給spring統(tǒng)一管理)也可直接在session工廠利配置
    平常的java開發(fā)中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發(fā)存在的問題是new的類實例不好統(tǒng)一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。
    創(chuàng)建一個新springbean來注冊管理,我們命名為bean1

    選擇other

    下一步

    選擇sping鏈接(根據(jù)所需配置加載)


    勾選如上復選框,點擊Finish,springbean就創(chuàng)建好了。
    接下來配置bean
    這里講一下靜態(tài)工廠的方法注入
    靜態(tài)工廠顧名思義,就是通過調用靜態(tài)工廠的方法來獲取自己需要的對象,為了讓spring管理所有對象,我們不能直接通過"工程類.靜態(tài)方法()"來獲取對象,而是依然通過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:aop="http://www.springframework.org/schema/aop"xmlns:c="http://www.springframework.org/schema/c"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"><!-- 掃描器 掃描包中的類,將相關類注冊成bean --><context:annotation-config /><context:component-scan base-package="business" /><!--注入action,service,dao --><!-- 靜態(tài) --><bean id="login" class="business.action.LoginAction" scope="prototype"></bean><bean id="userDAO" name="userdao" class="business.factory.StaticDAOFactory"factory-method="getUserDAO" abstract="false" lazy-init="default"autowire="default"></bean> <bean id="bdao" class="business.basic.iHibBaseDAOImpl"></bean><!-- 實現(xiàn)基于上iHibBaseDAOImpl --><bean id="userdaoimpl" name="userdaoimpl" class="business.impl.UserDAOImpl"><property name="bdao" ref="bdao"></property></bean></beans>

    工程項目下的web.xml的配置

    到此步springbean就配置成功了。

    struts.xml配置

    為了更好的進行配置,我們選擇視圖界面配置

    建好后的視圖界面

    首先我們先創(chuàng)建如下幾個jsp和css文件

    接下來添加action


    配置失敗返回參數(shù)

    如果跳轉到網(wǎng)頁可以使用dispatcher,頁面跟共用響應對象
    redirect簡單的重定位,不共用響應對象
    redirectAction action跳轉action,不共用響應對象

    建立好的包視圖

    看看他的配置文件
    它的參數(shù)要在action里定義才會生效

    接下來就可以書寫action了
    打開新建好的LoginAction類

    公共封裝方法命名為BaseAction如下

    package business.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class BaseAction extends ActionSupport {protected HttpServletRequest request;protected HttpServletResponse response;protected HttpSession session;protected ServletContext application;public BaseAction() {super();request = ServletActionContext.getRequest();response = ServletActionContext.getResponse();session = request.getSession();application = ServletActionContext.getServletContext();} }

    當struts接受這個action請求時,struts調用 username的get方法把前臺的值傳到action中的username,當action處理完成,要返回到頁面時。在生成jsp的過程中,你可以在頁面中使用EL表達式,${username}進行綁值,這時調用username的set方法。
     在jsp頁面頂部導入el表達式標簽連接

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


     LoginAction類

    package business.action;import model.TUser; import business.dao.UserDAO; import business.factory.DAOFactory;public class LoginAction extends BaseAction {//獲取jsp頁面?zhèn)鬟^來的userid和passwordprivate String userid; private String password;//利用get set方法將值獲取上public String getUserid() {return userid;}public String getPassword() {return password;}public void setUserid(String userid) {this.userid = userid;}public void setPassword(String password) {this.password = password;}public void setErrorsText(String errorsText) {this.errorsText = errorsText;}public void setBackurl(String backurl) {this.backurl = backurl;}private String errorsText;//設置錯誤提示文字private String backurl; //返回地址public String getErrorsText() {return errorsText;}public String getBackurl() {return backurl;}private String requesturl;public String getRequesturl() {return requesturl;}public void setRequesturl(String requesturl) {this.requesturl = requesturl;}/*** @return*/public String execute() {System.out.println("獲取:用戶名"+userid+"密碼:"+password);backurl="login.jsp";//判斷輸入框是否為空if(userid==null ||userid.trim().equals("")){errorsText = "用戶賬號不能為空";return ERROR;}else if(password==null ||password.trim().equals("")){errorsText = "密碼不能為空";return ERROR;}//以數(shù)據(jù)庫數(shù)據(jù)進行對比UserDAO udao = new DAOFactory().getUserDAO();TUser loginUser = udao.login(userid, password);if(loginUser!=null && loginUser.getUsername()!=null){//判斷登陸成功,將用戶名存在session里供后續(xù)操作調用session.setAttribute("loginuser", loginUser);//記錄當前地址requesturl = (String)session.getAttribute("requesturl");return SUCCESS;}else{//失敗則跳轉 fial.jsperrorsText = "登錄失敗";return ERROR;}} }

    success.jsp代碼

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% 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>SSH</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="SSH"></head><body> <h2>當前的登錄用戶為:<span style="color:yellow; font:bold">${loginuser.username} </span></h2>添加user,如果姓名沒有沖突,那么就添加到數(shù)據(jù)庫,如果姓名沖突了就不能添加,返回失敗頁面<form action="add.action" method="get">UserName:<input type="text" name="user.username"><br />UserPassword:<input type="password" name="user.userpassword"><br />UserMessage:<input type="text" name="user.usermessage"><br /><input type="submit" value="提交"> <input type="reset"value="重置"></form>根據(jù)姓名查詢,若不輸入,則查詢全部<form action="query.action" method="post">UserName: <input type="text" name="queryText" value="${searchText }" /><input type="submit" value="查詢" /></form><table width="70%" border="1px" align="center" cellpadding="0"cellspacing="0"><thead><tr bgcolor="#ff0"><th width="25%">編號</th><th width="25%">姓名</th><th width="25%">信息</th><th width="25%">操作</th></tr></thead><tbody><c:forEach var="user" items="${users }"><tr><td>${user.id}</td><td>${user.username}</td><td>${user.usermessage}</td><td><a href="edit.action?param=0&id=${user.id}">編輯</a> <ahref="delete.action?id=${user.id}">刪除</a></td></tr></c:forEach></tbody></table></body> </html>

    fail.jsp代碼

    <%@ page language="java" import="java.util.*" 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> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="fail"></head><body><div style="color:red;">fail</div><br/><center><p><h2>${errorsText}</h2></p></center><div id = "foot"><a href="${backurl}">返回上一頁面</a></div><!-- <a href="query.action?queryText=">返回主頁</a> --> </body> </html>

    建立好如上,運行測試
    輸入為空測試

    輸入賬號密碼測試

    輸入后會報如上錯誤
    經(jīng)過一番上網(wǎng)查詢測試,發(fā)現(xiàn):
    主要 是里面的Structs 1.3 (structs 2)和Hibernate 3.2(或更高版本)中的JAR包里antlr2.7.2 與 antlr2.7.6 沖突,只要刪除Structs 1.3中的低版本的antlr2.7.2就可以了。具體操作如下:在MyEclipse 下,windows–>preferences–>在文本框中搜索struts2–>選擇 antlr2.7.2–>remove

    現(xiàn)在重啟Tomcat再次測試:

    現(xiàn)在登陸成功了,并且獲取到了用戶名。
    在測試查詢時,利用<c:forEach items>查詢多條記錄可以正常使用,但存在的單條記錄會報錯。如下

    經(jīng)過小編多放查證,終于發(fā)現(xiàn):
    在訪問某個頁面出現(xiàn)了上標題所示的異常。一開始我也不知道什么原因,因為后臺已經(jīng)返回了數(shù)據(jù),而且前端的el/jstl表達式都寫的沒毛病。
    后來無意中想到,我這個數(shù)據(jù)是確定的只有一條,但是我還是用的<c:forEach>來寫。然后我把數(shù)據(jù)包裝了一下,雖然只有一條數(shù)據(jù),但是我返回的還是一個list集合就沒問題啦(重新寫了一個接口)

    改變后的action

    測試通過

    項目完整演示:

    注意

    本項目的SSH框架中spring是以單spring框架搭建(單純的整合hibernate數(shù)據(jù)庫連接,其間的接口及其注入配置貌似沒有什么作用,其實實配置不配置程序都能運行。)而在實際項目開發(fā)中多是spring與其他技術架構結合的,比如springMVC、springBoot等等。這些項目框架會在后續(xù)博文中給大家呈現(xiàn)。

    項目中有什么錯誤之處,希望有心之人在評論中指出或私發(fā)消息討論。

    此項目用SSH框架搭建,實現(xiàn)了用戶的登錄、查詢、刪除、添加。
    項目(源碼+數(shù)據(jù)庫)我已上傳至gitee碼云上,有需要的可以進行下載:
    GITEE碼云地址:https://gitee.com/zhangyant/SSHtest
    記得更改hibernate數(shù)據(jù)庫連接(導入sql文件夾中sql語句)。



    另一種ssh架構可參考:https://www.cnblogs.com/acm-bingzi/p/ssh.html
    本人覺得此方法有點難以理解(–^^–)。

    總結

    以上是生活随笔為你收集整理的JAVAweb之SSH框架的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。