JSP学习
* JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应,JSP文件命名为xxx.jsp
* 与Servlet不同, JSP文件以HTML标记为主, 然后内嵌java代码段, 用于处理动态内容
Eclipse的常用设置
在window中的properties中找到你要修改的东西,点击设置编码
JSP语法结构
* 声明区
* 程序代码区<% ▨▨▨▨ %>
* 表达式<%= ▨▨▨▨ %>
* 注释
* 指令和动作
* 内置对象
申明区
代码区
<% 这是代码区,编写Java,可以干Java中的任何事 %>
表达式
* <%=“hello world”%>
* <%=i+1%>
* <%=request.getParameter(“name”)%>
注释
* 显式注释:在HTML中存在注释“”
* 隐式注释:可以使用java中的“//”、“/*….*/”,以及JSP中自己的注释:“<%-- 注释内容 --%>”
指令
<%@指令 属性="属性值">
* page:导包和常用的属性设置,错误页面
* include:导入静态文件
* taglib:引入JSTL文件,写函数和指令
page指令
//用于导包和设置一些页面属性,基本格式如下:
<%@page language=“script language”|
extends=“ className” |
import=“ importList” |
buffer=“ none|kb size”| --none:不缓冲,默认8k
session=“ true|false” | --是否可以使用session,默认true
autoFlush=“ true|false” --缓冲器是否自动清除,默认true
isThreadSafe=“ true|false”|
errorPage=“ errorPageUrl” |
isErrorPage=“ true|false” |
contentType=“text/html;charset=utf-8”
%>
include指令(静态包含)
* include指令用于引入另一个JSP程序或HTML文件等,格式如下:<%@include file="fileURL"%>
* JSP引擎会在JSP文件的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作(有时会有content="text/html; charset=UTF-8"错误)
taglib指令
* taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件
* taglib格式:<%@taglib uri=“tagLibary” prefix=“prefix”%>
动态和静态包含
* 静态包含:在生成的时候,就已经将文件拷贝过去了,不会在再编译生成相应的java文件 :<%@include file="jspDemo1.jsp"%>
* 动态包含:会再次生成servlet的java文件,然后再将两个java文件捏合在一起:
* 动态包含的,大的会给小的传递数据,然后可以达到动态的改变页面的效果,在Jsp:include中:是将大页面的参数传递给小页面
静态包含
结论1:静态包含是先将页面代码包含进来,再运行。
结论2:因为静态包含是先将页面代码包含进来,再运行,所以页面之间相同标签属性配置不同的话会有冲突。至少两个jsp页面的<%@page contentType=“text/html;charset=utf-8”%>应该保持一致。同理,包含的jsp页面与被包含的jsp页面最好没有重复的html标签。否则会发生覆盖现象
结论3:静态包含时,能否传递参数呢?这种时候传递参数,一般大家都会想到地址传参:<%@include file="top.jsp?i=9"%>,这样是否能正常运行呢?答案是不能!!!因为此时的页面是直接被包含进来的,这样设置参数传递是没有任何意义的。甚至是不能通过编译!
结论4:既然是直接把代码包含进来,那么服务器通过响应请求传递过来的参数,是否能够被两个页面共用呢?三个页面都能通过request接收到test.jsp页面传来的值,说明这三个或页面是共享一个request的。
动态包含
1.不带参数的包含
2.带参数的包含
//1.方式一
//方式二
动态和静态包含的比较
* 1.动态包含用的元素是page,而且有两种形式。静态包含用的是file,只有一种形式。
* 2.生成的文件不同,静态的包含是将两个jsp文件二合一,生成一个以包含页面命名的servlet和class文件,动态包含的两个jsp文件各自生成自己的servlet和class文件。
* 3. 传参方式一:时被包含的jsp页面是可以访问该参数的。
* 4. 传参方式二:
*
*
*
*
* 5.在客户端访问包含页面时地址栏后面直接加上参数后传递,这种形式的传参是客户端送来的,但是这两个页面的request对象不是同一个,因为3中已经说了包含的页面可以向被包含的页面传递参数,所以被包含的request对象含的参数个数应该大于等于包含页面的参数个数的。所以它们各有各的request对象。而且被包含的jsp页面可以访问传到包含页面的参数。
* 6.动态包含只有在执行到它的时候才加载,所以它才叫动态包含。
- jsp:include动作用于引入另一个JSP程序或HTML文件等,执行到include时,被include的文件才会被JSPEngine编译。如果include的是html文件,那它不会被转换成Servlet文件
- jsp 格式如下:
jsp:forward/jsp:param
* forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理
* 用于指定参数和其对应的值
格式:
*
*
*
*
include指令和include动作的区别
* include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;
* include动作在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入
重定义和转发
* 重定向:适合用在一件事做完了,还要再做另一件事的时候,做了两次请求,地址栏会改变,可以在其他的服务器跳转(等于重新请求)
* 转发:将这次没有做完的工作,放到下次任务里面,只做一次请求,地址栏不会改变,只能在服务器内部跳转(请求一次,不能断开)
servlet和JSP中的重定向和转发
//servlet
我们知道,在servlet中调用转发、重定向的语句如下:
request.getRequestDispatcher("new.jsp").forward(request, response); //转发到new.jsp
response.sendRedirect("new.jsp"); //重定向到new.jsp
//JSP
在jsp页面中你也会看到通过下面的方式实现转发:
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp"); %> //重定向到new.jsp
//两者区别
解释一
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
例子:
response.sendRedirect("loginsuccess.jsp");
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。
例子:
RequestDispatcher dis=request.getRequestDispatcher(“loginsuccess.jsp”);
Dis.forward(request,response);
解释三
假设你去办理某个执照
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。