使用JSP_追梦小猿的博客-程序员信息网

技术标签: JSP  java web  

  • 你写的JSP最终会变成一个servlet在Web应用中运行。它与其他servlet非常相似,只不过这个servlet类会由容器为你编写。
  • 容器拿到你在JSP中写的代码,把这些代码转换为一个servlet类源文件,然后再把这个源文件编译为Java Servlet类。
  • 学习JSP就是要搞清楚一点:你的JSP代码在最后的servlet类中扮演什么角色(换句话说,JSP中的元素最后会放在所生成servlet相应源代码中的什么位置)
  • 下面代码是一个Web应用,写了一个计数器普通类,一个JSP页面。你可以建立一个JavaWeb应用,布署到服务器,访问看看效果。

  • Counter.java

package foo;
public class Counter{
    private static int count;

    public static synchronized int getCount(){
        count++;
        return count;
    }
}
  • BasicCounter.jsp
<html>
<body>
    The page count is:
    <%
    out.println(Counter.getCount());
    %>
</body>
</html>
  • 你实验一下,上面代码运行,页面会出现500错误
  • 原因:Counter类在foo包中,但是JSP无法了解这一点。
  • 解决方法:要么导入包,要么在代码中使用完全限定类名。把上面的out语句改成下面这样,就不会出错了,这是完全限定类名:
out.println(foo.Counter.getCount());

使用page指令导入包

  • JSP有很多指令,指令为你提供了一条途径,可以在页面转换时向容器提供特殊的指示。指令有3种:page、include和taglib。现在我们先学习page指令。

  • BasicCounter.jsp

<%@ page import="foo.*" %>
<html>
<body>
    The page count is:
    <%
    out.println(Counter.getCount());
    %>
</body>
</html>
  • 上面相关代码的区别:
    • Java代码放在带百分号的尖括号中间:<%和%>
    • 指令会为元素开始记号再增加一个字符:@
  • 以后只要看到以<%@开始的JSP代码,我们应该知道这是一个JSP指令。

表达式元素

  • 上面的JSP代码还是有out.println()语句。引入JSP,部分原因就是为了避免大量的println()语句出现。
  • 有JSP表达式元素,表达式元素会自动打印放在标记之间的内容。

  • BasicCounter.jsp

<%@ page import="foo.*" %>
<html>
<body>
    The page count is:
    <%= Counter.getCount()%>
</body>
</html>
  • 注意到Java代码的标记与表达式的标记有什么不同
    • Java代码介于带百分号的尖括号中间<% %>
    • 而表达式会为元素的开始记号再增加一个字符:一个等号(=)<%= %>
  • 小总结:到目前为止,我们已经看到了3种不同类型的JSP元素:
    • Java: <% %>
    • 指令: <%@ %>
    • 表达式: <%= %>

表达式容易出现的错误:

  • 不要在表达式的最后加上分号

  • 这样写是正确的:

<%= Counter.getCount()%>
  • 这样写是错误的:
<%= Counter.getCount();%>
  • 因为:容器拿到你在<%=和%>之间键入的所有内容,会把它作为参数传递给打印语句。上面的表达式会转换成下面这行代码:
out.println(Counter.getCount());
  • 你如果放上分号,就成为下面这样,就是错误的:
out.println(Counter.getCount(););

上面计数器不写Counter类,直接在JSP定义一个变量,这样可以吗?

  • BasicCounter.jsp
<html>
<body>
    <%int count=0;%>
    The page count is now:
    <%= ++count %>
</body>
</html>
  • 你写的是JSP,但它会变成一个servlet,要想知道到底发生了什么,唯一的办法是查看容器对你的JSP代码做了什么。
  • 实际生成的servlet源代码读起来会稍微困难一点,略读即可,关键看我们写的相关代码出现在servlet哪个位置。
  • 看Tomcat把JSP转换生成的servlet代码,可以查看tomcat/work/Catalina/localhost/yourWebAppName/org/apache/jsp,里面的源文件。
  • 你会发现,所有scriptlet和表达式代码都放在服务方法中,这说明scriptlet中声明的变量总是局部变量。

需要另一个JSP元素:JSP声明

  • 在scriptlet中声明count,意味着,每次运行服务方法时这个变量都会重新初始化。这说明对于每个请求它都会重置为0。我们需要以某种方式让count成为一个实例变量。

  • 声明的JSP元素。

<%! int count=0; %>
  • 百分号后面要放一个感叹号。
  • JSP 声明用于声明所生成servlet类的成员。这说明变量和方法都可以声明。换句话说,<%!和%>标记之间的所有内容都会增加到类中,而且置于服务方法之外。
  • 这意味着完全可以声明静态变量和方法。
  • 上例的count总是计数为1。有了这个声明元素,你想一下,怎么通过声明元素,能让它有效计数。

  • BasicCounter.jsp,包含变量声明。

    <html>
    <body>
        <%! int count=0; %>
        The page count is now:
        <%= ++count %>
    </body>
    </html>
    • BasicCounter.jsp,增加了方法声明。
    <html>
    <body>
        <%! 
        int doubleCount(){
        count = count*2;
        return count;}
        %>
        <%! int count=1; %>
        The page count is now:
        <%= doubleCount() %>
    </body>
    </html>

    实验:

    • 以下三个JSP页面的代码,这样写对不对?如果不对,你对它进行修改。
    • 代码1
    <html>
    <body>
        Test scriptlets...
        <% int y=5+x; %>
        <% int x=2; %>
    </body>
    </html>
    • 代码2
    <%@ page import="java.util.*" %>
    <html>
    <body>
        Test scriptlets...
        <% ArrayList list = new ArrayLIst();
        list.add(new String("foo"));
        %>
        <%= list.get(0) %>
    </body>
    </html>
    • 代码3

    <html>
    <body>
        Test scriptlets...
        <%! int x = 42; %>
        <% int x = 22; %>
        <%= x %>
    </body>
    </html>











