JSP基本语法

  记录一下自己复习到的知识点,以后看起来也方便。

  指令

  JSP中三个指令,page,include,taglib

page 用于定义页面相关的信息,比如下面的代码:

<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>

  language定义了页面的使用语言;

  import引用页面中使用的工具类;

  contentType定义页面的编码格式;

  pageEncoding定义JSP的编码格式。

inlcude 指令用于引用其他的JSP页面;taglib 指令用于定义标签,在struts中比较常用。

  注释

  在JSP中有几种注释:

  1 HTML版:

<!-- 客户端可见 -->

  这种注释在查看html代码时,是可以看到的。

  2 JSP版:

<%-- 客户端不可见 --%>

  3 JAVA版:

//单行注释 ————————————————快捷键ctrl+/
/* 多行注释 ____________快捷键ctrl+shift+/ */ 

  标签

  如何在HTML中使用JSP语句呢,JSP中有以下几种标签:

  1 定义变量、函数标签

    <%!
        String s = "xingoo";//声明变量
        int add(int a,int b){//声明函数
            return a+b;
        }
    %>

  在这种标签下定义的内容,会当做变量和方法,其他部分的JSP可以随意的引用。

  2 JSP主体

    <%

        out.println("s="+s+"<br>");
    
        out.println("<h1>test for buffer</h1>");
        out.println("没那么简单<br>");
    
    %>

  这种标签时主要的逻辑处理区域。

  3 JSP输出

    s=<%=s %><br> <%--表达式不以分号结束 --%>
    1+2=<%=add(1,2) %><br>

  这种可以直接输出变量的值,以及方法的返回值。

  JSP中的内置对象

  JSP中有一些内置的对象,可以直接使用:

  1 out  输出内容

  2 request 请求对象,获取请求的相关信息

  3 response 应答对象,设置响应的内容及信息

  4 session 会话对象

  5 application

  6 Page

  7 pageContext

  8 exception

  9 config

  先说说前面三个,其他的后面继续。

  out对象

  out对象可以直接把信息输出到页面中,在输出到页面之前,out中的内容被放置在缓冲区中,缓冲区大小为8192个字节。

  下面是out对象常用的方法:

    缓冲区大小:<%=out.getBufferSize() %>byte<br>
    <%
        out.println("s="+s+"<br>");
    
        out.println("<h1>test for buffer</h1>");
        out.println("没那么简单<br>");
        out.flush();
        //out.clear();
        out.clearBuffer();
        out.println("就能找到聊得來的伴<br>");    
    %>
    缓冲区大小:<%=out.getBufferSize() %>byte<br>
    缓冲区剩余大小:<%=out.getRemaining() %>byte<br>
    是否自动清空:<%=out.isAutoFlush() %>

  getBufferSize()方法用于获取当前缓冲区的大小;

  println()方法用于向页面打印内容;

  flush()方法用于刷新缓冲区,把缓冲区中的内容刷到页面中,并清空缓冲区;

  clear()方法用于清空缓冲区,如果flush之后调用该方法会报错。

  clearBuffer()方法用于清空缓冲区,如果flush之后不会报错。

  getRemaining()方法用于获取当前剩余的缓冲区大小;

  isAutoFlush()方法用于判断是否自动清空缓冲区;

  参考代码:

<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>
    <%-- 
    language 脚本使用的语言
    import 加载类文件
    contentType 编码方式
     --%>
<!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>out内置对象</title>
</head>
<body>
    <h1>JSP</h1>
    缓冲区大小:<%=out.getBufferSize() %>byte<br>
    <!-- 客户端可见 -->
    <%-- 客户端不可见 --%>
    <%!
        String s = "xingoo";//声明变量
        int add(int a,int b){//声明函数
            return a+b;
        }
    %>
    s=<%=s %><br> <%--表达式不以分号结束 --%>
    1+2=<%=add(1,2) %><br>
    <%
        //单行注释 ————————————————快捷键ctrl+/
        /* 多行注释 ____________快捷键ctrl+shift+/ */ 
        out.println("s="+s+"<br>");
    
        out.println("<h1>test for buffer</h1>");
        out.println("没那么简单<br>");
        out.flush();
        //out.clear();
        out.clearBuffer();
        out.println("就能找到聊得來的伴<br>");    
    %>
    缓冲区大小:<%=out.getBufferSize() %>byte<br>
    缓冲区剩余大小:<%=out.getRemaining() %>byte<br>
    是否自动清空:<%=out.isAutoFlush() %>
</body>
</html>

  运行结果:

  request内置对象

  request对象,通常用于进行请求的处理。比如提交表单后,通过request对象提取表单中的内容。

  例如有如下的注册表单:

<%@ page language="java" contentType="text/html; charset=utf-8"
    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>用户登录</title>
</head>
<body>
    <h1>用户注册</h1>
    <hr>
    <form name="regForm" action="jspRequest.jsp" method="post">
        <table>
            <tr>
                <td>username</td>
                <td><input type="text" name="username"/></td>
            </tr>
            <tr>
                <td>favorite</td>
                <td>
                    <input type="checkbox" name="favorite" value="read"/>read
                    <input type="checkbox" name="favorite" value="music"/>music
                    <input type="checkbox" name="favorite" value="movie"/>movie
                    <input type="checkbox" name="favorite" value="game"/>game
                </td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="submit"/></td>
            </tr>
        </table>
    </form>
    <br>
    <br>
    <a href="jspRequest.jsp?username=lisi">url test request(en)</a><br>
    <a href="jspRequest.jsp?username=李四">url test request(zh)</a>
