国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
SpringSide3.1.4開發(fā)web(2)
第七步、編寫Action和JSP。在SpringSide 3.1.4.3中,使用的是Struts 2及其Convention插件,已經(jīng)不是前面使用的CodeBehind插件了,關(guān)于Convention插件,這里要再說幾句,該插件的大部分功能和CodeBehind相同,唯一讓人有點迷惑的就是該插件到哪里尋找Action類的問題,它會根據(jù)struts.convention.package.locators屬性的值來決定,在該項目中,其值為“web”,之需要查閱一下struts.xml文件即可知。這說明,Convention會尋找所有包含“web”這個單詞的包,并在該包及其子包中尋找Action類。這也正是Action層的包名為personal.youxia.web的原因。

關(guān)于SpringSide 3種的Struts的探討,大家可以看看我之前寫的一篇文章SpringSide 3 中的 Struts 2

ArticleAction的實現(xiàn)思路如下,修改index.jsp,使其重定向到article.action,該Action默認(rèn)調(diào)用其list方法顯示所有文章,并返回article.jsp作為其視圖。在該視圖上,有添加文章的連接,點擊該連接則訪問article!input.action,這時會調(diào)用ArticleAction的input方法,并返回article-input.jsp作為其視圖,在該視圖中輸入文章的內(nèi)容,點擊保存,調(diào)用article!save.action,這時會調(diào)用ArticleAction的save方法以保存數(shù)據(jù),如果要刪除文章,則調(diào)用article!delete.action,這時會調(diào)用ArticleAction的delete方法。在調(diào)用以上方法的過程中,會自動調(diào)用prepare系列的方法。

因此,該步驟涉及到三個JSP文件和一個Action類,它們分別是
index.jsp
article.jsp
article-input.jsp
ArticleAction.java

index.jsp的修改很簡單,只是讓項目一啟動后就去訪問ArticleAction,而不是默認(rèn)的UserAction。index.jsp的代碼如下:
<% response.sendRedirect("article.action"); %>

這時,重點進(jìn)入到ArticleAction中,創(chuàng)建該Action,其代碼的框架如下:
package personal.youxia.web;

import personal.youxia.entity.entities.Article;

public class ArticleAction extends CrudActionSupport<Article> {

    @Override
    
public String delete() throws Exception {
        
// TODO Auto-generated method stub
        return null;
    }


    @Override
    
public String list() throws Exception {
        
// TODO Auto-generated method stub
        return null;
    }


    @Override
    
protected void prepareModel() throws Exception {
        
// TODO Auto-generated method stub

    }


    @Override
    
public String save() throws Exception {
        
// TODO Auto-generated method stub
        return null;
    }


    
public Article getModel() {
        
// TODO Auto-generated method stub
        return null;
    }


}

可以看到,該Action從CrudActionSupport類繼承,而CrudActionSupport又繼承自ActionSupport,并實現(xiàn)了ModelDriven和Preparable接口,這樣Struts 2的ModelDriven攔截器和Preparable攔截器就會對我們自己的Action發(fā)生作用。CrudActionSupport中的excute方法默認(rèn)的實現(xiàn)是調(diào)用list方法,所以訪問article.action就等于訪問ArticleAction的list方法,該方法的目的是為了列出所有的文章,所以在該方法中使用了ArticleDao的分頁查詢,查詢結(jié)果放在一個page對象中。在Struts 2中,已經(jīng)沒有了ActionForm的概念,可以直接把Action對象傳遞到視圖中,為了能夠在視圖中訪問page對象,只需要把page對象作為ArticleAction的一個屬性即可。先在ArticleAction.java中加入幾行代碼:
    @Autowired
    
private ArticleManager articleManager;

    
public void setArticleManager(ArticleManager articleManager) {
        
this.articleManager = articleManager;
    }
    
    
private Page<Article> page = new Page<Article>(10);
    
    
public Page<Article> getPage() {
        
return page;
    }

可以看到該代碼的作用是為了注入ArticleManager和初始化Page對象,此時list方法的代碼就非常簡單,如下:
@Override
    
public String list() throws Exception {
        page 
= articleManager.getAll(page);
        
return SUCCESS;
    }

由于該方法只是簡單獲取一個頁面的Acticle,所以代碼很簡單,使用articleManager.getAll方法即可。如果要實現(xiàn)復(fù)雜的條件查詢,就需要創(chuàng)建一個包含PropertyFilter對象的列表,然后使用articleManager.search方法進(jìn)行查詢,為了簡化PropertyFilter對象列表的創(chuàng)建,白衣提供了HibernateWebUtils.buildPropertyFilters()靜態(tài)方法供大家使用。

list方法返回的是SUCCESS,因此返回給用戶的視圖頁面為article.jsp,該頁面應(yīng)該存放在WEB-INF目錄的content目錄中,這也是Convention插件的一個特性,這樣用戶就沒有辦法直接訪問到視圖頁面了。在該頁面中,可以通過訪問page對象來顯示數(shù)據(jù),如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<%@ include file="/common/taglibs.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
    
<tr><td><href="article!input.action">添加文章</a></td></tr>
    
<s:iterator value="page.result">
        
