2011-06-16 70 views
0

我正試圖接近春天。有關春季入門的其他問題和答案。我不想要「東西」開始,但我必須擁有的東西。
目標與CRUD應用程序非常相似。春天。在瀏覽器上看到一些東西

這裏是我的需求清單:

1)一些「HTML」插件管理表格數據,並形成
無縫集成在春天可能,但能夠做表分頁
2)會話管理的不在意,因爲在春季參考文獻中涵蓋了
3)基本授權系統。我發現容器管理的安全性與基於表單的身份驗證很不兼容。 Spring聲明具有簡化但功能強大的安全性,而且我只需要管理用戶和「超級用戶」帳戶。我可以去春季嗎?
4)我學會了JPA2。我有非常基本的數據庫訪問需求。我應該留在JPA還是休眠?
5)我不需要開始。網絡流量是一個相當重要的學習項目。我需要它嗎? AOP相同。我需要它嗎?

然而,把東西在屏幕上,我主要關注的是點1

小到中型的應用,例如有點「地址簿應用程序」,但將有一個分頁程序。我需要知道,我將能夠做到這一點,我將不再需要在架構另一個開關。*提前
感謝

*架構交換機例如 「好了,你需要JSF是有縫更好​​地整合,而JSF不處理文件上傳實際上每個人都使用,所以你必須也把那個實際上是更好的,你currenty不使用maven管理ICEFaces的......」無休止的故事

回答

4

看看在Spring Roo。發出命令並查看它做了什麼是探索典型java堆棧應用程序的好方法。例如,告訴它使用hibernate設置持久性,並查看創建的配置文件。告訴它創建一個MVC控制器並查看創建的文件。至少給你一些關於什麼是大型建築模塊的指示,真的很方便。另外,如果你學習Roo,它會爲你寫80%的代碼!

+0

我不需要另一個「東西」來安裝。我已經走得太遠了,問題是:爲了簡化事情安裝了spring。沒有找到我正在尋找的東西,這是一個全面的應用程序(UI工具在哪裏?),答案是在春天之上安裝一些東西......(roo)。也許roo真的很簡單,並且「做」了一些工作,但可能它使用它的首選libraries.say GWT.well,我沒有打算使用gwt,我希望春天能夠解決一些基本的UI問題。盒子的意思是不需要安裝一個(很簡單但是)需要安裝B的那個... – AgostinoX 2011-06-17 07:45:45

+0

@AgostinoX:你可以使用Roo來產生GWT的gui,但是這在onyl的一個選項中,另外一個是產生正常的HTML gui(wihtout GWT) – Ralph 2011-06-17 07:50:31

+0

@AgostinoX:如果你正在尋找一些輕鬆而又容易學習的曲線,那就忘了Spring吧。 Spring和它的邊項目(Spring Security就是你的情況)可以完成你想要的所有事情,但要做一些工作並不是一天的工作。您必須首先了解其核心概念,使用將處理所需功能不同方面的不同組件,然後將這些組件的原型組合在一起。這是值得的恕我直言,但不要指望一些非常簡單和快速的東西。併爲Roo +1。 – abalogh 2011-06-17 09:42:28

2

有兩種不同的方式有pageination彈簧:

  • 使用額外的JSP組件如Display Tag libary - 這可能是很容易的,因爲在JSP庫可以(但不是必須)完全處理分頁本身(缺點:您需要加載的所有項目爲每個請求或需要的地方(例如存儲項目在會議))
  • 通過自己的控制器實現它:我是如何在一個就是這麼做例如在我的應用程序中,它基於Roo結構(請參閱joeslice的回答)。 DAO層是用Hades實現的,但是你可以不用。至少它只是說明控制器是如何工作的(我想這就是你要求的)。

控制器:

