*JSP

JSP(Java Server Pages)

在html中加入java代码,就是jsp页面,jsp里可以加入java代码,也可以调用外部的java。jsp页面要想运行必须放到容器里,例如最流行的tomcat服务器。jsp就是用java程序动态生成html页面,浏览器不能解析java代码,所以tomcat这种服务器负责解析,生成最终的html ;

JSP页面中可以包括指令标识HTML代码JavaScript代码嵌入的Java代码注释JSP动作标识等;(不是必需的)

>> 指令标识<%@ %>

指令标识用于设定整个JSP页面范围内都有效的相关信息,是被服务器解释并执行的,不会产生任何输出到网页中的内容,也就是说指令标识对客户端浏览器是不可见的;

<%@ 指令名 属性=属性值 属性=属性值 ......%>
(1)page 指令

定义整个JSP页面的相关属性,这些属性在JSP被服务器解析成Servlet时转换为相应的Java程序代码;

  • language:用于设置JSP页面使用的语言,默认Java;<%@ page language="Java" %>

  • extends:用于设置JSP页面继承的Java类,所有JSP页面在执行之前都会被服务器解析成Servlet。而Servlet由Java类定义,所以JSP和Servlet都可以继承指定的父类;

  • import:用于设置JSP导入的类包;JSP页面可以嵌入Java代码片段,这些Java代码在调用API时需要导入相应的类包;<%@ page inport="java.util.*" %>

  • pageEncoding:用于定义JSP页面的编码格式,也就是指定文件编码;<%@ page pageEncoding="UTF-8" %>

  • contentType:用于设置JSP页面的MIME类型和字符编码,浏览器会据此显示网页内容;<%@ page contentType="text/html; charset=UTF-8" %>

  • session:指定JSP页面是否使用HTTP的session会话对象,属性值是布尔型,默认true;

  • buffer:用于设置JSP页面的out输出输出对象使用的缓冲区大小,默认大小是8KB,且单位只能是KB,建议使用8的倍数作为该属性的属性值;

  • autoFlush:用于指定当前缓冲区已满时,自动将缓冲区的内容输出到客户端;默认值true;若值=False时,则当缓冲区已满时抛出“JSP Buffer overflow”异常;若buffer=none。则autoFlush属性值不能设置成False;

  • isErrorPage:通过该属性可以将当前JSP页面设置成错误处理页面来处理另一个JSP页面的错误,也就是异常处理,这意味着当前JSP页面业务的改变;<%@ isErrorPage="true" %>

  • errorPage:用于指定处理当前JSP页面异常错误的另一个JSP页面,指定的JSP错误处理页面必须设置isErrorPage属性为true;errorPage属性的属性值是一个url字符串;<%@ errorPage="error/loginErrorPage.jsp" %>

  • info

  • isELIgnored

  • isTheradSafe

(2)include 指令

include指令可以在一个JSP页面中静态包含(原样包含)另一个JSP页面,在被包含和包含的文件中不能有相同名称的变量;<%@ include file="path" %>

在用include指令进行文件包含时,为了使整个页面的层次结构不发生冲突,建议在被包含文件中将<html><body>等标记删除,因为在包含该文件的页面中已经指定这些标记了。

(3)taglib 指令

在JSP文件中。可以通过taglib指令标明该页面中所使用的的标签库,同时引用标签库,并指定标签的前缀;在页面中引用标签库后,就可以通过前缀来引用标签库中的标签;<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  • prefix属性:用于指定标签的前缀,该前缀不能命名为jsp、jspx、java、javax、sun、servlet、sunw;
  • uri属性:用于指定标签库文件的存放位置;

>> 脚本标识

JSP中的脚本标识包括JSP表达式(Expression)、声明标识(Declaration)、脚本程序(Scriptlet);

(1)JSP表达式(Expression) <%= %>

JSP表达式用于向页面中输出信息:<%= 表达式 %>

  • 表达式可以是任何java语言的完整表达式,表达式的最终运算结果被转换为字符串;
  • 表达式不仅可以插入到网页的文本中,用于输出文本内容,也可以插入到HTML标记中,用于动态设置属性值;
(2)声明标识(Declaration) <%! %>

声明标识用于在JSP页面中定义全局变量或方法;通过声明标识定义的变量和方法可以被整个JSP页面访问,所以通常使用该标识定义整个JSP都需要引用的变量或方法;服务器执行JSP页面时,会将JSP页面转换为Servlet类,在该类中,会把使用声明标识定义的变量和方法转换为类的成员变量和方法;
<%! 声明变量或方法的代码 %>

