首页 文章

Spring 3 mvc和tiles - 填充* .jsp页面之前有一些数据

提问于
浏览
0

我正在使用Spring 3 mvc和Apache Tiles 3.0 .

我不知道如何在* jsp页面中插入一些数据,稍后我将用于插入模板tile * .jsp页面 .

Tiles defiontions文件如下所示:

<tiles-definitions>
    <definition name="base.definition" template="/WEB-INF/views/layout.jsp">
        <put-attribute name="title" value=""  />
        <put-attribute name="banner" value="/WEB-INF/views/banner.jsp" />
        <put-attribute name="path" value="" />
        <put-attribute name="menu" value="/WEB-INF/views/menu.jsp" />
        <put-attribute name="data" value="" />
        <put-attribute name="position" value="" />
    </definition>   
    <definition name="/" extends="base.definition">
        <put-attribute name="title" value="Home" />
        <put-attribute name="path" value="/WEB-INF/views/path.jsp" />
        <put-attribute name="data" value="/WEB-INF/views/data.jsp" />
        <put-attribute name="position" value="/WEB-INF/views/position.jsp" />
    </definition>   
</tiles-definitions>

我想用一些数据填充“/WEB-INF/views/data.jsp”页面,例如 - 行形式数据库,然后使用它像模板页面的一部分(在这种情况下是它的布局页面) .

Layout.jsp页面如下所示:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!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><tiles:insertAttribute name="title" /></title>
    <link rel="stylesheet" href="<spring:theme code='body' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='page' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='banner' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='path' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='main' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='menu' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='source' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='position' />" type="text/css" />
    <link rel="stylesheet" href="<spring:theme code='data' />" type="text/css" />
</head>

    <body>
        <div id="page">
            <div id="banner">
                <tiles:insertAttribute name="banner" />
            </div>
            <div id="path">
                <tiles:insertAttribute name="path" />
            </div>
            <div id="main">
                <span id="menu">
                    <tiles:insertAttribute name="menu" />
                </span>
                <span id="source">
                    <span id="position">
                        <tiles:insertAttribute name="position" />
                    </span>
<span id="data"> <span id="dataSource"> <tiles:insertAttribute name="data" /> </span> <span id="dataSource"> <tiles:insertAttribute name="data" /> </span> <span id="dataSource"> <tiles:insertAttribute name="data" /> </span> </span> </span> </div> </div> </body> </html>

如果我把 <tiles:insertAttribute name="rowsFromDb" 放在 "/WEB-INF/views/data.jsp" 中我得到了一个错误:

SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.tiles.template.NoSuchAttributeException: Attribute 'rowsFromDb' not found.

我不知道如何将数据发送到此属性'rowsFromDb'!我只知道如何将数据发送到布局页面上的变量(模板 - parrent)

3 回答

  • 3

    如果您打算在属性 rowsFromDb 中保存记录列表,则应在控制器中填充此列表并在模型中设置列表 . 然后在 data.jsp 中,您可以使用 <c:forEach> 标记迭代此列表 . 例如(一个用于说明要点的示例):

    Controller

    @RequestMapping("/listRows")
    public ModelAndView listRows() {
        List<Row> rows = myRepository.getAllRows(); // Hide the DB query code behind a repository
        ModelAndView modelAndView = new ModelAndView("/");
        modelAndView.addObject("rowsFromDb", rows); // Set the data in the model
        return modelAndView;
    }
    

    data.jsp

    <c:forEach items="${rowsFromDb}" var="row">
        <c:out value="${row.someProperty}"/>
    <c:forEach>
    

    您应该避免直接在JSP本身中进行任何数据库查询(并尽可能避免JSP中的任何Java) . JSP应该只处理渲染控制器给出的数据 .

  • 0

    您可以使用Tiles org.apache.tiles.preparer.ViewPreparer 来实现此目的 .

    创建一个在源文件夹中实现 org.apache.tiles.preparer.ViewPreparer 的新类 . 例如:

    package com.example.tiles;
    import ...
    
    public class MyMenuPreparer implements ViewPreparer {
    
       @Override
       public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) {
    
          // The code here will be executed before rendering the view.      
          // For example, you can check for security (Spring Security)
          // or you can execute query to database to retrieve list of menus
    
          ...
    
          // You can add result to your request scope:
          tilesContext.getRequestScope().put("rowsFromDb", result);
    
          // To retrieve the value in a JSP:
          // <c:forEach var="item" items="${rowsFromDb}">
          //    ...
          // </c:forEach>
    
    
          // Or you can add it as attribute for the view
          attributeContext.putAttribute("rowsFromDb", result, true);
    
       }
    
    }
    

    在Tiles定义中,必须在 definition 中添加 preparer 属性,例如:

    <definition name="menu" 
        template="/WEB-INF/layouts/menu.jspx" 
        preparer="com.example.tiles.MyMenuPreparer">
        ...
    </definition>
    
  • 0

    成立的解决方案 . 谢谢大家的帮助!

    控制器中的代码:

    ...

    @RequestMapping(value={"/"},method=RequestMethod.GET)
            public String home(HttpServletRequest request,Model model){
                JdbcTemplate jdbc=new JdbcTemplate(dataSource(request));
    
                String sql="SELECT * FROM products ORDER BY id ASC";        
                List<Product>products=jdbc.query(sql,new ProductMapper());
    
                sql="SELECT * FROM category ORDER BY (id)";
                List<Category>categories=jdbc.query(sql, new CategoryMapper());
    
                model.addAttribute("products", products);
                model.addAttribute("categories",categories);
    
                return "/";
            }
    
            ...
    
    • .jsp页面中的代码
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <c:forEach var="p" items="${products}"> 
        <div id="dataRow">
            <form:form method="POST" action="/shoppingCart">        
                <div id="dataPicture"><img src="<%=request.getContextPath()%>/images/hard_diskovi/${p.getPicture()}"/></div>
                <div id="dataName">${p.getName()}</div>
                <div id="dataPrice">
                    Price: 
                    <fmt:formatNumber minFractionDigits="2" maxFractionDigits="2" value="${p.getPrice()}"/> 
                    euro
                </div>
                <input type="hidden" value="${p.getId()}"/>
                <input id="dataSubmit" type="submit" value="add"/>
            </form:form>
        </div>  
    </c:forEach>
    

    结论:页面的数据不是需要从控制器和目标页面发送的模板,使用'jsp'或'jstl'或...

相关问题