</body>
</html>

  在jsp中可以使用setCharacterEncoding("")设置编码格式后,通过getParameter或者getParametervalues获取指定名称的内容。

    <%
        request.setCharacterEncoding("utf-8");//解决中文乱码问题
        //无法解决url传递的中文乱码
        
        request.setAttribute("password","12300");
    %>
    用户名:<%=request.getParameter("username") %><br>
    爱好:<%
    if(request.getParameterValues("favorite")!=null){
        String[] favorites = request.getParameterValues("favorite");
        for(int i=0; i<favorites.length; i++){
            out.println(favorites[i]+"&nbsp;&nbsp;");
        }
    }
    %><br>
    密码:<%=request.getAttribute("password") %><br>
    
    MIME类型:<%=request.getContentType() %><br>
    协议类型:<%=request.getProtocol() %><br>
    请求的服务器名:<%=request.getServerName() %><br>
    服务器端口号:<%=request.getServerPort() %><br>
    字符编码:<%=request.getCharacterEncoding() %><br>
    <!-- 只有POST才能获取到字节数,如果是GET方式则会显示-1 -->
    请求的长度(字节):<%=request.getContentLength() %><br>
    客户端IP:<%=request.getRemoteAddr() %><br>
    请求的真实路径:<%=request.getRealPath("jspRequest.jsp") %><br>
    上下文路径:<%=request.getContextPath() %><br>

  样例的代码如下:

<%@ page language="java" contentType="text/html; charset=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>request内置对象</title>
</head>
<body>
    <h1>request内置对象</h1>
    <%
        request.setCharacterEncoding("utf-8");//解决中文乱码问题
        //无法解决url传递的中文乱码
        
        request.setAttribute("password","12300");
    %>
    用户名:<%=request.getParameter("username") %><br>
    爱好:<%
    if(request.getParameterValues("favorite")!=null){
        String[] favorites = request.getParameterValues("favorite");
        for(int i=0; i<favorites.length; i++){
            out.println(favorites[i]+"&nbsp;&nbsp;");
        }
    }
    %><br>
    密码:<%=request.getAttribute("password") %><br>
    
    MIME类型:<%=request.getContentType() %><br>
    协议类型:<%=request.getProtocol() %><br>
    请求的服务器名:<%=request.getServerName() %><br>
    服务器端口号:<%=request.getServerPort() %><br>
    字符编码:<%=request.getCharacterEncoding() %><br>
    <!-- 只有POST才能获取到字节数,如果是GET方式则会显示-1 -->
    请求的长度(字节):<%=request.getContentLength() %><br>
    客户端IP:<%=request.getRemoteAddr() %><br>
    请求的真实路径:<%=request.getRealPath("jspRequest.jsp") %><br>
    上下文路径:<%=request.getContextPath() %><br>
</body>
</html>

  请求结果:

需要注意只有POST方式才能获取到请求的长度。

  response内置对象

  如果想模拟response的过程,可以直接创建一个如下的JSP,然后直接通过HTTP请求该页面:

<%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"%>
<% 
    //设置编码格式
    response.setContentType("text/html;charset=utf-8");

    out.println("<h1>response内置对象</h1><hr>");
    //out.flush();//强制输出,保证out输出的内容在response的输出流对象之前
    
    PrintWriter outer = response.getWriter();
    outer.println("response输出流输出的对象");//在out之前打印

    //response.sendRedirect("reg.jsp");//请求重定向,需要把前面的flush方法注释掉

%>

  注意的是,response有一个PrintWriter对象,这个对象默认会在out内置对象之前打印内容;

  如果使用out.flush强制刷新缓冲区,则可以在PrintWriter之前打印。

  重定向与转发

  重定向是response的方法:

response.sendRedirect("jspRequest.jsp");//新的请求,数据都没了

  重定向相当于一次新的请求,但是最开始请求的数据都没有了。URL地址栏也会变成重定向后的地址。

  转发是request的方法:

request.getRequestDispatcher("jspRequest.jsp").forward(request,response);//服务器端行为

  它会传送请求中的数据,并且URL地址栏不会发生变化,在用户看来,仿佛是没有经过转发一样。

  参考

  【1】慕课网:http://www.imooc.com/learn/166

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏测试开发架构之路

【总结】梳理下接口功能测试

1413
来自专栏张善友的专栏

自动类型安全的.NET标准REST库refit

1514
来自专栏一个会写诗的程序员的博客

Springboot Application 集成 OSGI 框架开发

是 Java 类加载层次中最顶层的类加载器,负责加载 JDK 中的核心类库,如:rt.jar、resources.jar、charsets.jar 等

1382
来自专栏zingpLiu

浅析Python多线程

学习Python多线程的资料很多,吐槽Python多线程的博客也不少。本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念。如果读者对进程...

2188
来自专栏ml

Linux GDB常用命令一栏

Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明; (*** 表示可执行程序名) (2)退出:quit。有...

4094
来自专栏Golang语言社区

Golang 序列化之 ProtoBuf

ProtoBuf: 是一套完整的 IDL(接口描述语言),出自Google,基于 C++ 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程...

4579
来自专栏python3

习题20:函数和文件

readline()函数返回的内容中包含文件本来就有的\n,而print在打印时又会添加一个\n

983
来自专栏java 成神之路

深入理解 Synchronized

2829
来自专栏java一日一条

ava多线程:volatile变量、happens-before关系及内存一致性

请参考来自 Jean-philippe Bempel 的评论。他提到了一个真实因 JVM 优化导致死锁的例子。我尽可能多地写博客的原因之一是一旦自己理解错了,可...

772
来自专栏Java帮帮-微信公众号-技术文章全总结

Spring scope 作用域

Spring scope 作用域 今天研究了一下scope的作用域。默认是单例模式,即scope="singleton"。 另外scope还有prototype...

3765

扫码关注云+社区

领取腾讯云代金券