<%! 
    int number = 0;
    int count(){
		number++;
		return number;
	}
%>
(3)代码片段 <% %>

代码片段就是在JSP页面中嵌入的Java代码或者脚本代码;代码片段将在页面请求的处理期间被执行,通过Java代码可以定义变量或流程控制语句等,通过脚本代码可以应用JSP的内置对象在页面输出内容、处理请求和响应、访问session会话等;


>> 注释

(1)HTML中的注释 <!-- -->

HTML中的注释不会被显示在网页中,但是在浏览器中选择查看网页源代码时还是能看到注释信息的;

(2)隐藏注释 <%-- --%>

在浏览器中看不到,在查看HTML源代码时也看不到,安全性比较高;

(3)动态注释

由于HTML注释对JSP嵌入的代码不起作用,因此可以利用它们的组合构成动态的HTML注释文本:
<!-- <%=new Date() %> --> : 将当前日期和时间作为HTML注释文本;

(4)代码片段中的注释

与Java中的注释相同;

  • 单行注释://
  • 多行注释:/* */
  • 提示文档注释:/** */

>> 动作标识

JSP动作标识是在请求处理阶段按照页面中出现的顺序被执行的,用于实现某些特殊用途的标识(操作JavaBean、包含其他文件、执行请求转发等),

(1)操作JavaBean的动作标识
  • 创建JavaBean实例的动作标识<jsp:useBean>
    <jsp:useBean id="实例名" scope="实例有效范围" class="完整类名" beanName="完整类名" type="数据类型" />

  • 读取JavaBean属性值的动作标识<jsp:getProperty>
    <jsp:setProperty name="useBean创建的实例名" property="属性名" value="属性值" param="请求参数(参数的值赋给property)" />

  • 设置JavaBean属性值的动作标识<jsp:setProperty>
    <jsp:getProperty name="useBean创建的实例名" property="属性名" />

(2)包含外部文件的动作标识 <jsp:include>

通过JSP的动作标识<jsp:include>可以向当前页面中包含其他的文件;被包含的文件可以是动态文件,也可以是静态文件;
<jsp:include page="被包含文件的相对路径" flush="是否刷新缓冲区" />

两种包含文件的方法的区别:
  • **<%@ include %>**指令包含的页面是在翻译阶段将页面的代码插入到主页面的代码中,最终包含页面与被包含页面生成了一个文件;被包含页面中有改动时需要重新编译该文件;
  • **<jsp:include>**动作标识包含的页面可以动态改变,它是在JSP文件运行过程中被确定的,执行的程序是两个不同的页面,即在主页面中声明的变量在被包含的页面中是不可见的;
  • 所以,当被包含的JSP页面中包含动态代码时,为了不和主页面中的代码相冲突,需要使用<jsp:include>动作元素包含文件;
(3)执行请求转发的动作标识 <jsp:forward>

通过该动作标识,可以将请求转发到其他Web资源,Eg:另一个JSP页面、HTML页面、Servlet等;执行请求转发后,当前页面将不再被执行,而是去执行该标识指定的目标页面;
<jsp:forward page="请求转发的目标页面" />

(4)设置参数的子动作标识 <jsp:param>

该标识可以作为其他标识的子标识,用于为其他标识传递参数;
<jsp:param name="指定参数名称" value="设置对应的参数的值" />

<jsp:forward page="modify.jsp">
	<jsp:param name="userId" value="7" />
</jsp:forward>
代码将请求转到modify.jsp页面的同时传递了参数userId参数值是7;

通过<jsp:param>动作标识指定的参数,将以“参数名=值”的形式加入到请求中,功能与在文件名后面直接加“?参数名=参数值”是相同的;


>> JSP内置对象(隐含对象)

JSP提供了由容器实现和管理的内置对象,也称隐含对象,这些内置对象不需要JSP页面编写者来实例化,可以直接在所有的JSP页面中直接使用,起到了简化页面的作用;

(1)request请求对象

request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息,系统信息,请求方式,请求参数等;通过request对象提供的相应的方法,可以处理客户端浏览器提交的HTTP请求中的各项参数;

1、获取访问请求参数(超链接):

  • 当通过超链接的形式发送请求时,可以为该请求传递参数,在超链接后面加上问号“?”实现;
    <a herf="delete.jsp?id=1&name=aaa"> (同时指定多个参数时之间用&隔开,参数值不需要使用单引号或双引号括起来,包括字符型的参数);

  • 在delete.jsp页面中,通过**request对象的getParameter()**方法获取传递的参数值 <%request.getParameter("id");%>
    若指定参数不存在,将返回null,若指定了参数名,没指定参数值,将返回空的字符串"";

