当前位置:  开发笔记 > 前端 > 正文

JSP/Servlet的隐藏功能

如何解决《JSP/Servlet的隐藏功能》经验,为你挑选了1个好方法。

我对编写JSP/Servlet时使用的技巧感兴趣.我将开始:

我最近发现了如何在另一个标记的属性中包含一个JSP标记的输出:


  
    
  
  
    <%-- when using jsp:attribute the body must be in this tag --%>
  

BalusC.. 153

注意:我发现很难想到JSP/Servlet的任何"隐藏功能".在我看来,"最佳实践"是一种更好的措辞,我可以想到它们中的任何一种.它还取决于您使用JSP/Servlet的经验.经过多年的发展,你再也看不到那些"隐藏的特征"了.无论如何,我会列出一些我最近发现的那些小"最佳实践",许多初学者都没有完全意识到这一点.在许多初学者的眼中,这些将被归类为"隐藏的特征".无论如何,这里是列表:)


隐藏直接访问的JSP页面

通过将JSP文件放在/WEB-INF文件夹中,您可以有效地将它们隐藏起来,例如直接访问http://example.com/contextname/WEB-INF/page.jsp.这将导致a 404.然后,您只能通过RequestDispatcherServlet或使用来访问它们jsp:include.


JSP的预处理请求

大多数都知道关于Servlet的doPost()发布进程外的请求(表单提交),但大多数人不知道,你可以使用Servlet的doGet()方法来进程外的JSP的请求.例如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List items = itemDAO.list();
    request.setAttribute("items", items);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

用于预加载一些表格数据,这些数据将在JSTL的帮助下显示c:forEach:


        
${item.id}${item.name}

