Jsp

Jsp技术

  JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

  JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。JSP页面在第一次被访问到时会被JSP翻译引擎翻译成一个Servlet,从此对这个jsp页面的访问都是由这个Servlet执行后进行输出。

 

JSP语法

  1.JSP表达式 

  在翻译过来的Servlet中,计算java表达式的值后,转换为一个String,使用out输出到客户端。由于表达式的值会被转化成String,所以可以在一个文本行中使用表达式而不用去管它是否是HTML标签。表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。

其语法形式为
  <%= java表达式 %>

  <jsp:expression>
    java表达式
  </jsp:expression>

 

2.JSP脚本片断

在翻译过来的Servlet中,直接拷贝到对应的位置去执行。在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句。

  其语法形式为

    <% 若干java语句 %>

 

3.JSP声明

在翻译过来的Servlet中变成一个类成员变量或方法,代码块等。一个声明语句可以声明一个或多个变量、方法、静态代码块、代码块、内部类等,供后面的Java代码使用。在JSP文件中,必须先声明这些变量和方法然后才能使用它们。

  JSP声明的语法格式:
    <%! declaration; [ declaration; ]+ ... %>
  或者,可以编写与其等价的XML语句:
    <jsp:declaration>
      代码片段
    </jsp:declaration>
程序示例:

<%!
  int i = 0;
  public static final int j = 0;
  static {
  }
  {
  }
  class InnerClass {
  }
%>

对应的Java代码:

int i = 0;
public static final int j = 0;
static {
}
{
}
class InnerClass {
}

 

4.JSP注释

JSP注释主要有两个作用:为代码作注释以及将某段代码注释掉。
JSP注释的语法格式:
  <%-- 这里可以填写 JSP 注释 --%>

不同情况下使用注释的语法规则:
  <%-- 注释 --%>                     JSP注释,注释内容不会被发送至浏览器甚至不会被编译
  <!-- 注释 -->                          HTML注释,通过浏览器查看网页源代码时可以看见注释内容
  <\%                                     代表静态 <%常量
  %\>                                     代表静态 %> 常量
  \'                                         在属性中使用的单引号
  \"                                         在属性中使用的双引号

<%-- 注释的内容 --%> 被jsp注释注释掉的内容,在jsp翻译引擎将jsp翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息
<%//java注释%> java注释被当作jsp脚本片段被翻译到了Servlet中,在.java文件被翻译成.class文件的时候注释信息被丢弃
<!-- HTML注释 --> html注释被当作模版元素输出到了浏览器上,浏览器认识html注释不予显示

 

5.JSP指令

  (1).page 指令,用来通知翻译引擎,如果翻译当前的JSP,使用page指令指定的配置进行翻译。如:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

[ language="java" ] 当前JSP使用的开发语言
[ extends="package.class" ] 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改
[ import="{package.class | package.*}, ..." ] 导入需要使用到的包 java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*;
[ session="true | false" ] 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定jsp中不需要session可以设为false
[ buffer="none | 8kb | sizekb" ] out隐式对象所使用的缓冲区的大小
[ autoFlush="true | false" ] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改
[ isThreadSafe="true | false" ] 翻译过来的servlet是否实现SingleThreadModel
[ errorPage="relative_url" ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用
[ isErrorPage="true | false" ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码
[ pageEncoding="characterSet | ISO-8859-1" ] 服务器翻译jsp时使用的编码集.如果想防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.
[ isELIgnored="true | false" ] 当前页面是否使用el表达式,设置为false时表示启用el,j2ee4.0开始默认支持,j2ee4.0以下做开发时,如果要使用el表达式,需将此属性设置为false

(2).inclued 指令,用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。include指令引入通常也称之为静态引入。

  <%@ incluede file=""%> 静态引入其他页面的内容。

  静态引入:在源文件级别进行合并,多个jsp生成一个servlet,最终由这一个servlet生成响应。只有include 指令引入的页面才是静态引入。

  动态引入:在运行时将多个输出进行合并,多个jsp分别生成多个servlet,最终由这多个servlet生成响应,组成一个输出流,提供响应。执行效率没有静态引入高。

  (3).Taglib指令

JSP 允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
  <%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。

 

  6.隐式对象

config                    ServletConfig类的实例, getServletConfig()


application             ServletContext类的实例,与应用上下文有关, getServletContext()


request                  HttpServletRequest类的实例


response                HttpServletResponse类的实例


session                  HttpSession类的实例, request.getSession()


out                        PrintWriter类的实例,用于把结果输出至网页上, 它自带一个缓冲区,其大小受page指令中的buffer的设定限制。当缓冲区满或缓冲区被关闭或当前jsp页面结束,

          则此缓冲区中的内容将被刷新到 response.getWriter()的缓冲区中。

          不要同时使用 response.getWriter() 和 out 同时输出数据,防止输出数据顺序混乱。


page                     类似于Java类中的this关键字


pageContext          PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。可以通过它获取其它八大隐式对象,可以认为是一个入口对象,获取其所有域中的数据。

          (1)可以作为入口对象获取其他八大隐式对象的引用

getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象

(2)域对象,四大作用域的入口,可以操作四大作用域中的域属性

作用范围: 当前jsp页面
生命周期: 当对jsp页面的访问开始时,创建代表当前jsp的PageContext,当对当前jsp页面访问结束时销毁代表当前jsp的pageContext
作用:在当前jsp中共享数据
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)

public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void removeAttribute(java.lang.String name,int scope)
scope取值:
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE

findAttribute方法 -- 搜寻四大作用域中的属性,如果找到则返回该值,如果四大作用域中都找不到则返回一个null,搜寻的顺序是从最小的域开始向最大的域开始寻找

(3)提供了请求转发和请求包含的快捷方法
  pageContext.include("/index.jsp");
  pageContext.forward("/index.jsp");


Exception              Exception类的对象,代表发生错误的JSP页面中对应的异常对象

 

7.其它知识点

    (1)在web.xml中配置jsp映射

<servlet>
  <servlet-name>index</servlet-name>
  <jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
  <servlet-name>index</servlet-name>
  <url-pattern>/jsp/*</url-pattern>
</servlet-mapping>

(2)JSP最佳实践

  让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
  让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
  因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

(3)域的总结

servletContext (application)
session (session)
request (request)
pageContext
如果一个数据只在当前jsp页面使用,可以使用pageContext域存储
如果一个数据,除了在当前Servlet中使用,还要在请求转发时带到其他Servlet处理或jsp中显示,这个时候用request域
如果一个数据,除了现在我自己要用,过一会我自己还要用,存在session域
如果一个数据,除了现在我自己要用过一会其他人也要用,存在ServletContext域中

 

转载于:https://www.cnblogs.com/diysoul/p/5572566.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值