2、获取表单提交的信息:

  • 在Web应用程序中,经常还需要完成用户与网站的交互,例如用户填写表单后,需要把数据提交给服务器处理,这时服务器就需要获取这些信息;

  • 通过**request对象的getParameter()**方法可以获取用户提交的表单信息 String userName = request.getParameter("username");
    参数username与HTML表单的name属性对应,若参数值不存在,则返回一个null值, 该方法返回的是String类型;

  • 不是所有表单信息都可以通过getParameter()方法获取,复选框和多选列表框被选定的内容需要通过**getParameterValues()**方法获取;

3、解决中文乱码:
在通过request对象获取请求参数时,遇到参数值为中文的情况下,若不进行处理,获取到的参数值则是乱码;在JSP中,解决获取到的参数中文乱码问题可以分为以下两种情况:

  • 1、获取访问请求参数时乱码:
    当访问请求参数为中文时,通过request对象获取到的中文参数值为乱码,是因为该请求参数采用的是ios-8859-1编码,将获取到的数据通过String的构造方法使用UTF-8或GBK编码重新构造一个String对象,就可以正确的显示出中文;
    String user = new String(request.getParameter("user").getBytes("ios-8859-1"),"utf-8")

  • 2、获取表单提交的信息乱码:
    当获取表单提交的信息时,通过request对象获取到的中文参数值为乱码,此时可以在page指令的下方加上调用request对象的setCharacterEncoding()方法,将编码设置为UTF-8或GBK;
    <% request.setCharacterEncoding("UTF-8"); %>

4、通过request对象进行数据传输

  • 在进行请求转发时,需要把一些数据传递到转发后的页面进行处理,需要使用request对象的setAttribute()方法将数据保存到request范围内的变量中;
    request.setAttribute(String name,Object object);

  • name:表示变量名,为String类型,在转发后的页面取数据时,就通过这个变量名来获取数据;

  • object:用于指定需要在request范围内传递的数据,为Object类型;

  • 将数据保存到request范围内的变量中后,就可以通过request对象的getAttribute()方法获取该变量的值;
    request.getAttribute(String name);

//index.jsp文件
<%try{                                                    //捕获异常信息
	int money = 100;
	int number = 0;
	request.setAttribute("result", money/number);         //保存执行结果
}catch{
	request.setAttribute("request", "很抱歉,页面产生错误!"));  //保存错误提示信息
}%>
<jsp:forward page="deal.jsp" />	
//deal.jsp文件
<%Sting message = request.getAttribute("result".toString();) %>  
<%=message %>

由于getAttribute()方法的返回值是Object类型,所以需要调用toString()方法,将其转换为字符串类型;

5、获取客户端信息
通过request对象可以获取到客户端的相关信息:HTTP报头信息、客户端提交方式、客户端主机IP地址、端口号等;

request获取客户端信息的常用方法:
|方法|说明|
|–|
|getHeader(String name)|获得HTTP定义的文件头信息|
|getHeaders(String name)|返回指定名称的requestHeader的所有值,其结果是一个枚举型的实例|
|getHeaderNames()|返回所有requestHeader的名称,其结果是一个枚举型的实例|
|getMethod()|获得客户端向服务器端传送数据的方法,get、post、header、trace|
|getProtocol()|获得客户端向服务器端传送数据所依据的协议名称|
|getRequestURI()|获得发出请求字符串的客户端地址,不包括请求的参数|
|getRequestURL()|获得发出请求字符串的客户端地址|
|getRealPath()|返回当前请求文件的绝对路径|
|getRemoteAddr()|获得客户端的IP地址|
|getRemoteHost()|获得客户端的主机地址|
|getServerName()|获得服务器的名字|
|getServerPath()|获取客户端请求的脚本文件的文件路径|
|getServerPort()|获取服务器的端口号|

6、获取cookie

  • cookie:小段的文本信息,在网络服务器上生成,并发送给浏览器;
  • 通过cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等;
  • 浏览器将cookie以 key/value 的形式保存到客户端的某个指定目录中;
  • 在使用cookie时应该保证客户端上允许使用cookie;通过浏览器“工具 / Internet / 隐私 ”设置;
  • 将一个cookie对象发送到客户端可以使用response对象的addCookie()方法