地图上的这样一个Servlet url-pattern/page(或/page/*),只是调用http://example.com/contextname/page由浏览器地址栏或一个普通的链接来运行它.另请参阅例如Servlet中的doGet和doPost.


动态包括

您可以在jsp:include以下位置使用EL :


bean.getPage()可以只返回一个有效的页面名称.


EL可以访问任何getter

EL本身并不要求要访问的对象是一个完整的 Javabean.存在一个无法参与的方法,该方法以EL 为前缀getis足以在EL中访问它.例如:

${bean['class'].name}

这将返回的值bean.getClass().getName(),其中getClass()方法实际上是从继承Object#getClass().注意,这class是使用"括号表示法"指定的[],原因在于此处提到的EL表达式语言检查实例.

${pageContext.session.id}

这将返回其值pageContext.getSession().getId()在ao中有用的applet可以与servlet的实例进行通信.

${pageContext.request.contextPath}

这将返回其值pageContext.getRequest().getContextPath()在ao中有用如何使用相对路径而不包括上下文根名称?


EL也可以访问地图

以下EL表示法

${bean.map.foo}

解决了bean.getMap().get("foo").如果Map键包含点,则可以使用带括号[]键的"括号表示法" :

${bean.map['foo.bar']}

哪个解决了bean.getMap().get("foo.bar").如果你想要一个动态密钥,也可以使用括号表示法,但是不加引号:

${bean.map[otherbean.key]}

哪个解决了bean.getMap().get(otherbean.getKey()).


使用JSTL迭代Map

您也可以使用c:forEach迭代Map.每次迭代给出了Map.Entry这反过来又getKey()getValue()方法(这样你可以仅通过访问它在EL ${entry.key}${entry.value}).例:


    Key: ${entry.key}, Value: ${entry.value} 

另请参见例如使用jstl进行调试 - 具体如何?


在JSP中获取当前日期

您可以在jsp:useBeanJSTL的帮助下获取当前的日期并进行格式化fmt:formatDate


...

Copyright ©

这打印(截至目前)如下:"Copyright©2010".


简单友好的URL

拥有友好URL的简单方法是使用HttpServletRequest#getPathInfo()隐藏在JSP中的JSP /WEB-INF:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF" + request.getPathInfo() + ".jsp").forward(request, response);
}

例如/pages/*,如果您打开此servlet ,http://example.com/contextname/pages/foo/bar则会有效地显示请求/WEB-INF/foo/bar.jsp.您可以通过拆分pathinfo /并将第一部分作为JSP页面URL并将剩余部分作为"业务操作"(让servlet充当页面控制器)来进一步发展.另请参见例如Design Patterns基于Web的应用程序.


使用重新显示用户输入 ${param}

在JSP中提交表单后${param},引用的隐式EL对象HttpServletRequest#getParameterMap()可用于重新显示用户输入:


这基本上是一样的request.getParameterMap().get("foo").另请参阅例如,在将表单提交到Servlet后,如何在JSP中保留HTML表单字段值?
别忘了防止XSS!见下一章.


JSTL防止XSS

为了防止您的站点进入XSS,您需要做的就是使用JSTL 或(重新)显示用户控制的数据.fn:escapeXmlc:out


交替的LoopTagStatus

varStatusJSTL 的属性c:forEach为您提供了一个LoopTagStatus后退,后者又有几个getter方法(可以在EL中使用!).因此,要检查偶数行,只需检查是否loop.getIndex() % 2 == 0:

...

这将有效地结束

............
    ...

使用CSS为它们提供不同的背景颜色.

tr.even { background: #eee; }
tr.odd { background: #ddd; }

使用以下命令填充List/Array中的逗号字符串LoopTagStatus:

另一个有用的LoopTagStatus方法是isLast():


    ${item}${!loop.last ? ', ' : ''}

这导致了类似的结果item1, item2, item3.


EL功能

您可以将public static实用程序方法声明为EL函数(如JSTL函数),以便可以在EL中使用它们.例如

package com.example;

public final class Functions {
     private Functions() {}

     public static boolean matches(String string, String pattern) {
         return string.matches(pattern);
     }
}

/WEB-INF/functions.tld看起来像如下:




    1.0
    Custom_Functions
    http://example.com/functions

    
        matches
        com.example.Functions
        boolean matches(java.lang.String, java.lang.String)
    

可以用作

<%@taglib uri="http://example.com/functions" prefix="f" %>


    ...


获取原始请求URL和查询字符串

如果已转发JSP,您可以获取原始请求URL,

${requestScope['javax.servlet.forward.request_uri']} 

和原始请求查询字符串,

${requestScope['javax.servlet.forward.query_string']}

到目前为止.也许我迟早会加些更多.



1> BalusC..:

注意:我发现很难想到JSP/Servlet的任何"隐藏功能".在我看来,"最佳实践"是一种更好的措辞,我可以想到它们中的任何一种.它还取决于您使用JSP/Servlet的经验.经过多年的发展,你再也看不到那些"隐藏的特征"了.无论如何,我会列出一些我最近发现的那些小"最佳实践",许多初学者都没有完全意识到这一点.在许多初学者的眼中,这些将被归类为"隐藏的特征".无论如何,这里是列表:)


隐藏直接访问的JSP页面

通过将JSP文件放在/WEB-INF文件夹中,您可以有效地将它们隐藏起来,例如直接访问http://example.com/contextname/WEB-INF/page.jsp.这将导致a 404.然后,您只能通过RequestDispatcherServlet或使用来访问它们jsp:include.


JSP的预处理请求

大多数都知道关于Servlet的doPost()发布进程外的请求(表单提交),但大多数人不知道,你可以使用Servlet的doGet()方法来进程外的JSP的请求.例如:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List items = itemDAO.list();
    request.setAttribute("items", items);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

用于预加载一些表格数据,这些数据将在JSTL的帮助下显示c:forEach:


        
${item.id}${item.name}

地图上的这样一个Servlet url-pattern/page(或/page/*),只是调用http://example.com/contextname/page由浏览器地址栏或一个普通的链接来运行它.另请参阅例如Servlet中的doGet和doPost.


动态包括

您可以在jsp:include以下位置使用EL :


bean.getPage()可以只返回一个有效的页面名称.


EL可以访问任何getter

EL本身并不要求要访问的对象是一个完整的 Javabean.存在一个无法参与的方法,该方法以EL 为前缀getis足以在EL中访问它.例如:

${bean['class'].name}

这将返回的值bean.getClass().getName(),其中getClass()方法实际上是从继承Object#getClass().注意,这class是使用"括号表示法"指定的[],原因在于此处提到的EL表达式语言检查实例.

${pageContext.session.id}

这将返回其值pageContext.getSession().getId()在ao中有用的applet可以与servlet的实例进行通信.

${pageContext.request.contextPath}

这将返回其值pageContext.getRequest().getContextPath()在ao中有用如何使用相对路径而不包括上下文根名称?


EL也可以访问地图

以下EL表示法

${bean.map.foo}

解决了bean.getMap().get("foo").如果Map键包含点,则可以使用带括号[]键的"括号表示法" :

${bean.map['foo.bar']}

哪个解决了bean.getMap().get("foo.bar").如果你想要一个动态密钥,也可以使用括号表示法,但是不加引号:

${bean.map[otherbean.key]}

哪个解决了bean.getMap().get(otherbean.getKey()).


使用JSTL迭代Map

您也可以使用c:forEach迭代Map.每次迭代给出了Map.Entry这反过来又getKey()getValue()方法(这样你可以仅通过访问它在EL ${entry.key}${entry.value}).例:


    Key: ${entry.key}, Value: ${entry.value} 

另请参见例如使用jstl进行调试 - 具体如何?


在JSP中获取当前日期

您可以在jsp:useBeanJSTL的帮助下获取当前的日期并进行格式化fmt:formatDate


...

Copyright ©

这打印(截至目前)如下:"Copyright©2010".


简单友好的URL

拥有友好URL的简单方法是使用HttpServletRequest#getPathInfo()隐藏在JSP中的JSP /WEB-INF:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF" + request.getPathInfo() + ".jsp").forward(request, response);
}

例如/pages/*,如果您打开此servlet ,http://example.com/contextname/pages/foo/bar则会有效地显示请求/WEB-INF/foo/bar.jsp.您可以通过拆分pathinfo /并将第一部分作为JSP页面URL并将剩余部分作为"业务操作"(让servlet充当页面控制器)来进一步发展.另请参见例如Design Patterns基于Web的应用程序.


使用重新显示用户输入 ${param}

在JSP中提交表单后${param},引用的隐式EL对象HttpServletRequest#getParameterMap()可用于重新显示用户输入:


这基本上是一样的request.getParameterMap().get("foo").另请参阅例如,在将表单提交到Servlet后,如何在JSP中保留HTML表单字段值?
别忘了防止XSS!见下一章.


JSTL防止XSS

为了防止您的站点进入XSS,您需要做的就是使用JSTL 或(重新)显示用户控制的数据.fn:escapeXmlc:out


交替的LoopTagStatus

varStatusJSTL 的属性c:forEach为您提供了一个LoopTagStatus后退,后者又有几个getter方法(可以在EL中使用!).因此,要检查偶数行,只需检查是否loop.getIndex() % 2 == 0:

...

这将有效地结束

............
    ...

使用CSS为它们提供不同的背景颜色.

tr.even { background: #eee; }
tr.odd { background: #ddd; }

使用以下命令填充List/Array中的逗号字符串LoopTagStatus:

另一个有用的LoopTagStatus方法是isLast():


    ${item}${!loop.last ? ', ' : ''}

这导致了类似的结果item1, item2, item3.


EL功能

您可以将public static实用程序方法声明为EL函数(如JSTL函数),以便可以在EL中使用它们.例如

package com.example;

public final class Functions {
     private Functions() {}

     public static boolean matches(String string, String pattern) {
         return string.matches(pattern);
     }
}

/WEB-INF/functions.tld看起来像如下:




    1.0
    Custom_Functions
    http://example.com/functions

    
        matches
        com.example.Functions
        boolean matches(java.lang.String, java.lang.String)
    

可以用作

<%@taglib uri="http://example.com/functions" prefix="f" %>


    ...


获取原始请求URL和查询字符串

如果已转发JSP,您可以获取原始请求URL,

${requestScope['javax.servlet.forward.request_uri']} 

和原始请求查询字符串,

${requestScope['javax.servlet.forward.query_string']}

到目前为止.也许我迟早会加些更多.


这是Stackoverflow上最广泛的条目之一.没有你所说的技巧,但是任何值得他们的盐的知识和常识都应该知道.对于交替的表行,最好是使用现代CSS语法并使用tr:nth-​​child(偶数)着色,它使您的HTML输出更加清晰.
永远完美BalusC先生:)

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有