@RequestMapping("/users") 
@Controller 
public class UserController { 

@RequestMapping(method = RequestMethod.GET) 
public ModelAndView list(
     @RequestParam(value = "page", required = false) Integer page, 
     @RequestParam(value = "size", required = false) Integer size) { 

    if (page != null || size != null) { 
     Page<User> userPage = this.userDao.readAll(buildPageAble(page, size)); 

     ModelMap uiModel = pagingProperties(userPage); 
     uiModel.addAttribute("users", userPage.asList()); 
     return new ModelAndView("users/list", uiModel); 
    } else { 
     return new ModelAndView("users/list", "users", this.userDao.readAll()); 
    } 
} 

private PageRequest buildPageAble(Integer pageOrNull, Integer sizeOrNull) { 
    int page = (pageOrNull != null) ? pageOrNull : 1; 
    int size = (sizeOrNull != null) ? sizeOrNull : DEFAULT_PAGE_SIZE; 
    return new PageRequest(page - 1, size); 
} 

private ModelMap pagingProperties(Page<?> pagedResult) { 
    ModelMap uiModel = new ModelMap(); 
    uiModel.addAttribute("page", pagedResult.getNumber()); 
    uiModel.addAttribute("size",pagedResult.getSize());   
    uiModel.addAttribute("maxPages", pagedResult.getTotalPages());   
    return uiModel; 
} 
} 

PagePageRequest是對象提供了通過陰間。如果你不使用哈迪斯,你可以很容易地用你自己的東西來替換它。page-1 in buildPageAble是因爲Roo的前端基礎使用1作爲第一頁,但Hades使用0作爲第一個頁面。

JSP基於Spring Roo,但您可以複製它並在沒有Roo的情況下使用它。

用戶列表JSPX:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<div xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:page="urn:jsptagdir:/WEB-INF/tags/form" xmlns:table="urn:jsptagdir:/WEB-INF/tags/form/fields" version="2.0"> 
    <jsp:directive.page contentType="text/html;charset=UTF-8"/> 
    <jsp:output omit-xml-declaration="yes"/> 
    <page:list id="pl_com_queomedia_cfmt_core_domain_User" items="${users}"> 
     <table:table data="${users}" id="l_com_queomedia_cfmt_core_domain_User" path="/users" typeIdFieldName="businessId"> 
      <table:column id="c_com_queomedia_cfmt_core_domain_User_firstName" property="firstName"/> 
      <table:column id="c_com_queomedia_cfmt_core_domain_User_lastName" property="lastName"/> 
      <table:column id="c_com_queomedia_cfmt_core_domain_User_login" property="login"/> 
      <table:column id="c_com_queomedia_cfmt_core_domain_User_emailAddress" property="emailAddress" maxLength="25"/> 
     </table:table> 
    </page:list> 
</div> 

這裏使用了小豆標籤,重要的是UTIL:田野使用分頁:表,因爲它的尋呼東西添加到輸出:

字段:表.tagx

... 
<c:if test="${not empty param.page}"> 
    <input name="page" type="hidden" value="1" /> 
</c:if> 
<c:if test="${not empty param.size}"> 
    <input name="size" type="hidden" value="${fn:escapeXml(param.size)}" /> 
</c:if> 
... 
<c:if test="${not empty maxPages}"> 
    <util:pagination maxPages="${maxPages}" page="${param.page}" size="${param.size}" /> 
</c:if> 
... 

UTIL:pagination.tagx

