如何在JSP页面的开头重用相同的代码块?

时间:2015-02-13 01:57:16

标签: java jsp

我的公司正在使用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中有类似的方法吗?

2 个答案:

答案 0 :(得分:0)

我知道这并没有直接回答你的问题,但是你不应该在JSP中编写java代码/与会话交互。 JSP是一种显示技术,只能用于显示。

答案是通过servlet将这些值公开给JSP。 如果您还没有使用框架作为其标准使用模式的一部分,请找一个并学习它。 Spring MVC非常好,Struts会工作,还有其他几个你可能会调查(Google是你的朋友)。

然后,在JSP中,使用标记库来显示servlet公开的值,并远离在JSP中编写java代码,除非你绝对需要(而且几乎不需要)。

答案 1 :(得分:0)

正如@GreyBeardedGeek所说,Spring / Struts是最好的选择,但你的代码几乎存在多年,你不能只迁移到Spring或Struts,所以还有另一种选择,你可以尝试SiteMesh过滤。这就像Java中的母版页。

下载库:http://goo.gl/6uzwCJ

在目录master.jsp中创建页面说template,并在正文标记中添加您不想复制粘贴的常用逻辑。

<%@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:模板/母版页的路径
  • 页面:将应用于页面的模板/母版页
  • / 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页面的模板。