1、JSP简介
JSP---Java Server Pages
拥有servlet的特性与优点(本身就是一个servlet)
直接在HTML中内嵌JSP代码
JSP程序由JSP Engine先将它转换成Servlet代码,接着将它编译成类文件载入执行 只有当客户端第一次请求JSP时,才需要将其转换、编译
2、 Scriptlet
<%=代码%> 局部变量
3、 Declaration
<%!代码%> 成员变量,在此声明的变量、方法都会被保留成唯一的一份,直到JSP程序停止执行
<!-- html注释-->
<%--服务器端注释--%>
<%//服务器端单行注释
/*服务器端多行注释*/
%>
内置对象:out、request、response,exception;
服务器端对象没有办法阻止服务器端程序执行的,只不过显示不出来。<!--<%System.out.println("aaaaaa")%> -->
<%int i%>这段代码在服务器端执行的,客户端接到的是值
<script>
var ii=0;
<script>客户端执行
<%System.out.println(ii);%>服务器端执行 这句话先执行
<script>
<%out.println("var ii=10");%>//服务器端把这句话传回客户端。
alert(ii);
</script>
4、Directive 指令
(编译指令)相当于在编译期间的命令
<%@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”| --默认false(永远不要设成true)
info=“infoText”| --任何字符
errorPage=“errorPageUrl”|
isErrorPage=“true|false”|
contentType=“contentTyepInfo”|
pageEncoding=“gb2312”
%>
<%@page contentType="text/html;charset=gb2312"%>如果页面中文出不来,就加上这句话。
<@page errorPage="ErrPage.jsp"%> 页面1
<@page isErrorPage="true" %>页面2 当前页面是一个处理异常的java页面。
错误信息:<%=exception.getMessage()%>
5、include
将指定的JSP程序或者HTML文件包含进来
格式:<%@include file=“fileURL%>
JSP Engine会在JSP程序的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。(原封不动的把文件的代码copy到该位置,然后进行转换和编译,只生成一个java和class)
不能向fileURL中传递参数。在编译期间传参数无意义。
包含页面和被包含页面用的是同一个request对象。
包含页面和被包含页面的编码字符集要一致。
6、Action
常见的:
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:include
jsp:forward
jsp:param
jsp:plugin
嵌入applet
6.1、jsp:include
<jsp:include page="dage.jsp" flush="true"/>
用于动态包含JSP程序或HTML文件等
除非这个指令会被执行到,否则它是不会被Tomcat等JSP Engine编译。
<jsp:include page=“URLSpec” flush=“true”>
<jsp:param name=“ParamName” value=“paramValue”/>jsp:param用来设定include文件时的参数和对应的值
</jsp:include>
<jsp:include page="URLSpec?ParamName=paramValue" flush="true">
</jsp:include> 作用相同
和编译指令include的区别:
include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入
Include不能带参数, 而<jsp:include>可以
动态包含的文件和被包含文件用的不是同一个request对象
被包含页面可以取出包含页面的参数。
包含页面可以给被包含页面传参数。
被包含页面包含的东西比包含页面东西要多。
产生两个class文件
两种包含:静态包含常用,动态包含不常用!
6.2、sendRedirect
test.jsp
response.sendRedirect("forforward1.jsp");//往客户端发指令,让客户端转向forforward1.jsp
response.sendRedirecct("http://www.google.com");//这句话也可以。
System.out.println("ddd");//这条指令会被执行
test.jsp?param=paramvalue 如果传参数,forforward1.jsp是接收不到的。
response.sendRedirect("/forforward1.jsp"); /表示的是http://127.0.0.1/
6.3、jsp:forward
<jsp:forword page="forforward.jsp"> 在服务器端内部进行转向。所以客户端浏览器地址栏无变化
虽然是不同的对象,但可以取到上一页面的参数。forward语句不会发给客户端 forward后的语句不会被执行了。
<jsp:forword page="/forforward.jsp"> /代表的是 http://127.0.0.1/webapp根路径/
可以传参数,不但当前页面可以给下一个页面传参数(<jsp param/>),而且当前页面能取得的参数,下一个页面也能取到。
6.4、Jsp:userBean
<jsp:userBean id="cb" class="bean.CounterBean"><jsp:userBean>
<%Counterbean cb=new CounterBean();%> 以上两句作用一样。
<jsp:setProperty name="cb" property="count" value="23"/> <%--cb.setCount(Integer.parseInt("23"))--%>
<jsp:getProperty name="cb" property="count"/> <%--out.print(cb.getCount())--%>
jsp:useBean各项参数含义:
id:对象实例名称
scope:Bean作用的范围,默认为page,对整个jsp页面有效 只是new出来一个javaBean对象,不是从篮子取。
class:Bean类名称(全名)
type:Bean实例类型,可以是本类,或其父类,或实现接口,默认为本类
Scope各项参数的意义:
page:仅涵盖使用JavaBean的页面
request:有效范围仅限于使用JavaBean的请求
session:有效范围在用户整个连接过程中(整个会话阶段均有效)
application:有效范围涵盖整个应用程序。也就是对整个网站均有效
<jsp:useBean id="counterBean" scope="request" class="bean.CounterBean"/>下一个页面也能取到counterBean的值
<%bean.CounterBean counterBean=(bean.CounterBean)request.getAttribute("counterBean");
if(counterBean==null)
{
counterBean=new bean.CounterBean();
request.setAttribute("counterBean",counterBean);
}
%> 以上两段代码作用一样!
<jsp:useBean id="entry" class="bean.SaleEntry" />
<jsp:setProperty
name="entry"
property="itemID"
value="<%=request.getParameter("itemID")%>" />
<jsp:setProperty
name="entry"
property="numItems"
param="numItems" />
<jsp:setProperty
name="entry"
property="discountCode"
param="discountCode" />
通过url传参数。
<jsp:getProperty name="entry" property="itemID" />
$<jsp:getProperty name="entry" property="itemCost" />
<jsp:useBean id="hello" class="bean.HelloBean" scope="request" >
<jsp:setProperty name="hello" property="*" />
</jsp:useBean>
7、乱码问题
a.html
<form action=b.jsp method=get>
<input name=user value="我们">
<input type=submit value=get>
</form>
<form action=b.jsp method=post>
<input name=user value=他们>
<input type=submit value=post>
</form>
<a href="b.jsp?user=你们">this is a link</a>
<jsp:forward page="b.jsp">
<jsp:param name="user" value="它们" />
<jsp:forward>
public static String URLEncode(String s,String enc)
{
if(s==null)
{return "null"}
if(enc==null)
{enc="ISO-8859-1"}
....
}
zhongwen="你好"//汉字
bytes=zhongwen.getBytes("GBK");//以GBK得到字节
zhongwen=new String(zhongwen.getBytes("GBK"),"iso8859-1");//以GBK得到字节,然后以iso8859-1编码 (四个问号,一个字节一个字符)
bytes=zhongwen.getBytes("iso8859-1");//以iso8859-1得到字节
bytes=zhongwen.getBytes("utf-8");//以utf-8的到字节(8个字节,一个iso8859-1编码的字符被编成两个字节)
zhongwen=new String(bytes,"utf-8");//以utf-8得到字节,再以utf-8编码。还原成ISO-8859-1;(四个问号)
bytes=zhongwen.getBytes("iso-8859-1");//以iso-8859-1得到字节。
new String(bytes,"GBK");//以iso-8859-1得到字节,再以GBK编码。还原成GBK;(汉字)
8、Servlet转到jsp
resp.sendRedirect(req.getContextPath()+/servlet_jsp/servlet_usejsp);
this.getSevletConfig.getServletContext().getRequestDispatcher("/servlet_jsp/ServletUseJsp.jsp").forward(req,resp); /是webapp的访问路径
getServletContext().getRequestDispatcher("/servlet_jsp/ServletUseJsp.jsp").forward(req,resp);