版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ElliotCs/article/details/80152568

智能推荐

LTE-V2X车联网技术、标准、应用_互联互通社区的博客-程序员信息网

摘 要:V2X(vehicle to everything)通信是车联网中实现环境感知、信息交互与协同控制的重要关键技术。大唐电信科技产业集团最早提出并由中国企业主导的LTE-V2X国际...

Visual Studio 2015打开扩展和更新错误,提示未将对象引用到实例_JacksionGT的博客-程序员信息网

第一次打开直接报错:未将对象引用到实例我想着把所有扩展关闭,用不启用插件的方式启动Visual Studio 2015,但是没有找到这种启动方法。第二次,我使用管理员权限启动Visual Studio 2015,打开扩展和更新。首先提示:出错日志:AppData/Roaming/Microsoft/VisualStudio/14.0/ActivityLog.xml,重启可能会帮助解决此

计算机录音机应用程序在哪,windows7如何给电脑录音 windows7录音机在哪_迟趣的博客-程序员信息网

win7系统有自带比较多实用小工具给用户的,比如说录音机等。当我们需要录音的时候,我们可以打开电脑的录音机功能就可以使用了。不过有小伙伴不知道windows7如何给电脑录音,windows7录音机在哪。今天小编就教下大家具体的打开和使用方法。首先先打开录音机:1、点击电脑左下角开始按钮2、点击“所有程序”3、拖动滚动条,找到“附件”并点击打开附件。4、这里就能找到“录音机”,点击即可打开录音机使用...

C语言中数组下标为“-1”的情况(array[-1])_MIRAGE086的博客-程序员信息网

今天看代码的时候无意中看到了一个检测数组越界的代码段:

visual stdio 2010出现错误,无法打开_钱玉鹏的博客-程序员信息网

visual stdio 2010出现错误,无法打开只能重装,没有别的办法

IndexError: list index out of range_长沙有肥鱼的博客-程序员信息网

Traceback (most recent call last): File "C:/Users/liqiang/Desktop/PyTorch_YOLOv3/detect.py", line 145, in &lt;module&gt; print("\t+ Label: %s, Conf: %.5f" % (classes[int(cls_pred)], cls_conf.item()))IndexError: list index out of range出现这个错误的原因...

随便推点

Bazel的安装_csJoax的博客-程序员信息网_bazel安装

这里写自定义目录标题Bazel安装系统软件版本Bazel支持的操作系统Bazel的安装方法Bazel的安装步骤Bazel安装Bazel是一个免费的、用于构建和测试软件的自动化软件工具。由于本人最近正在尝试使用TenorFlow Lite,必须要使用此工具,在此记录该工具的安装过程。Bazel的官网,参考 这儿;Bazel的一些其他的介绍,参考 这儿;安装Bazel的主要参考资料在 这儿。...

1908 逆序对_CCCCDEV_CCCC的博客-程序员信息网

1908 逆序对首先我们得先明白逆序对的概念,在一个正数序列,如果对于一个数,有 一个比它小的且在它后面的数叫做逆序对,这个题,求逆序对的个数这里需要归并排序的方法来做如果我们想将一个序列排成从小到大有序的,那么划分的左右区间也是有序的,我们只需要统计右边区间每一个数分别会与左边区间产生多少逆序对就好了并不难理解这个题的树状数组才是难点,只不过现在还不能做#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;algorithm&g

react native 运行 react-native run-android 启动报错_Eric_7893835的博客-程序员信息网

    在前一天明明开发得很好,react-native run-android一运行就能跑起来,但是第二天开发时运行react-native run-android命令就出现如下错误:报这个的原因有很多,博主没有仔细找具体原因,由于开发时间紧急,发现一个笨的解决方法(下面回答),得以继续开发。FAILURE: Build failed with an exception.* W...

信创时代全面到来 应加快推进国产化替代_互联网科技、的博客-程序员信息网

近年来,伴随着国家政策的大力支持,信创产业迎来了大踏步发展的机遇期。信创产业已成为促进国内信息技术产业高质量发展,构建国内产业大循环的关键环节。核心技术要不来、买不来,只有自主创新、自力更生、奋发图强,发展自主信息技术产业体系,才能实现自主可控,从根本上保障重要领域和关键基础设施的网络安全。加快国产化替代对于信创行业来说,是新的挑战。这其中包括几个方面,第一,是对IT软硬件等不同环节的重构,第二,需要逐步构建起我国自主可控的IT产业标准以及生态。简单来说,应用软件、信息安全、IT基础设置、基础软件四个领域

微信小程序中封装wx.request请求的方法_天天Debug嘛的博客-程序员信息网

为什么要进行封装呢?先看如下代码wx.request({ method: method, url: url, header: { 'content-type': 'application/json' }, data:data, success: res =&gt; { return response(res) }, fail: err =&gt; { return error(err)

TextView话题##显示和点击_娱乐之王的博客-程序员信息网

textview两个#号中间内容为话题,可以点击效果图:demo下载地址:http://download.csdhttp://download.csdn.net/detail/ww96054993/9895463n.net/detail/ww96054993/9895463

推荐文章

热门文章

相关标签