我正试图接近春天。关于弹簧入门还有其他问题和答案。我不想要“某事”开始,而是我必须拥有的东西 目标与CRUD应用程序非常相似。
以下是我的需求清单:
1)一些“html”小部件来管理表格数据和表格
尽可能无缝地集成在弹簧中,但能够进行表格分页
2)会话管理不是问题,因为在春季参考文献中有所涉及
3)基本授权系统。我发现容器管理的安全性与基于表单的身份验证很差地集成在一起。 Spring声称具有简化但功能强大的安全性,我只需要管理用户和“高级用户”帐户。我可以去春天吗?
4)我学习了JPA2。我有非常基本的数据库访问需求。我应该继续使用JPA还是冬眠?
5)我不需要开始。网络流程是一个非常重要的项目。我需要它吗? AOP一样。我需要它吗?
一个小型到中型的应用程序,例如一个小的“地址簿应用程序”,但它将有一个分页器。我需要知道我能够做到这一点,并且我不需要在架构中进行另一次切换。*
提前谢谢
*架构交换机示例 “那么你需要更好地与seam集成的JSF,并且jsf不会处理实际上每个人都使用的文件上传,所以你必须放置实际上由maven更好地管理的ICEFaces,你当前没有使用它们。 “无尽的故事
答案 0 :(得分:4)
看看Spring Roo。发出命令并查看它所做的是探索典型java-stack应用程序的功能的好方法。例如,告诉它使用hibernate设置持久性,并查看创建的配置文件。告诉它创建一个MVC控制器并查看创建的文件。至少能给你一些关于什么是大型构建块的指示是非常方便的。此外,如果您学习Roo,它将为您编写80%的代码!
答案 1 :(得分:2)
有两种不同的方式可以使用spring进行分页:
控制器:
@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;
}
}
Page
和PageRequest
是哈迪斯提供的对象。如果您不使用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>