JSP基本语法(指令,属性,内置对象)[转]
Tomcat的结构与配置
Tomcat服务器是一个符合J2EE标准的WEB服务器,则J2EE的EJB程序无法在此处运行。如果要运行可以选择能够运行EJB程序的容
器:WebLogic,WebSphere.
Tomcat用java语言开发,实现了一个Servlet引擎和JSP引擎,因而它支持Java Servlet和JSP.
Tomcat需要JDK的支持,但Tomcat本身并不自带JDK,所以需要安装JDK。并配置JDK的JAVA_HOME
Tomcat主要目录结构:
bin :存放启动和关闭tomcat脚本。
conf :包含不同的配置文件。所有于Tomcat配置有关的内容都在此文件夹之下。server.xml(Tomcat的主要配置文件)和web.xml
work :存放jsp编译后产生的class文件。
webapp :存放应用程序示例,以后你要部署的应用程序也要放到此目录。
logs 存放日志文件。
lib :这三个目录主要存放tomcat所需的jar文件
doc :包含各种Tomcat文档。
修改%TOMCAT_HOME%/conf/server.xml的文件。
修改端口号:port
添加虚拟目录:
如要将一文件夹f:\TestWeb配置为虚拟目录,要在此文件夹下建一个WEB-INF文件夹,在WEB-INF文件夹下有一个叫web.xml文件。在webapps\Root文件夹下有一个WEB-INF文件夹和web.xml文件,可以复制过来。打开复制过来的文件,把<!--Jspc servlet mappings start--><!--JSPC servlet mappings end-->之间的内容删除。找到sever.xml下在</host>之上,添加<Context path="/test" docBase="f:\TestWeb"/>修改之后重新启动服务器。
启动Tomcat服务器:
如出现严重:Address already in use:JVM_BIND:80 则表示80端口被占用。
如出现严重:cannot assign request address:JVM_Bind:8080 则很有可能和你的放火墙有关。
所有JSP文件在第一次运行时都会自动编译, .jsp---->.java---->.class
JSP基础语法
1 注释:
显式注释:HTML注释会被发送到客户端,客户可以通过查看页面源代码发现这些注释。基本形式:<!--注释-->
隐式注释:JAVA注释不会被发送到客户端。
基本形式:<%--
JSP中注释
--%>
或<%
//java单行注释
/*
java多行注释
*/
%>
基本表达式:
声明语句:<%!声明语句;%>例<%! int i =10;%>此处声明全局变量,类,方法,全局变量只实例化一次,此处很少声明类或方法。(结尾有分号)
表达式:<%=java表达式%>,主要用于输出值,类似与:out.println().HTML与java代码相分离(结尾无分号)
脚本代码(Scriptlet):<% java代码;%>在此处声明的变量属于局部变量。(结尾有分号)
所有的JSP代码最终都是拼凑出来的,不是固定的,是由WEB容器拼凑出来的。
指令:
page指令:主要用来指明当前JSP页面的属性。
主要功能:
1 利用import语句导入类<%@page import="java.util.*,java.sql,*"%>
2 JSP出错处理<%@page errorPage="error.jsp"%>
3 指明出错页<%@page isErrorPage="ture"%>
4 使用的编程语言:<%@page language="java"%>
5 session管理:<%@page session="true"%>
6缓冲设置处理:<%@page isAutoFlush="true"%> <%@page buffer=8kb%>
7设定页面MIME类型:<%@page contentType="text/html;charset=gb2312"%>//为JSP页面指定编码,只能设置一次,主要解决中文乱码问题。
包含语句:
1 <%@include file="uri"%>例<%@include file="hello.jsp"%> <%@include file="hello.htm"%>
如有一代码要在多个JSP网页文件中实现,则可以单独建一个文件,再在所需的JSP页面中包含进来。可以包含任意文件不区分文件名称后缀,只是把文件中的内容包含进来。
注意:include语句可以包含任何内容,但是在一个JSP页面中,只能有一组<html>,<head>,<body>所以被包含的文件,只写显示部分的HTML代码,主体代码不要出现。
2 <jsp:include page="uri"/>例<jsp:include page="uri" flush="true"/>
或者<jsp:include page="uri" flush="true>
<jsp: param name="参数名称" value="值"/>
</jsp:include>
此语句叫标签指令形式。代码,必须完结</xxx:xxx>,使用此语句可以向被包含的页面之中传递参数,如果传递参数,则被包含的页面必须是JSP页面,必须是动态页面。
两种include的区别:
<%@include file="uri"%>:(先包含后处理)
静态的包含页面:不管其他文件内容如何,只是将页面中的内容包含进来。
执行时:先将所有内容包含进来再一起处理,在将处理后的结果发送给客户端。
<jsp:include page="uri"/>:(先处理后包含)
动态包含页面:能自动区分所包含的是静态页面还是动态页面。
执行时:如果资源为静态资源则直接将资源包含处理与<%@include file="uri"%>相同,如果资源为动态,则先各自处理资源,之后将处理的结果包含在一起发送给客户端。
跳转语句:<jsp:forward page="uri"/>
例<jsp:forward page="uri"/>
或者<jsp:forward page="uri">
<jsp:param name="参数名称" value="值"/>
</jsp:forward>
此语句属于标签指令形式,标签指令形式的代码,必须写在Scriptlet(<%...%>)之外。
使用此跳转语句,页面的内容是已经跳转,但是地址栏没有任何变化,则意味着:用户的请求依然没有改变。所以此跳转属于服务器端跳转,是无条件跳转。
JSP内置对象
JSP使用java语言进行编程,java是一门面向对象的语言,除几个简单数据类型外,其余均为对象,
在JSP中存在几个内置对象,这些对象可以不经过显式声明直接引用,也不需要专门的代码创建其实例,在程序中可以直接使用这些对象。Web Container:Web容器------为对象实例化。
内置对象 类型 作用域
request javax.servlet.http.HttpservletRequest request
response javax.servlet.http.HttpServletResponse page
pageContext javax.servlet.jsp.pageContext page
session javax.servlet.http.HttpSession session
application javax.servlet.ServletContext application
out javax.servlet.jsp.JspWriter page
config javax.servlet.ServletConfig page
page java.lang.Object page
exception java.lang.Throwable page
request-->HttpServletRequest接口的实例化对象。
观察得出:HttpServletRequest有一个父类:ServletRequest
现在的ServletRequest只有HttpServletRequest一个子接口,目的是为以后更新出的协议服务。
JSP内置对象分类:
与Servlet有关的隐含对象:page,config。
与Input/Output有关的隐含对象:out,request,response.
JSP执行时,提供有关Context的隐含对象;session,application,pageContext
与Error有关的隐含对象:exception。
JSP中属性的保存范围
在JSP中设置属性:public abstract void setAttribute(java.lang.String name,java.lang,Object attribute)
取得属性:public abstract java.lang.Object getAttribute(java.lang.String name)
以上两个方法的参数必须记住。
四种属性保存范围:
1 在一个页面范围内:page
2 在一次服务器范围内:request
3 在一次会话范围内:session
4 在一个应用服务器范围内:application
page范围:在JSP中设置一个页的属性范围,必须通过pageContext完成。属性值只能在当前页取得,如使用<jsp:forward/>服务器端跳转无法取得。
pageContext属性范围:是最为重要的JSP属性之一,但是如果要使用纯粹的JSP代码开发,则此属性显现不出用处。
<%
pageContext.setAttribute("name","LE")
String name=(String)pageContext.getAttribute("name);//在当前页可以取得
%>
request范围:将属性保存在一次请求范围之内,必须使用服务器端跳转<jsp:forward/>,如果是通过客户端跳转和超链接等则无法取得。应用点:MUC设计模式,Struts,Webwork等。
session范围:只保留一个用户的信息。只要设置上去,则不管是什么跳转,都可以取得属性,与session有关的任何打开的页面都可以取得session,主要功能:用于验证用户是否登陆。
application范围:所有用户都可以取得此信息,此信息在整个服务器上被保留,只要设置一次,则所有网页窗口都可以取得数据。主要应用:在线人员统计,在线人员名单。
application,session,request-->都需要跨多个页,属性保存是有内存开销的,所以如果能用request就不要使用session,能使用session就不要使用application。
重要概念:pageContext--->默认情况下表示一个页面的保存范围。
public abstract void setAttribute(String name,Object value,int scope)
实际上,四种属性范围,都是通过pageContext对象来完成的:
public static final int APPLICATION_SCOPE
public static final int SESSION_SCOPE
public static final int REQUEST_SCOPE
public static final int PAGE_SCOPE
总结:四种属性范围都是依靠pageContext展开的,但是在开发中,往往使用session,request范围最多。
request对象
request对象的主要功能是服务器端接收客户端以HTTP方式传送给用户端数据,以便对其进行进一步处理,实现交互设计功能。
常用的方法:getParameter(),getParameterValues(),getParameterNames();
request实际上是服务器端接收客户端请求的信息的,接收信息后做进一步处理。
接收参数是中文的处理:
1 对所有的数据进行再编码:ISO8859-1编码,使用String 类中的getBytes("ISO8859-1")
该方法定义:public byte[] getBytes("encoding");
new String(request.getParameter("name").getBytes("ISO8859-1"));
2 设置统一的请求字符编码:public void setCharacterEncoding(String encoding)throws UnsupportedEncodingException
request.setCharacterEncoding("GBK");在接收参数。
如果传递的内容是数组(复选框、多个下拉列表项),使用request的以下方法取得数据:
public String[] getParameterValues(String name)
把一组参数保存到一个数组中。
在开发中较为常用的表单控件:隐藏域。将内容隐藏起来,使用户不能修改,之后随表单一起提交的服务器上显示。
地址重写:http://localhost/test/demo01.jsp?name=hello,地址栏传递参数
通过地址重写,可以将内容传递到服务器端---服务器端只认HTTP协议,而不管接收的内容是以何种形式传过来的。
public Enumeration getParameterNames() 功能:取得客户端所有请求的参数名称(注意不是值)。
取得客户端IP地址的方法:public String getRemoteAddr()
总结:只要是客户端信息,在服务器端都可以通过request对象取得。
response对象
response对象的主要功能是服务器端用于向客户端发送信息,例如HTTP的头信息和Cookie信息。
所属接口:javax.servlet.http.HttpServletResponse该接口有一个父接口ServletResponse.
response的主要功能:
1 设置头信息:
最有用的一个头信息:refresh:刷新。response.setHeader("头信息内容","头信息参数")
response.setHeader("refresh","1") 每过一秒钟刷新一次。
response.setHeader("refresh","2;URL=页面名称"),过两秒后跳转到URL页面上。
setHeader可以实现跳转。
2 response进行跳转---重定向:response.sendRedirect(跳转路径);
此语句执行后,页面地址也变为跳转后的地址,属于客户端跳转。
两种跳转的区别。
<jsp:forward page=""/>
地址栏不改变跳转---服务器端跳转
执行到跳转语句后无条件立刻跳转---之后的代码不在执行
注意:如果使用forward跳转,则一定要在跳转之前释放掉全部的资源
使用forward时,request设置的属性依然能保留在下一个页面(setAttribute)
通过<jsp:param name="" value=""/>传递参数。
response.sendRedirect("地址")
地址栏改变跳转----客户端跳转
所有代码执行完毕之后再跳转
不能保存request属性--地址改变了,客户端跳转。
通过URL地址重写传递参数
使用客户端跳转,可以通过重写URL的方式将内容传递过去。
例:response.sendRedirect("responseDemo01.jsp?id=mldn")
3 设置Cookie
Cookie是服务器端保存客户端的一组资源。例登陆时会问你是否记住密码,或多长时间不用登陆,这些功能都是通过Cookie来实现的。
Cookie是通过服务器端设置到客户端上去的----response public void addCookie(Cookie cookie).
如果要在在服务器端取得Cookie-----request public Cookie[] getCookies()
在使用request对象取得全部Cookie时,会出现以下信息:JSESSIONID
JESSIONID表示一个客户端在服务器端的唯一一个标识编号(自动获得SESSION对象)
默认情况下,Cookie只针对当前浏览器有效,如果需要Cookie长留在本地计算机上,可以设置Cookie的保存时间。通过Cookie对象的setMaxAge()设置最大保留时间。
Cookie是保存在客户端上的信息,安全性较差,不要把过多的隐秘信息保留在Cookie中,这样很不安全。
服务器端在客户端第一次访问之后,会设置一个默认的Cookie在客户端上:JSESSIONID.
session对象
session对象主要用于保存用户的各种信息,直到它的生命周期(一般为900s)超时或被人为释放掉为止。可以通过session对象来判断此用户是否合法用户。
1 譬如,如果用户没有登陆,则无论此用户访问了哪几个页面都会跳转回登陆页。
2 购物车---->张三买的东西,不能放到李四的购物车上。
在服务器上,通过session来区分每一个上网用户
session对象属于javax.servlet.http.HttpSession接口的实例化对象。
session属于Http协议范畴之内的对象,所以只有唯一的一个http包下有此接口,没有任何继承关系。
用户只要一连接到服务器上,则立刻分配一个session给用户。
session的主要方法:
1 服务器上通过session来分别不同的用户---->session ID:任何连到服务器上的用户,服务器都会为之分配唯一的一个不会重复的session ID.
session ID是由服务器统一管理的,人为不能控制。
方法:session.getId() 取得sessionId ,长度为:32
2 判断是否是一个新的session
public boolean isNew()判断当前的session是否是新建立的session。
3 session的属性设置
设置属性:public void setAttribute(String name,Object value)
取得属性:public Object getAttribute(String name)
删除属性:public void removeAttribute(String name)
通过session能够对用户是否登陆做出验证。
注意,有以下方法,与上面三个方法相对应:
public void putValue(String name,Object value)
public Object getValue(String name)
public void removeValue(String name)
此三个方法已过时,不建议大家使用。
4 用户注销:让用户的session失效,如果session失效,则在session所保留的全部操作也会消失.
public void invalidate():使session失效(手工)
如果session长时间不被使用,也会自动失效。
5 得到session的创建时间:public long getCreationTime() 此方法返回long类型,通过Date类可以取得一个完整的时间。
6 取得用户最后一次操作的时间: public long getLastAccessedTime()
Session与Cookie
session和Cooke用于跨网页共享数据
session:记录独有的个人信息,在不同页面中传递。重要方法:setAttribute(),getAttribute()
Cookie:保存于客户端,供浏览器与Web服务器互通数据用的纯文字文件,当IE执行的时候,会在计算机中产生一个Cookie.
session将信息保存在服务器上,而cookie保存在客户端上。
session比cookie更安全,但更占用资源。
开发原则:session要尽量少使用----尽量少向session中保存信息,session使用了cookie的机制,如果cookie被禁用,则session也无法使用。
application对象
与session类似,也是用来保存信息,实现在不同页面间的参数传递;但application是所有用户共享的,任何用户都可以访问,而session对象则是每个用户私有的。
application对象主要的作用就是保存公共信息的:
主要的方法是属性操作的三个方法:setAttribute(),getAttribute(),removeAttribute().
application属于javax.servlet.ServletContext.
服务器端的路径不是固定的,有可能此工作目录在c盘或是在d盘上。
要得到此工作目录的真实路径:public String getRealPath(String path),需要一个参数:"/";
Application是在整个服务器中保持的只有一个实例的对象,在实际应用中往往使用getServletContext()方法代替application。例:getServletContext().getRealPath("/").
为什么此方法没有使用对象调用?
所有的web处理程序,有一个web容器的支持,实际上此方法是由容器进行调用的。this可以省略。
out对象
out对象主要用于动态向客户端输出数据,但在jsp中尽可能少使用此对象。
开发中的原则:HTML代码与JAVA代码分离,如果输出内容,尽量使用表达式输出。<%=%>
JSP安全性及config对象的应用
J2EE中安全性的体现:工作目录的WEB-INF文件夹,此文件夹在浏览器URL中不可见。但是保存在里面的页面虽然安全性高,但是页面无法发现。解决此问题以使页面能够被用户所访问。
解决方法:在WEB-INF文件夹之下存在一个web.xml文件,web.xml文件:属于整个Web站点的配置文件。
<servlet>
<servlet-name>mldn</servlet> //在web.xml文件内部起作用,与serlet-mapping关联
<jsp-file>/WEB-INF/sdemo.jsp</jsp-file> //找到jsp的路径,此路径一般都保存在WEB-INF之中
</servlet>
<servlet-mapping>
<servlet-name>mldn</servlet-name> //在web.xml文件内部起作用,与<servlet>中的serlet-name完全一致
<url-pattern>/lxh</url-pattern> //网页上输入的实际路径地址
</servlet-mapping>
次文件一旦被修改之后,必须重新启动服务器---因为服务器在启动的时候会读取此文件。
config对象
config对象一般用来取得服务器的初始化配置参数,但若要使用此对象应在WEB-INF/web.xml之中配置。
要使用config对象的前提:JSP页面必须在web.xml中进行配置
<servlet-name>mldn</servlet-name>
<jsp-file>/WEB-INF/sdemo.jsp</jsp-file>
<init-param>
<param-name>uname</param-name>
<param-value>mldn</param-value>
</init-param>
<init-param>
<param-name>upass</param-name>
<param-value>LiXingHua</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mldn</servlet-name>
<url-pattern>/lxh</rul-pattern>
</servlet-mapping>
如果要取得这些初始化参数,必须通过映射名称进行访问JSP页面,才可以取得初始化参数,就通过config对象取得。
config对象:javax.servlet.ServletConfig
取得初始化参数的方法:public String getInitParameter(String name)
通过此种功能,可以将数据库连接的一些信息写在配置文件之中-JDBC程序
public Enumeration getInitParameterNames()与request.getParameterNames()方法类似,是取得全部配置参数的。
J2EE WEB端
的其他知识
1 默认首页如何设置?
Tomcat服务器--->默认首页的名称是:index.html,index.htm,index.jsp。
如何修改:希望以下页面作为首页:default.html,default.htm,default.jsp
<welcome-file-list>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>