我的公司正在使用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中有类似的方法吗?
答案 0 :(得分:0)
我知道这并没有直接回答你的问题,但是你不应该在JSP中编写java代码/与会话交互。 JSP是一种显示技术,只能用于显示。
答案是通过servlet将这些值公开给JSP。 如果您还没有使用框架作为其标准使用模式的一部分,请找一个并学习它。 Spring MVC非常好,Struts会工作,还有其他几个你可能会调查(Google是你的朋友)。
然后,在JSP中,使用标记库来显示servlet公开的值,并远离在JSP中编写java代码,除非你绝对需要(而且几乎不需要)。
答案 1 :(得分:0)
正如@GreyBeardedGeek所说,Spring / Struts是最好的选择,但你的代码几乎存在多年,你不能只迁移到Spring或Struts,所以还有另一种选择,你可以尝试SiteMesh
过滤。这就像Java中的母版页。
在目录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>
配置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>