弹簧。看到浏览器上的内容

时间:2011-06-16 19:39:53

标签: html spring toolkit

我正试图接近春天。关于弹簧入门还有其他问题和答案。我不想要“某事”开始,而是我必须拥有的东西 目标与CRUD应用程序非常相似。

以下是我的需求清单:

1)一些“html”小部件来管理表格数据和表格
尽可能无缝地集成在弹簧中,但能够进行表格分页 2)会话管理不是问题,因为在春季参考文献中有所涉及 3)基本授权系统。我发现容器管理的安全性与基于表单的身份验证很差地集成在一起。 Spring声称具有简化但功能强大的安全性,我只需要管理用户和“高级用户”帐户。我可以去春天吗?
4)我学习了JPA2。我有非常基本的数据库访问需求。我应该继续使用JPA还是冬眠? 5)我不需要开始。网络流程是一个非常重要的项目。我需要它吗? AOP一样。我需要它吗?

然而,为了在屏幕上放置一些东西,我主要担心的是第1点。

一个小型到中型的应用程序,例如一个小的“地址簿应用程序”,但它将有一个分页器。我需要知道我能够做到这一点,并且我不需要在架构中进行另一次切换。*
提前谢谢

*架构交换机示例 “那么你需要更好地与seam集成的JSF,并且jsf不会处理实际上每个人都使用的文件上传,所以你必须放置实际上由maven更好地管理的ICEFaces,你当前没有使用它们。 “无尽的故事

2 个答案:

答案 0 :(得分:4)

看看Spring Roo。发出命令并查看它所做的是探索典型java-stack应用程序的功能的好方法。例如,告诉它使用hibernate设置持久性,并查看创建的配置文件。告诉它创建一个MVC控制器并查看创建的文件。至少能给你一些关于什么是大型构建块的指示是非常方便的。此外,如果您学习Roo,它将为您编写80%的代码!

答案 1 :(得分:2)

有两种不同的方式可以使用spring进行分页:

  • 使用其他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是哈迪斯提供的对象。如果您不使用Hades,您可以轻松地用自己的东西替换它。 page-1中的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>

这使用Roo标签,重要的是util:字段:table使用的分页,因为它将分页内容添加到输出中:

字段:table.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>