1、<% java代码 %>
解析后会放到service方法中;
3、JSP成员声明:作为类的成员;
4、JSP注释:不会在页面中显示的(解析根本不处理)
5、JSP三大指令标签
<%@ page %>
<%@taglib %>
<%@include %>:静态导入(将多个页面的内容先加载,再一起编译)
-----------------------------------------------------------------------------
动态导入:每一个页各自编译 ,在运行时再导入;
简介
index.jsp
<html>
<head>
<title>First Web Project</title>
</head>
<body>
<%
out.print("Hello World");
%>
</body>
</html>
其中<% out.print(“Hellow World”);%>称为脚本,可以发现,在JSP文件中,既有HTML标签,又有JAVA代码,因此我们可以把JSP看成嵌入JAVA的HTML代码
在Eclipse中生成Jsp内容,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
Eclipse生成的JSP文件中,除了典型的html元素外,还有很多其他内容。这是因为JSP页面本身就可以包含多种页面元素,如脚本、HTML、指令、注释等。
JSP页面元素
所有嵌入在HTML中的JAVA代码都必须使用scriptlet包裹起来。在JSP中共有三种Scriptlet: <% … %>,<% !%>和<% =…%>
Scriptlet一般写在标签中
第一种Scriptlet:<%…%>
<%…%>主要用来定义局部变量,编写java语句,如下代码所示
jspDemo1.jsp
<%
String bookName ="JAVA EE测试";
String author = "ZY" ;
out.print("书名:"+bookName+"<br/>作者:"+author);
%>
第二种Scriptlet: <%!…%>
<%!…%>主要用来定义全局变量、定义方法
jspDemo2.jsp
<%!
public String bookName ;
public String author ;
public void initInfo()
{
bookName ="JAVA EE测试";
author = "LZY" ;
}
%>
<%
inintInfo();
out.print("书名:"+bookName+"<br/>作者:"+author);
%>
第三种Scriptlet: <%= …%>
<%=..%>用来输出=后面的表达式的值,功能类似out.print()
jspDemo3.jsp
String bookName ="JAVA EE测试";
String author = "LZY" ;
%>
<%="书名:"+bookName+"<br/>作者:"+author%>
<!--等价于out.print("书名:"+bookName+"<br/>作者:"+author); -->
out.print()和<%=…>不仅能输出变量,还可解析”<br/>”等html代码,需要注意,<%=…>中没有“;”。
指令
jsp指令写在<%@ …%>中,如下代码所示:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
以上代码称之为page指令,page指令可以用来设置当前JSP文件的一些属性,常见属性如下表:
属性 | 说明 |
---|---|
language | 指定JSP页面使用的脚本语言,默认是Java,一般不用修改 |
import | 与java中import的用法一致,可以执行导包操作 |
pageEncoding | 指定JSP文件本身的编码方式 |
contentType | 指定服务器发送给客户端的内容的编码方式,通常与pageEncoding保持一致 |
jspDemo4.jsp
<%@ page language="java" import="java.util.Date" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<%
Date date = new Date();
out.print(date);
%>
</body>
</html>
以上代码,通过import导入java.util.Date,并指定了编码方式为UTF-8
JSP指令:http://www.runoob.com/jsp/jsp-directives.html
注释
注释方式 | 说明 |
---|---|
HTML注释。可以用来注释HTML代码,但是注意此种注释能通过客户端(浏览器)查看到,因此是不安全的 | |
<%– –%> | JSP注释,如果想让注释不被浏览器` |
<%//单行注释%><%/多行注释/%> | JAVA注释:<% %>中放置的是java代码,所以可以在<% %>使用//和/../来对其中的JAVA代码进行注释 |
jspDemo5.jsp
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!-- html注释 -->
<%-- jsp注释 --%>
<%
//java单行注释
/*
java多行注释
*/
%>
</body>
</html>
内置对象
<%
out.print("Hello World");
%>
没有定义和实例化(new)就可以直接使用的对象,就称为内置对象。除了out以外,JSP还提供了其他的一些内置对象
内置对象 | 类型 | 简介 |
---|---|---|
1.pageContext | javax.servelet.jsp.PageContext | JSP页面容器 |
2.request | javax.servlet.http.HttpServletRequest | 客户端向服务端发送的请求信息 |
3.response | javax.servlet.http.HttpServletResponse | 服务器端向客户端的响应信息 |
4.session | javax.servlet.http.HttpSession | 客户端与服务端的一次会话 |
5.application | javax.servlet.ServletContext | 可存放全局变量,实现用户间数据的共享 |
6.config | javax.servlet.ServletConfig | 服务器配置信息,可以取得初始化参数 |
7.out | javax.servlet.jsp.JspWriter | 向客户端输出内容 |
8.page | java.lang.Object | 当前JSP页面本身,类似于Java中的this关键字 |
9.exception | java.lang.Throwable | 当一个页面在运行过程中发生了异常,就产生这个对象 |
常用内置对象及cookie
jsp内置对象out
out用于向客户端输出数据,最常用的是out.print();需要注意的是, out.println() 或者 out.print(“\n”) 均不能实现在客户端的换行功能。
若要实现换行,必须借助于HTML的<br/>标签。
JSP内置对象request
1.request简介
request对象主要用于存储“客户端发送给服务器的请求信息”。
通过request对象来获取用户发送的相关数据,request对象的常用方法如下:
方法 | 简介 |
---|---|
public String getParameter(String name) | 获取客户端发送给服务端的参数值(由name指定的唯一参数值,如单选框、密码框的值) |
public String[] getParameterValues(String name) | 获取客户端发送给服务端的参数值(由name指定的多个参数值,如复选框的值) |
public void setCharacterEncoding(String env) | 指定请求编码,用于解决乱码的问题 |
public RequestDispatcher getRequestDispatcher(String path) | 返回RequestDispatcher对象,该对象的foward()方法用于转发请求 |
public HttpSession getSession() | 返回和请求相关Session |
public ServletContext getServletContext() | 获取web应用的ServletContext对象 |
注册 register.jsp
<html>
…
<body>
<form action="show.jsp" method="post" >
用户名:<input type="text" name="uname" /><br/>
密码:<input type="password" name="upwd" /><br/>
兴趣:<br/>
足球<input type="checkbox" name="hobby" value="足球"/>
篮球<input type="checkbox" name="hobby" value="篮球"/>
羽毛球<input type="checkbox" name="hobby" value="羽毛球"/> <br/>
<input type="submit" value="注册" />
</form>
</body>
</html>
show.jsp
<html>
…
<body>
<%
//将请求的编码与页面保持一致,设置为UTF-8
request.setCharacterEncoding("UTF-8");
//获取表单中name值为"uname"元素的value值
String name = request.getParameter("uname");
//获取表单中name值为"upwd"元素的value值
String pwd = request.getParameter("upwd");
//获取表单中,已选name值为"hobby"元素的value数组值
String[] hobbies = request.getParameterValues("hobby");
%>
您注册的信息如下:<br/>
用户名:<%=name %> <br/>
密码:<%=pwd %> <br/>
爱好:
<%
if(hobbies != null)
{
for(int i=0 ; i<hobbies.length ;i++)
{
out.print(hobbies[i]+" ");
}
}
%>
</body>
</html>
通过request.setCharacterEncoding(“UTF-8”)将POST方式的编码设置为UTF-8,,并通过request.getParameter()和request.getParameterValues()方法获取到了从表单传来的数据。
需要注意的是,客户端的数据不一定必须从表单传递过来,也可以通过URL地址进行传递,格式如下:
页面地址?参数名1=参数内容1&参数名2=参数内容2&…
即通过“?”将页面地址和参数分离,然后按照“参数名=参数内容”的格式来传递数据,并且多个参数之间用“&”分隔。
get方式提交表单,实际就是通过URL地址提交的方式向服务器端发送数据。
如果 “URL地址传递”中的值是中文,而JSP页面编码是UTF-8时,则会显示乱码。原因是“URL地址传递”使用的是GET方式传递数据,而GET方式的默认编码是ISO-8859-1,与JSP页面编码UTF-8不一致。解决方法就是将GET方式提交的数据,进行统一字符编码。
统一字符集编码
将所有JSP文件的编码设置为UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
2.对于GET或POST方式,实施不同的统一编码操作。
我们首先要知道tomcat服务器,默认使用的编码方式是ISO-8859-1。
(1)如果是以get方式提交表单(或URL地址传递的方式),则有两种方式处理编码:
①分别把每一个变量的编码方式,从ISO-8859-1转为UTF-8
//将name的编码方式,从ISO-8859-1转为UTF-8
String name = request.getParameter("uname");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
//将pwd的编码方式,从ISO-8859-1转为UTF-8
String pwd = request.getParameter("upwd");
pwd = new String(pwd.getBytes("ISO-8859-1"), "UTF-8");
②修改tomcat配置,一次性的,将所有通过get方式传递的变量编码都设置为UTF-8(推荐)。具体修改如下:打开tomcat的conf目录,在server.xml的64行附近的元素中,加入URIEncoding=”UTF-8”,如下,
server.xml
<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
说明:
要使修改的server.xml生效,必须把Eclipse的tomat服务器设置成本地Tomcat托管模式,设置方法如下:
我们使用Eclipse配置完Tomcat后,会在左侧项目导航栏多出一个Servers项目,该项目中就有Tomcat的一些配置文件,如context.xml,server.xml等。为了使Servers项目中的配置文件,与我们本地安装的Tomcat目录中的配置文件保持一致,我们可以双击控制台Servers下的Tomcat V8.0…
如果是以post方式提交表单,可以通过在服务器端加入request.setCharacterEncoding(“UTF-8”)来设置编码。
1.response简介
方法 | 简介 |
---|---|
public void addCookie(Cookie cookie) | 服务端向客户端增加Cookie对象 |
public void sendRedirect(String location) throws IOException | 将客户端发来的请求,重新定位(跳转)到另一个URL上(习惯上称为“重定向”) |
public void setContentType(String type) | 设置服务器端响应的contentType类型 |
login.jsp
<html>
…
<body>
<form action="check.jsp" method="post" >
用户名:<input type="text" name="uname" /><br/>
密码:<input type="password" name="upwd" /><br/>
<input type="submit" value="登陆" />
</form>
</body>
</html>
check.jsp
<html>
…
<body>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
//假设用户为名“张三”且密码为“abc”时,登陆验证成功
if(name.equals("张三") && pwd.equals("abc"))
{
//若验证成功,则重定向到success.jsp页面
response.sendRedirect("success.jsp");
}
%>
</body>
</html>
success.jsp
<html>
…
<body>
登陆成功!<br/>
欢迎您:<br/>
<%
String name = request.getParameter("uname");
out.print(name);
%>
</body>
</html>
1.如果用户名和密码验证成功,确实跳转到了欢迎页success.jsp,但数据却丢失了,用户名name的值为null。
2.重定向到success.jsp后,地址栏也变成了success.jsp页面的地址。
请求转发与重定向
为了解决重定向以后数据丢失的问题,我们先来回忆一下request对象中的一个方法: public RequestDispatcher getRequestDispatcher(String path)
之前说过,此方法的返回值RequestDispatcher对象,有一个forward()方法可以用于转发请求,也就是说,request的getRequestDispatcher()方法和response的sendRedirect()方法有相同之处:都可以实现页面之间的跳转。
请求转发(forward()) | 重定向(redirect()) |
---|---|
请求服务器次数 | 1次 |
是否保留第一次请求到的request范围中的属性 | 保留 |
地址栏里的请求URL,是否改变 | 不变 |
重定向:客户端(浏览器)向服务器的资源A发起一次请求①,服务器的资源A接收到该请求后,给客户端做出响应,告诉客户端去重新访问资源B的地址 ②,客户端收到资源B的地址后再次向服务器的资源B发出第二次请求③,服务器资源B处理完该请求并做出响应④
cookie和JSP内置对象session
cookie
cookie对象是先由服务端产生,再发送给客户端(浏览器)的,并且浏览器会将该cookie保存在客户端的某个文件中。也就是说,cookie技术能将服务器端的一些数据,保存在用户使用的客户端计算机中。这样一来,用户下次就可以直接通过自己的计算机访问到该数据,而不必再访问服务器。因而cookie技术可以提高网页处理的效率,也能减少服务器端的负载。但是由于cookie是服务器端保存在客户端的信息,所以其安全性相对较差。
cookie的使用
一个Cookie对象包含一个键值对,即key=value。cookie不是JSP的内置对象,需要通过JSP提供的javax.servlet.http.Cookie类来创建.
方法 | 简介 |
---|---|
public Cookie(String name, String value) | 构造方法,用来实例化Cookie对象,同时设置Cookie对象的属性名和属性值 |
public String getName() | 获取Cookie对象的名称 |
public String getValue() | 获取Cookie对象的内容 |
public void setMaxAge(int expiry) | 设置Cookie的保存时间,以秒为单位 |
服务器端可以通过response对象的addCookie()方法,将Cookie对象设置到客户端;而客户端也可以通过request对象的getCookies()方法来获取全部的Cookie对象。
在客户端每一次访问服务器时,服务器为了区分各个不同的客户端,就会自动在每个客户端的Cookie里设置一个JSESSIONID,表示该客户端的唯一标示符。
session
session通常被翻译成“会话”。一个会话是指:用户通过浏览器(客户端)与服务器之间进行的一系列的交互过程,交互期间可以包含浏览器与服务器之间的多次请求、响应。以下是3个常见的session使用情景:
①用户在浏览某个网站时,从进入网站到关闭这个网站所经过的这段时间,也就是用户浏览这个网站的整个过程,就是一个session。
②在电子邮件应用中,从一个客户登录到电子邮件系统开始,经过收信、写信和发信等一系列操作,直至最后退出邮件系统,整个过程为一个session。
③在购物网站应用中,从一个客户开始购物,到浏览商品、结算等,直至最后的结账,整个过程为一个session。
session运行机制:当用户(浏览器)向Web应用第一次发送请求时,服务器会创建一个session对象并分配给该用户;该session对象中包含着一个唯一标识符sessionId,并且服务器会在第一次响应用户时,将此sessionId作为jsessionid保存在浏览器的Cookie对象中;这个session将一直延续到用户访问结束(浏览器关闭或用户长时间不访问Web应用)。
当Web应用接收到用户的请求时,首先会检查服务器是否已经为这个用户(浏览器)创建过了session对象,具体是判断用户的请求中是否包含了一个sessionId,如果包含sessionId,则服务器就会通过这个sessionId找到对应的session,以确定是这个用户在访问服务器。而如果用户的请求中没有sessionId,服务器会为该用户创建一个新的session,并生成一个与此session对应的sessionId,然后将sessionId随着本次响应返回给用户(浏览器的Cookie对象中)
说明:如果客户端禁用了Cookie,则服务器会自动使用URL-rewriting(URL重写,URL中包含session ID的信息)的技术来保存sessionId。
①session是存储在服务端的(在用户第一次请求时,由服务器会创建并用来保存该用户的sessionId等信息)
②Session是在多次请求间共享的,但多次请求必须是同一个客户端发起的(例如,同一个用户进行的购物操作)
③Session的实现机制需要先发标识给客户端,再通过客户端发来的标识(jsessionid)找到对应的session
session内置对象是javax.servlet.ServletContext.HttpSession接口的实例化对象
方法 | 简介 |
---|---|
public String getId() | 获取sessionId |
public boolean isNew() | 判断是否是新的session(新用户) |
public void invalidate() | 使session失效 |
public void setAttribute(String name, Object value) | 设置session对象名和对象值 |
public Object getAttribute(String name) | 根据session对象名,获取session对象值 |
public void setMaxInactiveInterval(int interval) | 设置session的有效非活动时间, 单位是秒 |
public int getMaxInactiveInterval() | 获取session的有效非活动时间,单位是秒 |
cookie和session
cookie | session | |
---|---|---|
保存的位置信息 | 客户端 | 服务器端 |
保存的内容 | 字符串 | 对象 |
安全性 | 不安全 | 安全 |
JSP内置对象application
application对象是javax.servlet.ServletContext接口的实例化对象,代表了整个web项目,所以application对象的数据可以在整个web项目中共享,用法上类似于“全局变量”的概念
方法 | 简介 |
---|---|
public String getContextPath() | 获取虚拟路径(默认是项目名称) |
public String getRealPath(String path) | 获取虚拟路径对应的绝对路径 |
四种范围对象的作用域
对象 | 作用域 |
---|---|
pageContext | 数据只在当前自身的页面有效 |
request | 数据在一次请求有效 |
session | 数据在一次会话中有效,但是新开浏览器无效 |
application | 数据在当前Web项目有效,可所有用户共享 |
都存在以下表格中的方法:
方法 | 简介 |
---|---|
public void setAttribute(String name, Object o) | 设置属性名和属性值 |
public Object getAttribute(String name) | 根据属性名,获取对应的属性值 |
public void removeAttribute(String name) | 根据属性名,删除对应的属性值 |
四种作用域的大小依次是pageContext