6

Tile3 を使用する Spring MVC アプリケーションがあります。現在 tile3 によって提供されている Web サイトのテンプレートにそれらを埋め込む必要がある多くの静的ページがあります。(すべてのページに同じフッターとヘッダーを動的または静的に配置する必要がありますが、静的ページのアドレス指定を行う方法がわかりません)。

静的ページの例は、index.jsp と aboutus.jsp です。これらの静的ページにアクセスするにはどうすればよいですか? コントローラーを介して行う必要がありますか?

jsp:include を使用できることはわかっていますが、それは良い習慣ですか? タイルを使用しているため、代替手段はありませんか?このチュートリアルでは、個別のコントローラーを使用することを提案しましたが、それが最適なソリューションになるかどうかはわかりません. 不要なリクエストをサーバーに送信するためです。

タイル以外の良い方法があれば教えてください

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


   <listener>
       <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
   </listener>
   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/springapp-servlet.xml</param-value>
    </context-param>



</web-app>

tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
  "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
  "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>
    <definition name="baseLayout" template="/WEB-INF/templates/baseLayout.jsp">
        <put-attribute name="title" value="Title is here (Tile)"/>
           <put-attribute name="header" value="header.jsp"/>
              <put-attribute name="menu" value="Title is here (Tile)"/>
                 <put-attribute name="body" value="Title is here (Tile)"/>
                 <put-attribute name="footer" value="footer.jsp"/>

    </definition>

    <definition name="hello" extends="baseLayout">
        <put-attribute name="title" value="HELERE"/>
          <put-attribute name="body" value="/WEB-INF/pages/pages/ewfsdfsdf.jsp"/>
    </definition>

        <definition name="index" extends="baseLayout">
        <put-attribute name="title" value="HELERE"/>
          <put-attribute name="body" value="/WEB-INF/pages/index.jsp"/>
    </definition>
</tiles-definitions>

コントローラ

@Controller
public class HelloController {

    protected final Log logger = LogFactory.getLog(getClass());

    public HelloController() {
        System.err.println("Constructor of HelloController");
    }

    @RequestMapping("/index.htm")
    public String index(){
        System.err.println("in index method");
        return "index";
    }

baseLayout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="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>
</head>
<body>
      <div id="container">
         <tiles:insertAttribute name="header"/>
         <tiles:insertAttribute name="menu"/>
         <tiles:insertAttribute name="body"/>
         <tiles:insertAttribute name="footer"/>
      </div>
</body>
</html>

index.jsp

<p>

This is the body of index page

</p>

JSP:インクルードの使用

   pros
     - No extra load neither on DB nor on server
   cons
     - To backup need to backup all static files
     - Might have overwork as each page should be prepared separately rather than having a single template for all pages and just populate the template
     - If need to add something to static pages need to change all pages.
4

3 に答える 3

4

サーブレットで使用できる静的ページを処理するための優れたソリューションを見つけました<mvc:view-controller>。サンプル コードはhereおよびhere です。Tiles で動作するだけでなく、ファイルdefinitionに各パスがあることを確認してください。tiles.xml

 <mvc:view-controller path="/index" />
 <mvc:view-controller path="/"  view-name="index"/>
于 2015-06-17T02:30:34.990 に答える
2

あなたが行った方法は機能するはずですが、静的ページごとに新しい Mapper 関数を作成することはお勧めできません。あなたができることはあなたのコントローラーにあります

@RequestMapping("/page/{viewName}.htm")
public String index(@PathVariable(value="viewName") String viewName, Model model){
    if(isValidView(viewName)){
        model.addAttribute("viewName", viewName);
        return "page";
    }

    return null;
}

ただし、viewName が有効であることを確認する必要があります。そうしないと、セキュリティの問題が発生します。

こちらの記事もお読みください

編集

isValidView 関数は、同じクラスまたは BaseController クラスのいずれか、または DB をチェックするためのサービス呼び出しのいずれかに移動できます。ファイルが存在することを確認することは、リソースを消費するためではなく、本番サーバーではパスが異なる可能性があるため、お勧めできません。

静的ページの本文が単なる HTML の場合、コンテンツを DB にロードして実行できます。

<jsp:include page="/WEB-INF/pages/header.jsp"/>
${htmlContent}
<jsp:include page="/WEB-INF/pages/footer.jsp"/>

または、体を動的に保ちたい場合。

tiles.xmlの場合、持つことができます

<definition name="pageLayout" extends="baseLayout">
    <put-attribute name="title" value="HELERE"/>
      <put-attribute name="body" value="/WEB-INF/page.jpg"/>
</definition>

page.jsp

<jsp:include page="/WEB-INF/pages/header.jsp"/>
<jsp:include page="/WEB-INF/pages/page/${viewName}.jsp"/>
<jsp:include page="/WEB-INF/pages/footer.jsp"/>
于 2015-03-04T02:19:31.117 に答える
1

いつでもすべてを baseLayout ページにロードして、より高いレベルを作成できます。つまり、次のようなものです。

<div id=header> <tiles:insertAttribute name="header" /></div>
<div id=header> <tiles:insertAttribute name="menu" /></div> <iframe id='dynFrame' contenteditable="true"></iframe>' <div id=footer> <tiles:insertAttribute name="footer" /></div>

これで、次のような簡単なスクリプトを使用して、メニュー クリックからこの iframe にコンテンツをロード loadPage(pageLink); できます。関数のコンテンツについては、次$("#dynFrame").attr("src",pageLink);
のようになります。メニュー クリックは、loadPage 関数に URL を渡すことができます。ロードしたい。

これが役立つことを願っています。

于 2015-03-12T13:38:52.997 に答える