<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:spring="http://www.springframework.org/tags" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> 
    <jsp:output omit-xml-declaration="yes" /> 

    <jsp:directive.attribute name="maxPages" type="java.lang.Integer" required="true" rtexprvalue="true" description="The maximum number of pages available (ie tableRecordCount/size)" /> 
    <jsp:directive.attribute name="page" type="java.lang.Integer" required="false" rtexprvalue="true" description="The current page (not required, defaults to 1)" /> 
    <jsp:directive.attribute name="size" type="java.lang.Integer" required="false" rtexprvalue="true" description="The number of records per page (not required, defaults to 10)" /> 
    <jsp:directive.attribute name="render" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate if the contents of this tag and all enclosed tags should be rendered (default 'true')" /> 

    <c:if test="${empty render or render}"> 

    <c:if test="${empty page || page lt 1}"> 
     <c:set var="page" value="1" /> 
    </c:if> 

    <c:if test="${empty size || size lt 1}"> 
     <c:set var="size" value="10" /> 
    </c:if> 

    <spring:message code="list_size" var="list_size" htmlEscape="false" /> 
    <c:out value="${list_size} " /> 

    <c:forEach var="i" begin="5" end="25" step="5"> 
     <c:choose> 
     <c:when test="${size == i}"> 
      <c:out value="${i}" /> 
     </c:when> 
     <c:otherwise> 
      <spring:url value="" var="sizeUrl"> 
      <spring:param name="page" value="1" /> 
      <spring:param name="size" value="${i}" /> 
      </spring:url> 
      <a href="${sizeUrl}">${i}</a> 
     </c:otherwise> 
     </c:choose> 
     <c:out value=" " /> 
    </c:forEach> 
    <c:out value="| " /> 

    <c:if test="${page ne 1}"> 
     <spring:url value="" var="first"> 
     <spring:param name="page" value="1" /> 
     <spring:param name="size" value="${size}" /> 
     </spring:url> 
     <spring:url value="/resources/images/resultset_first.png" var="first_image_url" /> 
     <spring:message code="list_first" var="first_label" htmlEscape="false" /> 
     <a class="image" href="${first}" title="${fn:escapeXml(first_label)}"> 
     <img alt="${fn:escapeXml(first_label)}" src="${first_image_url}" /> 
     </a> 
    </c:if> 
    <c:if test="${page gt 1}"> 
     <spring:url value="" var="previous"> 
     <spring:param name="page" value="${page - 1}" /> 
     <spring:param name="size" value="${size}" /> 
     </spring:url> 
     <spring:url value="/resources/images/resultset_previous.png" var="previous_image_url" /> 
     <spring:message code="list_previous" var="previous_label" htmlEscape="false" /> 
     <a class="image" href="${previous}" title="${fn:escapeXml(previous_label)}"> 
     <img alt="${fn:escapeXml(previous_label)}" src="${previous_image_url}" /> 
     </a> 
    </c:if> 
    <c:out value=" " /> 
    <spring:message code="list_page" arguments="${page},${maxPages}" argumentSeparator="," /> 
    <c:out value=" " /> 
    <c:if test="${page lt maxPages}"> 
     <spring:url value="" var="next"> 
     <spring:param name="page" value="${page + 1}" /> 
     <spring:param name="size" value="${size}" /> 
     </spring:url> 
     <spring:url value="/resources/images/resultset_next.png" var="next_image_url" /> 
     <spring:message code="list_next" var="next_label" htmlEscape="false" /> 
     <a class="image" href="${next}" title="${fn:escapeXml(next_label)}"> 
     <img alt="${fn:escapeXml(next_label)}" src="${next_image_url}" /> 
     </a> 
    </c:if> 
    <c:if test="${page ne maxPages}"> 
     <spring:url value="" var="last"> 
     <spring:param name="page" value="${maxPages}" /> 
     <spring:param name="size" value="${size}" /> 
     </spring:url> 
     <spring:url value="/resources/images/resultset_last.png" var="last_image_url" /> 
     <spring:message code="list_last" var="last_label" htmlEscape="false" /> 
     <a class="image" href="${last}" title="${fn:escapeXml(last_label)}"> 
     <img alt="${fn:escapeXml(last_label)}" src="${last_image_url}" /> 
     </a> 
    </c:if> 
    </c:if> 
</jsp:root> 
+0

感謝您的回答。這個問題並不合適如何做分頁,但是在項目中包含的確切技術集合是什麼,以確保分頁和其他CRUD功能和授權將成爲可能。當你的項目完成一半時沒有堆棧技術的改變。 – AgostinoX 2011-06-17 09:05:09

+0

是否有使用彈簧面的分頁設備? (jsf本身並不可用,因爲它們缺少上傳等功能) – AgostinoX 2011-06-17 09:14:12

+0

@AgostinoX:我不知道,我從來沒有用過春天的臉。 – Ralph 2011-06-17 11:19:55

相關問題