EE JSP:Servlet的反向外套

仅当页面数量少或需要精确控制生成的内容(二进制PDF等)时,才可以从Servlet生成HTML。 对于大多数应用程序,输出将是HTML,我们需要一种更好的方法来完成此操作。 这就是JSP(Java服务器页面)出现的地方。

使用JSP,您可以编写并关注文件中HTML内容。 只有在内容之间需要动态或条件逻辑时,才插入Java代码,称为Scriptlet。 当应用程序服务器处理JSP页面时,它将自动生成一个Servlet类,将这些JSP文件的内容写出(就像您以前用PrintWriter编程编写它一样)。 在JSP中的任何地方,只要有Scriptlet,它都将内联在生成的Servlet类中。 生成的jsp servlet类全部由应用程序中的应用程序服务器自动管理,编译和部署。 简而言之,JSP只不过是Servlet的反向外壳。

这是一个简单的JSP示例,可以打印Hello World和服务器时间戳。

<!DOCTYPE html>
<html><body><p>Hello World!</p><p>Page served on <%= new java.util.Date()%></p></body>
</html>

只需将其另存为基于src/main/webapp maven的文件夹中名为hello.jsp文本文件, hello.jsp在NetBeans IDE中运行。 对于JSP,您不需要像Serlvet中那样配置URL映射,并且可以从上下文路径直接访问URL映射。 例如,以上内容应通过http:// localhost:8080 / hello.jsp URL在浏览器中显示。

请注意,该示例还显示了如何嵌入Java代码。 您可以在<%= %> scriptlet内放置一个方法或对象,它将使用结果对象的toString()方法输出连接到scriptlet标记之外HTML。 您也可以使用<%! %>定义新方法<%! %> <%! %> scriptlet标记,或使用<% %> scriptlet执行任何不会生成输出的代码。 注意,您也可以在JSP中的<%-- --%>脚本之间添加注释。

JSP还允许您插入“页面指令”以控制JSP容器如何呈现结果。 例如,您可以通过将其插入页面顶部来更改结果内容类型

<%@ page contentType="text/txt" %>

另一个经常使用的页面指令是import Java package,因此您不需要在每个Java语句行上添加前缀。

<%@ page imporet="java.util.*" %>...<p>Page served on <%= new Date()%></p>

您可以使用更多指令。 请查看JSP规范文档以获取更多详细信息。

除了插入自己的Java代码外,JSP还预定义了一些变量,您可以在不声明它们的情况下直接访问它们。 这是显示大多数这些内置隐式变量的示例。

<!DOCTYPE html>
<html><body><h1>JSP Examples</h1><p>Implicit Variables</p><table><tr><td>Name</td><td>Instance</td><td>Example</td></tr><tr><td>applicationScope</td><td>${applicationScope}</td><td>${applicationScope['myAppName']}</td></tr><tr><td>sessionSope</td><td>${sessionSope}</td><td>${sessionSope['loginSession']}</td></tr><tr><td>pageScope</td><td>${pageScope}</td><td>${pageScope['javax.servlet.jsp.jspConfig']}</td></tr><tr><td>requestScope</td><td>${requestScope}</td><td>${requestScope['foo']}</td></tr><tr><td>param</td><td>${param}</td><td>${param['query']}</td></tr><tr><td>header</td><td>${header}</td><td>${header['user-agent']}</td></tr><tr><td>cookie</td><td>${cookie}</td><td>${cookie['JSESSIONID']}</td></tr><tr><td>pageContext</td><td>${pageContext}</td><td>${pageContext.request.contextPath}</td></tr></table><p>Page served on <%= new java.util.Date()%></p></body>
</html>

在上面的示例中,我使用JSP表达式语言(EL)语法而不是
<%=%>脚本。 EL更紧凑且更易于阅读,但是它只能读取存在于任何请求,会话或应用程序范围中的变量。 EL使用DOT表示法访问对象变量中的字段甚至嵌套字段。 假设这些字段具有相应的getter方法。 EL还可以使用“ myMap [key]”格式访问地图,或使用“ myList [index]”语法访问列表。 这些隐式变量中的大多数都可以作为Map对象进行访问,它们像在您自己的Servlet类中一样,主要从请求上的ServletHttpRequest对象公开。