|方法|说明|
|–|
|getCookies()|获取所有cookie对象的集合|
|getName()|获取到指定名称的cookie|
|getValue()|获取到cookie对象的值|

7、显示国际化信息

(2)response响应对象
  • response对象用于响应客户请求,向客户端输出信息;
  • 它封装了JSP产生的响应,并发送到客户端以响应客户端的请求;
  • 请求的数据可以使各种数据类型,甚至是文件;
  • response在JSP页面内有效;

1、实现重定向页面

  • 使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面;
  • 重定向操作支持将地址重定向到不同的主机上,这点与转发不同;
  • 在客户端浏览器上将会得到跳转的地址,并重新发送请求链接;
  • 用户可以从浏览器的地址栏中看到跳转后的地址;
  • 进行重定向操作后,request中的属性全部失效,并且开始一个新的request;
  • 在JSP页面中使用该方法时,不要再有JSP脚本代码(包括return语句),因为重定向之后,的代码已经没有意义了,并且还可能产生错误;

response.sendRedirect(String path); //path用于指定目标路径

2、处理HTTP文件头
通过response对象可以设置HTTP响应报头:设置响应的内容类型、禁用缓存、设置页面自动刷新、定时跳转网页;

  • (1)设置响应的内容类型:
    通过response对象的**setContentType()**方法可以设置响应的内容类型,默认情况下采用的内容类型是text/html;通过指定响应的内容类型,可以让网页内容以不同的格式输出到浏览器中;
    response.setContentType(String type);

  • (2)禁用缓存:
    在默认的情况下,浏览器将会对显示的网页内容进行缓存,用户再次访问相同的网页时,浏览器会判断网页是否有变化,若没有,则直接显示缓存中的内容,这样可以提高网页的显示速度;对于一些安全系数较高的网站,通常需要禁用缓存;用过设置HTTP头的方法实现禁用缓存;

<%
response.setHeader("Cache-Control","no-store");
response.setDateHeader("Expries",0);
%>
  • (3)设置页面自动刷新:
    <%response.setHeader("refersh","10");%> //十秒自动刷新

  • (4)定时跳转网页:
    <%response.setHeader("refersh","5;URL=login.jsp");%> //5秒后自动跳转到指定的页面

3、设置输出缓冲
通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区,下面3种情况下才会把缓冲区的内容写到客户端:

  • JSP页面输出的信息已经全部写入到客户端缓冲区;
  • 缓冲区已满;
  • 在JSP页面中调用了response对象的**flushbuffer()方法或out对象的flush()**方法;

对缓冲区进行设置的方法:
|方法|说明|
|–|
|flushBuffer()|强制将缓冲区的内容输出到客户端|
|getBufferSize()|获取响应所使用的缓冲区的实际大小,若没有使用缓冲区,则返回0|
|setBufferSize()|设置缓冲区的大小,若将缓冲区的大小设置成0KB,表示不缓冲|
|reset()|清除缓冲区的内容,同时清除状态码和报头|
|isCommitted()|检测服务器端是否已经把数据写入到了客户端|

(3)out输出对象

out输出对象可以向客户端浏览器输出信息,并且管理应用服务器上的输出缓冲区;在使用out对象输出对象时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间;数据输出完毕后,要及时输出输出流;

  • 向客户端输出缓冲数据:
    out对象一个最基本的应用,就是向客户端浏览器输出信息;out对象可以输出各种数据类型的数据,在输出非字符串类型的数据时,会自动转换为字符串进行输出;
    print: <% out.print("盗情"); %> <=等价于=> <%="盗情" %>
    println:<pre><% out.println(123); println("盗情") %></pre> (在浏览器中看出来换行,需要<pre>标记)

  • 管理相应缓冲区:
    |方法|说明|
    |–|
    |clear()|清除缓冲区中的内容|
    |clearBuffer()|清除当前缓冲区中的内容|
    |flush()|刷新流|
    |isAutoFlush()|检测当前缓冲区已满时是自动清空还是抛出异常|
    |getBufferSize()|获取缓冲区的大小|

(4)session会话对象

