您的位置:首页 > Web前端 > JavaScript

jsp常用的指令与标签

2015-12-16 17:30 597 查看
1.

Jsp指令:

语法:<%@ 指令名 属性="值"%>.

jsp指令负责告诉jsp引擎如何把页面翻译成servlet.

page指令:用于定义jsp页面的各种属性,最好放在jsp页面的起始位置,属性有language,extends,import,session,buffer,autoFlush,isThreadSafe,info,isErrorPage,contentType,pageEncoding,isELIgnored.

include指令:在后面与include标签对比讲解.

2.

out对象:这个out不是servlet里面的out.是PageContext.getWriter()方法返回的out对象.

实验1:

<%

out.println("first");

response.getWriter("second");

%>

结果如下:

second

first

为什么out的后输出?这是因为jsp引擎先把内容放到PageContext.getWriter()方法返回的out对象的缓冲区.写完后再交给servlet的response.getWriter()方法写到servlet引擎提供的缓冲区,缓冲区再把内容写到客户端.

实验2:

<%

ServletOutputStream sos = response.getOutputStream();

sos.println("hehe");

%>这里加上一个换行

运行结果报错了,为什么?上面说过,out最终会调用response.getWriter()方法返回的out对象,我们这个实验首先使用了response.getOutputStream()方法,记住我们写的所有的jsp页面都会翻译成Servlet的,然而在这里的代码中输出换行符时又去调用了response.getWriter()方法,而response的getWriter()和getOutputStream()不能同时在一个方法里面调用,所以报错了.注意:用了ServletOutputStream 就不能再使用out对象了.

实验3:

<%

RequestDispatcher rd = application.getRequestDispatcher("/test.html");

rd.forward(request,response);

%>在这里回车

结果报告有错.为什么?

实际上当调用forward方法时,是去找了一个缺省的servlet,这个缺省的servlet使用的是getOutputStream()方法,而这里的回车使用的是jsp的out对象打印出来的.这个out对象最终要使用的是getWriter(),而上面说过response的getWriter()和getOutputStream()不能同时使用,所以报错了.当然在前面加上回车也是一样的效果.

3.

pageContext对象:->request->session->application

pageContext对象代表此jsp页面,它是通过调用JspFactory.getPageContext方法返回的,在自定义标签用的非常多.

可以使用pageContext得到其他8大内置对象.

实验4:

这是一个换行

<%

1.//RequestDispatcher rd = application.getRequestDispatcher("/test.html");

//rd.forward(request,response);

2. pageContext.forward("/test.html");

%>

第一种方法会出错,第二种不会,为什么?

第一种出错的原因我们在上面说过,第二种为什么不会出错呢?我们说过,pageContext包装了其他八大隐式对象,所以它的forward方法内部也是调用了request.getRequestDispatcher的forward方法,但是在执行RequestDispatcher的forward方法之前调用了out.clear()方法.这样就不会出错了,去掉前面的换行,在%>后面加一个换行,两种方法都会报错.

几个常用的方法:

setAttribute(String name,Object object);

setAttribute(String name,Object object,int scope);scope代表指定的范围(page,request,session,application)

getAttribute(String name);

getAttribute(String name,int scope);

removeAttribute(String name);

findAttribute(String name);此方法依次从page,request,session,appllication这四个范围去找,直到找到为止.如果没找到则返回null.

4.

jsp标签:

<%@ include file=""%>:静态包含,a包含b,编译过程中a会受到b的jsp指令的影响,例如,b中有一个isELIgnored指令,会影响b,效率更高,不仅仅是引入输出内容,引入共同的的编译元素,不会检查所含文件的变化,适用于包含静态页面

<jsp:include page=""/>:动态包含,a包含b,a在执行过程中调用b,page的值可以是变量.它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数

<jsp:forward>:此forward调用的pageContext的forward然后return了

<jsp:param>:用于给上面两个标签传参数.

以下是jsp2.0里面才可以使用的标签:

<jsp:scriptlet>:相当于<%%>

<jsp:scriptlet>

int x = 3;

if(x < 5){

out.println(x);

}

</jsp:scriptlet>

会报错.因为在此使用了"<"这个符号,必须用

<![CDATA[

代码

]]>

<jsp:declartion>

</jsp:declaration>相当于<%!%>

<jsp:expression>

</jsp:expression>相当于<%=%>

<jsp:directive.指令名 属性="值"/>相当于<%@ page 属性="值"%>

<%@ page contentType="text/html;charset=gb2312"%>

<%

out.println("中国");

%>



<%

response.setContentType("text/html;charset=gb2312");

out.println("中国");

%>

的效果是不一样的.前者打印出了"中国"两字,后者打印出来的是乱码,为什么呢?

前者告诉jsp引擎按照指定的contentType去把jsp的内容翻译成servlet,因为charset指定为了gb2312,所以正常的输出了.

后者为什么是乱码呢?这是因为jsp源文件的中文字符在翻译成Servlet源文件时已经不是其正确的unicode编码了,当服务器把这两个字符按照gb2312输出正文时,出现的就是乱码了.

<jsp:setProperty name="date" property="time" param="time"/>



<jsp:setProperty name="date" property="time" value="<%=Integer.parseInt(request.getParameter("time"))%>"/>

意思是一样的.

自省机制:<jsp:setProperty name="date" property="*"/>

这种形式用于对javaBean实例对象中的多个属性赋值,它表示将请求消息中的参数逐一与javaBean实例对象中的属性进行比较,如果两个属性同名,则将该参数值赋值给该属性.注意:必须是同名的才赋值.

<jsp:useBean id="date" class="java.util.Date" scope="request"/>

这个jsp标签的含义为:

在指定范围(这里是request,如果不写,默认为page)内去找一个名字为date的对象,如果找到了则把它取出来,如果没找到则实例化一个新的类型为java.util.Date的名字为date的对象,并将它保存在request中,

<jsp:useBean id="date" class="java.util.Date" scope="request">

......

</jsp:useBean>

如果上面的语句这样写,其含义则为:

在指定范围(这里是request,如果不写,默认为page)内去找一个名字为date的对象,如果找到了则把它取出来,"......"地方的代码不再执行.如果没找到则实例化一个新的类型为java.util.Date的名字为date的对象,并将它保存在request中,还将执行"......"地方的代码.

5.

forward() 与redirect()的区别?

答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: