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

Java 如何在JSP页面的开头重用相同的代码块?,java,jsp,Java,Jsp,我的公司正在使用JSP,他们在几乎每个页面上都有相同的逻辑,从会话中获取数据并将其分配给某个变量,这样我就可以使用它来呈现页面并传递给JavaScript函数。我想知道我是否可以重构以减少“复制和粘贴” 比如: 我的页面后面需要这个变量,而每个页面都有几乎相同的代码块。如何重用它 在java类中,我可以定义一些字段并在构造函数中初始化它们,我在JSP中有类似的方法吗?我知道这不能直接回答您的问题,但您不应该在JSP中编写java代码/与会话交互。JSP是一种显示技术,应该只用于显示 答案是通

我的公司正在使用JSP,他们在几乎每个页面上都有相同的逻辑,从会话中获取数据并将其分配给某个变量,这样我就可以使用它来呈现页面并传递给JavaScript函数。我想知道我是否可以重构以减少“复制和粘贴”

比如:


我的页面后面需要这个变量,而每个页面都有几乎相同的代码块。如何重用它


在java类中,我可以定义一些字段并在构造函数中初始化它们,我在JSP中有类似的方法吗?

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

答案是通过servlet向JSP公开这些值。 如果您还没有使用作为标准使用模式一部分的框架,请找到一个并学习它。SpringMVC非常好,Struts也可以工作,还有其他几个你可以研究(Google是你的朋友)


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

正如@greybearedgeek所说的,Spring/Struts是最好的选择,但是您的代码已经存在了很多年了,您不能仅仅迁移到Spring或Struts,所以您可以尝试另一种选择
SiteMesh
过滤器。这有点像Java中的母版页

下载图书馆:

在目录
template
中创建页面say
master.jsp
,并使用in-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>
  • defaultdir:模板/母版页的路径
  • 页面:将应用于页面的模板/母版页
  • /Folder_name/*:将应用模板/母版页的URL模式(目录)。如果我们使用/*,则所有请求页都将通过模板,并将应用于所有页面
  • /文件夹\u name2/test.jsp:Template/master page将只呈现文件夹\u 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>

网站
com.opensymphony.sitemesh.webapp.SiteMeshFilter
网站
/*
  • /*:应用于所有页面扩展的模板
  • /.html:仅在html页面上应用于的模板

编写并使用a。感谢您的建议。遗憾的是,遗留代码已经存在多年了,我只是好奇我是否可以轻松地将其重构成另一种方式而不破坏当前的核心逻辑。
<?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> 
<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>