<tr>
            
<td>${subject}</td>
            
<td><href="article!delete.action?id=${id}">刪除</a></td>
        
</tr>
        
<tr>
            
<td>${content}</td>
        
</tr>
    
</s:iterator>
</table>
</body>
</html>

如果數(shù)據(jù)庫中有初始數(shù)據(jù)的話,該項目運行效果如下圖:


到目前為止,還沒有涉及到getModel()、prepareModel()、以及prepare系列的方法,但是,一旦需要添加或者刪除文章,這一系列的方法就有作用了。在Struts 2中,由于沒有了ActionForm的概念,所有的頁面?zhèn)魅雲(yún)?shù)都會被注入到Action中,如果不想在Action中搞太多的getter和setter,最有效的方法就是提供一個Model對象,這時候攔截器會把頁面參數(shù)注入到Model中,而在目前的項目中,沒有比Entity類更適合做Model對象的了。通過觀察CrudActionSupport基類,可以發(fā)現(xiàn)只有在執(zhí)行save和input方法之前,才會執(zhí)行prepareModel方法,該方法可以保證getModel方法返回的對象不是一個空指針,而調(diào)用delete方法之前Model對象沒有初始化,但是delete方法只需要一個id作為參數(shù),因此,可以在Action中增加一個id屬性來滿足要求。這時候,有改動的幾行代碼如下:
    private Long id;
    
private Article article;

    
public void setId(Long id) {
        
this.id = id;
    }

    @Override
    
protected void prepareModel() throws Exception {
        
if (id != null) {
            article 
= articleManager.get(id);
        } 
else {
            article 
= new Article();
        }
    }
    
public Article getModel() {
        
return article;
    }

    @Override
    
public String delete() throws Exception {
        articleManager.delete(id);
        
return RELOAD;
    }

這里需要特別關(guān)注的是delete方法返回的值,為RELOAD,這是一個在基類中定義好了的字符串。返回該字符串的目的,是為了在delete方法執(zhí)行完之后,不返回任何視圖頁面,而是以redirect的方式再次調(diào)用article.action,以便顯示刪除文章后的結(jié)果。因此,需要在ArticleAction中使用@Result注解,如下:
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "article.action", type = "redirect") })

經(jīng)過如上修改,這時候再運行應(yīng)用,就發(fā)現(xiàn)能夠刪除文章了。

再來實現(xiàn)添加文章的功能,從上面的article.jsp中可以看出,添加文章的鏈接為article!input.action,此時,會運行ArticleAction的input方法,該方法只是簡單返回article-input.jsp視圖文件作為用戶輸入文章的接口,article-input.jsp的代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form id="inputForm" action="article!save.action" method="post">
<table class="inputView">
    
<tr>
        
<td>主題:</td>
        
<td><input type="text" name="subject" size="40" id="subject" /></td>
    
</tr>
    
<tr>
        
<td>內(nèi)容:</td>
        
<td><textarea name="content" id="subject"></textarea></td>
    
</tr>
    
<tr>
        
<td colspan="2">
            
<input type="submit" value="提交" />  
            
<input type="button" value="取消" onclick="history.back()"/>
        
</td>
    
</tr>
</table>
</form>
</body>
</html>

而ArticleAction中只需要修改如下幾行,由于ModelDriven攔截器已經(jīng)把網(wǎng)頁中傳入的數(shù)據(jù)注入到了article對象中,所以save方法中只需要執(zhí)行簡單的保存操作即可:
    @Override
    
public String input() throws Exception {
        
return INPUT;
    }
    
    @Override
    
public String save() throws Exception {
        articleManager.save(article);
        
return RELOAD;
    }

至于實現(xiàn)文章的修改功能,那也是通過input方法和save方法實現(xiàn)的,只不過此時網(wǎng)頁參數(shù)中會包含一個有效的id,而prepare系列的方法會根據(jù)該id先從數(shù)據(jù)庫中提取數(shù)據(jù),然后顯示在article-input.jsp中,用戶修改后,再調(diào)用save方法保存到數(shù)據(jù)庫中。為減少本博文長度,該功能此處不做示范。

通過上面的步驟可以發(fā)現(xiàn),使用SpringSide 3中推薦的CRUD一體的模式,可以有效減少Action的數(shù)量和JSP文件的數(shù)量,每實現(xiàn)一個增刪查改功能,只需要一個Action和兩個JSP,但是,程序員一定要對其中的數(shù)據(jù)流向有充足的認(rèn)識,才能理清它們之間的關(guān)系,不至于暈頭轉(zhuǎn)向。

到這里大家會發(fā)現(xiàn),ArticleAction誰都可以訪問,一點都不安全,所以第八步我會探討如何讓ArticleAction和SpringSecurity一起工作,至于第九步,當(dāng)然是把項目從單數(shù)據(jù)庫環(huán)境更改到多數(shù)據(jù)庫環(huán)境了。具體內(nèi)容,且看下回分解!
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Struts2 繼承ActionSupport的用處
struts2 validate驗證
struts1中幾種常用的Action
Struts2教程
Struts2的配置文件——struts.xml
struts2類型轉(zhuǎn)換器
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服