session在网页中被称为会话,由于HTTP是一种无状态协议,也就是说,当一个客户向服务器发出请求,服务器接收请求并返回响应后,该链接就结束了,而服务器并不保存相关的信息;为了弥补这一点,HTTP提供了session,用户可以通过session在应用程序的Web网页间进行跳转时保存用户的状态,使整个用户会话一直保存下去,直到浏览器关闭;但是,如果在一个会话中,客户端长时间不向服务器发送请求,session对象就会自动消失,这个时间取决于服务器,Tomcat服务器默认30分钟,这个时间可以通过编写程序进行修改;

  • session.setAttribute(String name,Object obj); 将信息保存在session范围内,name用于指定作用域在session范围内的变量名,obj保存session范围内的对象;

  • session.getAttribute(String name); 用于获取保存在session范围内的信息;
    (getAttribute返回值时object类型的,若需要将获取到的信息赋值给String类型的变量,需要进行强制类型转换或调用toString方法; String user = (String)session.getAttribute("username"); 或者 String user = session.getAttribute("username").toString();

  • session.removeAttribute(String name); 用于将存储在session中的对象从session会话中移除;要保证变量name在session范围内有效,否则将抛出异常;

  • session.setMaxInactiveInterval(int time); 用于设置session的有效时间;time单位为秒;

  • session.getLastAccestedTime(); 返回客户端最后一次与会话相关联的请求时间;

  • session.getMaxInactiveInterval(); 返回一个会话内两个请求间的最大时间间隔,单位为秒;

  • session.invalidate(); 用于销毁session对象;销毁后再调用session对象的任何方法,都将报出异常“Session already invalidate”;

(5)application应用对象
  • application对象用于保存所有应用程序中的公有数据,在服务器启动时自动创建,在服务器停止时自动销毁;
  • 当application对象没有被销毁时,所有用户都可以共享该application对象;
  • 与session对象相比,application对象生命周期更长,类似于全局变量;
  • 在项目开发中,application对象常用于实现网页计数器或聊天室;

application对象提供了对应用程序初始化参数进行访问的方法,应用程序初始化参数在web.xml文件中进行设置,通过<context-param> 标记配置;

<context-param>
    <param-name>url<parma-name>
    <parma-value>jdbc:mysql://127.0.0.1:3306/db_database</parma-value>
</context-parma>
  • application.getInitParmeter(String name); 用于返回一下已命名的参数值;name用于指定参数名;

  • application.getInitAttributeNames(); 用于返回所有已定义的应用程序初始化参数名的枚举;

  • application.setAttribute(String name, Object obj); 用于保存应用程序环境属性,该属性在application范围内有效;

  • application.getAttributeNames(); 用于获取所有application对象使用的属性名;

  • application.getAttriibute(String name); 用于获取指定属性的属性值;

  • application.removeAttribute(); 用于从application对象中去除指定名称的属性;name指定的属性名在application范围内有效,否则将抛出异常;

(6)应答于请求的page对象
  • page对象代表JSP本身,只在JSP页面内才是合法的;
  • page对象本质上是包含当前Servlet接口引用的变量,可以看做是this关键字的别名;

|方法|说明|
|–|
|getClass()|返回当前Object类|
|hashCode()|返回object的哈希代码|
|toString()|把该Object类转换成字符串|
|equals(Object o)|比较该对象和指定对象是否相等|

(7)获取页面上下文的pageContext对象
  • 通过它可以获取JSP页面的request、response、session、application、exception等对象;
  • pageContext对象的创建和初始化都由容器来完成;
  • JSP页面里可以直接使用pageContext对象;
(8)获取web.xml配置信息的config对象
  • config对象主要用于取得服务器的配置信息;
  • 通过pageContext对象的getServletConfig()方法可以获取一个config对象;
  • 当一个Servlet初始化时,容器把某些信息将通过config对象传递给这个Servlet;
  • 开发者在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数;

|方法|说明|
|–|
|getServletContext()|获取Servlet上下文|
|getServletName()|获取Servlet服务器名|
|getInitParameter()|获取服务器所有初始化参数名称,返回值为java.util.Enumeration对象|
|getInitParameterNames()|获取服务器中name参数的初始化值|

(9)获取异常信息的exception对象
  • exception对象用来处理JSP文件执行时发生的所有错误和异常,只有在page指令中设置isErrorPage属性值为true的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件;

  • 若在JSP页面中出现没有被try-catch捕捉到的异常,就会生成exception对象,并把exception对象传送到page指令中设定的错误页面中,然后再错误页面中处理相应的exception对象;

|方法|说明|
|–|
|getMessage()|返回exception对象的异常信息字符串|
|getLocalizemessage()|返回本地化的异常错误|
|toString()|返回关于异常错误的简单信息描述|
|fillInStrace()|重写异常错误的栈的执行轨迹|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值