簡體   English   中英

如何在JSP頁面的開頭重用相同的代碼塊?

[英]How to reuse the same code block at the beginning of JSP page?

我的公司使用的是JSP,幾乎每個頁面上都有從會話中獲取數據並將其分配給某個變量的幾乎相同的邏輯,以便我可以用來呈現頁面並傳遞給JavaScript函數。 我想知道我是否可以重構以減少“復制粘貼”

喜歡:

<%
String attr1= (String) session.getAttribute("attr1");//

boolean isEnglishVersion = "en".equals(session.getAttribute("Lang"));//Get lang version, needed when rendering page

MobileGameMeta meta= (MobileGameMeta) session.getAttribute("meta");

String strFieldId = request.getParameter("id");

MobileGameField field = //use attr1 and meta to build this field, this is needed when call JavaScript function

JSONObject parameters = HTTPUtil.parseParameterMap2JSONObject((Map<String, String[]>) request.getParameterMap()); //needed when call JavaScript function

%>

我的頁面后面需要此變量,而每個頁面將具有幾乎相同的代碼塊。 如何重用?

在java類中,我可以定義一些字段並在構造函數中初始化它們,我在JSP中也有類似的方法嗎?

我知道這不能直接回答您的問題,但是您不應該編寫Java代碼/在JSP中與會話進行交互。 JSP是一種顯示技術,應僅用於顯示。

答案是通過servlet將這些值公開給JSP。 如果您尚未使用作為標准使用模式一部分進行此操作的框架,請查找並學習它。 Spring MVC非常好,Struts可以正常工作,您可能還要調查其他幾個問題(Google是您的朋友)。

然后,在您的JSP中,使用標簽庫顯示servlet公開的值,除非您絕對需要(並且幾乎不需要),否則不要在JSP中編寫Java代碼。

正如@GreyBeardedGeek所說,Spring / Struts是最好的選擇,但是您的代碼已經存在了好幾年了,您不能只遷移到Spring或Struts,所以還有另一種選擇可以嘗試SiteMesh過濾器。 這有點像Java的母版頁。

下載庫: http : //goo.gl/6uzwCJ

在目錄template創建master.jsp頁面,並在body標簽中添加您不想復制粘貼的常見邏輯。

<%@taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jstl/fmt" prefix="fn" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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><decorator:title/></title>
   </head>
   <body>
      <decorator:body/>
   </body>
</html>

現在,在WEB-INF文件夾中創建decorators.xml文件,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/template">
    <decorator name="main" page="master.jsp">
       <pattern>/Folder_name/*</pattern>
       <pattern>/Folder_name2/test.jsp</pattern>
    </decorator>
</decorators> 
  • defaultdir:模板/母版頁的路徑
  • page:將應用於頁面的模板/母版頁
  • / Folder_name / *:將在其上應用模板/母版頁的URL模式(目錄)。如果我們使用/ *,則所有請求頁面都將通過該模板,並將其應用於所有頁面。
  • /Folder_name2/test.jsp:模板/母版頁將僅呈現Folder_name2目錄的test.jsp文件。 其他文件將顯示為普通頁面。

配置web.xml文件。 將以下代碼附加在web.xml文件中。

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • / *:模板應用於所有頁面擴展。
  • /.html:模板僅應用於html頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM