Jsp

1.JSP javaServer Pages(java服务器端页面)

2. <%可执行的java代码%>,是JSP中嵌入java代码的方式。

3. 所有程序的操作都是在服务器端执行,网络上传到客户端的仅仅是得到的结果,这样大大降低了对客户端浏览器的要求,即使客户浏览器不支持java,也可以访问jsp页面。例如在jsp页面中嵌入java代码,运行是在服务器,浏览器看到的只是一个结果,查看浏览器网页源代码是看不到我们的java代码的。

4. jsp本质是servlet,jsp执行的过程如下:

Java在线编程工具菜鸟 javascrip菜鸟教程_java


详细流程:

Java在线编程工具菜鸟 javascrip菜鸟教程_Java在线编程工具菜鸟_02


5.jsp语法:

jsp原始代码中包含了jsp元素和Template data两部分:

Temolate data(模板数据)是指jsp引擎不处理的部分,即<%…%>以外的部分,也就是HTML内容

jsp元素则是指<%…%>内符合java语法的部分。

jsp指令分为三种不同的类型

1.编译器指令(DIRECTIVE)例如:<%@ page import="java.io.*" pageEncnotallow="UTF-8"%> 包括:“包含指令”,“页指令”,“taglib指令”。它们包含在<%@ %>卷标里。

两个主要的指令是page(页指令)与include,

page:多个import指令导入多个包,多个包之间用逗号隔开,也可用多行<%@ page import=""....>来指定。

include:包含指令,也就是说一个页面可以包含另外一个页面,因为实际开发中可能页面头尾是相同的,那么我们可以将头尾定义成2个单独的页面,在新页面中包含它们。
格式:<%@ include file="URL"%>或者<%@ include file="相对位置"%>

taglib指令:自定义标签库

2.脚本语法(SCRIPTING)
包括
HTML注释:< !--comments-- > 会发送到客户端页面能查看源代码看到,但是页面看不到
<!-- <%= new java.util.Date() %> --> 加了=号是表达式,后面不能加如果是jsp注释不加则是错误的。

隐藏注释(jsp注释):<%--comments--%> 不会发送到客户端页面
<%-- new java.util.Date(); --%>页面也看不到

声明:<%! 声明;声明%>比如:

<%! int a=3;%> 
<% int b=3;%> //这是一个jsp脚本段(元素)
<%= a--%>
<%= b--%>

得到的结果是a刷新一次自减一次,b不变。最本质的区别就是在转化的servlet文件中声明的a为成员变量,b为方法内的局部变量,因为servlet是单实例的,这样成员变量的值就只有一个,加载进内存后没有改动再刷新一次,那么servlet不会再进行加载,重启服务器会重启加载servlet,所以在内存中a–后被重新赋值,所以a刷新一次就减一次,而b,每次都会执行b–(注意,b–是先输出再自减,所以页面输出的是3),但是方法结束后b也随着方法结束了,再次刷新,b被重新赋值3,再输出,再自减,所以b的值不会改变。这是一个演示,但是实际中很少将声明定义成会改变的,因为a只有一份,会被所有用户访问,而b是脚本段每个用户访问各有一份,互不影响。

表达式:<%= new java.util.Date() %> 这个表达式等价于out.println();

脚本段:<%...%>也就是jsp元素
3.动作语法(ACTION)例如:

< jsp:forward page=“地址或者代表地址的表达式”>        //向前,起到一个转向的应用,从一个页面转到另外一个页面
<jsp:param name="username" value="riso"/>   //表示转到一个页面后给页面传递一个参数名和值
</jsp:forward>      如果已经执行这个动作,后面的jsp脚本或者内容就不再执行。
< jsp:getProperty> :这个是javaBean的获取属性动作

< jsp:include page=“地址或者代表地址的表达式”>   //包含一个静态或者动态文件
<jsp:param name="uesrname" value="riso">  //也是传递参数
</jsp:include>