JSP可以被视为Web应用程序中的模板语言。 它有助于生成应用程序的“ VIEW”部分。 它使您或团队中的创作者可以专注于HTML以及内容的外观。 它可以帮助更轻松地构建更大的Web应用程序。 不过,在JSP文件中使用过多和复杂的逻辑Java代码时要小心,因为它会使调试和读取变得更加困难。 尤其是当您有抛出异常的Java语句时。 stacktrace中的行号将更难跟踪并与您的Scriptlet代码匹配。 还要想象一下,如果您开始在JSP文件中包含JavaScript代码,那么它可能会变得非常混乱。 最好将它们保存在单独的文件中。 如果必须将Java代码嵌入JSP中,请尝试将其包装在一行Java调用调用中。 更好的方法是,尝试使用Servlet代码处理请求,并通过将它们插入请求作用域空间中,然后将其转发到JSP文件进行渲染,来生成需要在JSP中显示的所有数据。 使用这种模式,您实际上可以限制JSP中scriptlet的使用,并且仅使用EL和JSP标记。

  • 您可以在GitHub的jsp-example中找到上述代码。

翻译自: https://www.javacodegeeks.com/2015/01/ee-jsp-the-reversed-jacket-of-servlet.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

moment 24小时与12小时区别

moment(values.data).format(YYYY-MM-DD HH:mm:ss)--------------24小时 moment(values.data).format(YYYY-MM-DD hh:mm:ss)--------------12小时主要取决于format中的时分秒的大小写

android 自定义xml属性

Android 自定义组件 Android 提供了非常精致的和非常强大的组件化模型&#xff0c;能够更加方便的构建UI,这些UI组件都是基于基本的layout类:View 和 ViewGroup。 部分能够用的widgets包括&#xff1a;Button&#xff0c;TextView,EditText,ListView,CheckBox&#xff0c;Radio…

Neo4j:带密码的TF / IDF(和变体)

几周前&#xff0c;我写了一篇博客文章&#xff0c;介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF&#xff0c;以按情节找到最重要的短语&#xff0c;然后我很好奇在Neo4j中很难做到。 我首先将Wikipedia的TF / IDF示例之一翻译为cypher&#xff0c;以查看该算法的外…

验证码的设计,随机数的生成

只要将charNum改变就可以自定义设计生成随机数的个数。 //获取验证码的代码 void GetValidateCode() { validStr ""; Random rd new Random(); //创建随机数对象 //产生由 charNum 个字母或数字组成的一个字符串 …

There are multiple modules with names that only differ in ca

react antd 警告错误 原因&#xff1a;引用组件的大小写 // 原代码&#xff1a; import AddOrEditFrom from /components/Process/AddOrEditFrom; // 修改后代码 import AddOrEditFrom from /components/Process/AddOrEditFrom;

每个人都必须阅读的10篇Java文章

一个月前&#xff0c;我们发布了每个人都必须阅读的10篇SQL文章列表。 我们相信jOOQ博客上的文章列表将为我们的读者带来非凡的价值。 jOOQ博客是同时关注Java和SQL的博客&#xff0c;因此&#xff0c;一个月后的今天&#xff0c;我们发布了同样令人兴奋的10条Java文章列表&…

LeetCode: Longest Common Prefix

string.erase没掌握好&#xff0c;悲了个剧&#xff0c;2次过 1 class Solution {2 public:3 string longestCommonPrefix(vector<string> &strs) {4 // Start typing your C/C solution below5 // DO NOT write int main() function6 s…

React antd Descriptions span属性无效问题

label“Status” span{3}&#xff0c;但是span为3无效 <Descriptions title"User Info" layout"vertical" bordered><Descriptions.Item label"Product">Cloud Database</Descriptions.Item><Descriptions.Item label&quo…

如何在生产中检测和诊断慢速代码