6.jsp有9种内置对象:
request:请求对象
response:响应对象
pageContext:页面上下文对象,代表的是当前页面运行的一些属性
session:会话对象
application:应用程序对象
out:输出对象
config:配置对象
page:页面对象
exception:异常对象 只能在编译器指令中加入了isErrorPage=true才能使用
重点三种:
request:
1.是javax.servlet.ServletRequest的子类
2.request对象代表的是来自客户端的请求,例如我们在form表单中填写的信息。
关于它的方法使用较多的是:
getParameter:(翻译Parameter:参数)
getParameterName:(返回的是一个Enumeration,然后我们可以迭代获得所有请求参数的name)
getParameterValues:(返回的是一个String数组,参数是name,和getParameter有点类似,不过getParameter返回的是一个value,而这个返回的是多个相同name的value如果有的话)
void setAttribute(String name,Object value):设置属性
Object getAttribute(String name):以对象的形式返回特定名称的属性值,如果所给名称的属性不存在,返回null
request和session和application的作用范围:request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了,之后再向客户端返回一个响应后,该请求对象就被销毁了,之后再向服务端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中setAttribute中存放的任何数据。
session对象内数据的存活范围也就是session对象的存活范围,暂时可以认为(当浏览器没有关闭时),无论向服务器发送多少个请求,session对象只有一个,前面setAttribute的数据都可以获取到。
application:只要服务器不关闭,那么只有一个application对象,被所有用户所共享

session:
1.是javax.servlet.http.HttpSession接口的一个实例
2.session对象代表服务器与客户端所建立的对话,当需要在不同的jsp页面保留客户信息的情况下使用。例如购物,论坛
为什么要引入session:
1.HTTP是一个无状态的协议
2.web Server对每一个客户端请求都没有历史记录
3.session用来保存客户端状态信息
方法:
void setAttribute(String name,Object value),绑定一个对象到这个session,用一个名字标识,如果这个对象的名字已经存在,那么将会替换原有对象。
Object getAttribute(String name),获取一个绑定到session中名称为name的对象
application:
1.是javax.servlet.ServletContext的子类
void setAttribute(String name,Object value):设置属性
Object getAttribute(String name):以对象的形式返回特定名称的属性值,如果所给名称的属性不存在,返回null
String getrealpath(String path):传入参数是文件或者文件的路径,返回的是文件在硬盘上的真实路径,参数格式是/文件。
7. 当我们执行 <jsp:forward page=“地址或者代表地址的表达式”> 动作语法时,底层由pageContext对象调用抽象forward()方法来实现。forword():这个方法用于请求转发当前的 servlet请求或者响应到另一个有活动的组件(jsp,servlet,html页面),如果参数是/开头的,那么是到我们jsp的绝对路径,如果没有以/开头 那么这个参数是一个相对的路径。
8. 如果是servlet中,那么我们要调用ServlrtRequest对象的getRequestDispatcher(“要跳转jsp文件或者servlrt的 <url-pattern>”)获取一个RequestDispatcher(请求转发)对象,然后调用该对象的forward(request,response);参数为请求和响应对象。
9. getparameter()getAttribute()的区别,在于getAttribute()是和setAttribute()一起的,还可以用于将数据库内容setAttribute()然后getAttribute()提交给用户,而getparameter()返回的是仅仅是用户提交的数据(即一条request请求里的数据)。
10. 关于session和hidden的使用:我们应该多使用hidden而少使用session,因为session会占用服务器资源,一般用于用户登录用户将登录的信息存储到session,而hidden用于向导式(向下一个页面传递数据)的数据传递
11. HttpServletResponse对象的sendRedirect(String location)方法称作重定向,如果location地址前面加上“/”,则表示相对于Servlet容器的根请求,即http://localhost:8080,如果location地址前面没有加上“/”,则表示相对于当前请求的URI来寻找地址。
12. 请求转发与重定向的区别:
1.请求转发,getRequestDispatcher(String location)整个过程处于同一个请求中。
2.重定向,sendRedirect(String location)当执行到servlet这个方法时,服务器直接向客户端返回,并告诉客户端应该再去访问location文件,所以客户端再向服务器发送一个请求,指向location文件,再返回客户端。所以重定向是进行了2次请求,所以第二次的请求中拿不到第一次请求中的数据。