开发人员面临的最困难的任务之一是查找和诊断生产中运行缓慢的代码。 首先&#xff0c;您如何监控生产代码而不放慢速度&#xff1f; 当然&#xff0c;您无法通过分析器运行生产代码。 即使您具有计时代码的机制&#xff0c;那么如何诊断问题呢&#xff1f; 如果您无法在开发环…

uni-app动态绑定class和style

目录动态绑定calss动态绑定style动态绑定calss class"[{‘类名’:条件},{‘类名’:条件},{‘类名’:条件}]" 为不同条件的image绑定不同的样式 <image class"img1" :class"[{img1:index 0},{img2:index 1},{img3:index 2}]":src"avt…

移动小球

描述 你有一些小球&#xff0c;从左到右依次编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n&#xff0c; 你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边&#xff0c;B X Y表示把小球X移动到小球Y右边。指令保证合法&#xff0c;即X不等于Y。 输入 …

流式传输大数据:Storm,Spark和Samza

有许多分布式计算系统可以实时或近实时处理大数据。 本文将从对三个Apache框架的简短描述开始&#xff0c;并试图对它们之间的某些相似之处和不同之处提供一个快速的高级概述。 阿帕奇风暴 在风暴 &#xff0c;你设计要求的T opology实时计算的图&#xff0c;然后喂到集群&…

那天有个小孩跟我说LINQ(四)

小孩LINQ系列导航&#xff1a;&#xff08;一&#xff09; &#xff08;二&#xff09; &#xff08;三&#xff09; &#xff08;四&#xff09; &#xff08;五&#xff09; &#xff08;六&#xff09; &#xff08;七&#xff09; &#xff08;八&#xff09; 转载于:http…

uniapp使用阿里云多色图标

下载&#xff0c;然后解压 输入cmd&#xff0c;然后enter 输入 npm install -g iconfont-tools 再输入 iconfont-tools&#xff0c;然后一直enter&#xff0c;直到结束 目录会多了个iconfont-weapp文件&#xff0c;点击去找到 iconfont-weapp-icon.css 导入和使用 t-icon开头 接…

针对Java中的XSD验证XML

有许多工具可用于根据XSD 验证XML文档 。 其中包括操作系统脚本和工具&#xff0c;例如xmllint &#xff0c;XML编辑器和IDE&#xff0c;甚至是在线验证器。 由于前面提到的方法的局限性或问题&#xff0c;我发现拥有自己的易于使用的XML验证工具很有用。 Java使编写这样的工具…

细学PHP 09 MySql

1:mysql是什么&#xff1f;答&#xff1a;mysql是一种开源的&#xff0c;小型的数据库和&#xff30;&#xff28;&#xff30;结合的非常紧密 比较流行的LAMP组合 指 linux apache mysql php 2:我怎么样用Mysql&#xff1f;答&#xff1a;下载mysql并安装&#xff0c;装完之后…

修改 this 指向

文章目录前言一、new关键字改变this指向二、 call&#xff08;&#xff09;三、apply&#xff08;&#xff09;四 、bind&#xff08;&#xff09;五、总结前言 修改 this 指向,四种方法 一、new关键字改变this指向 //构造函数版this function Fn(){this.user "追梦子…

默认方法和多重继承

最近卢卡斯JOOQ埃德尔发布和文章有关嵌套类及其使用。 这是一个有趣的话题&#xff0c;他的文章一如既往地有趣并且值得一读。 我只同意一个简短的声明&#xff0c;我们有一个简短的回复链&#xff0c;导致默认方法&#xff0c;以及为什么不能有类似的东西 class Outer {<n…

uniapp uni.request GET方式请求,不能直接传数组解决方法

这里写目录标题目录遇到的问题 GET请求方法传数组解决方案目录 遇到的问题 GET请求方法传数组 想传一个数组&#xff0c;但是后台接受到的数据与浏览器中显示的数据和前台代码传的不一样&#xff1b; 前台代码打印 浏览器显示数据 其中HerbalNameList &#xff0c;变成了字…

休眠CascadeType.LOCK陷阱

介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 &#xff0c;就该分析CascadeType.LOCK行为了。 休眠锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK &#xff0c;因…