jsp的页面元素
- 脚本Scriptlet:
<%
java代码 (主要定义局部变量、java语句)
%>
<%!
java代码 (主要定义全局变量、定义方法)
%>
<%=输出表达式6%>
- 指令
- page指令:
<%@ page ... %>
page指令属性:
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- Include指令
JSP可以通过include
指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
<jsp:directive.include file="文件相对 url 地址" />
Taglib
指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib
指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib
指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix
属性指定标签库的前缀。
等价的XML语法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
- 注释
- html注释:
<!-- ... -->
- java注释:
//... 或 /*...*/
- jsp注释:
<%-- ... --%>
jsp内置对象
out
:输出对象,向客户端输出内容pageContext
jsp页面容器request
:请求对象,存储客户端向服务端发送的请求消息-
常见方法
String getParameter(String name)
根据请求字段名key,获取请求字段的值valueString[] getParameterValues(String name)
根据请求字段名key,获取请求字段的值values (常见的有checkbox
)setCharacterEncoding("编码格式")
设置请求编码getRequestDispatcher("b.jsp").forward(request,response)
请求转发的方式跳转页面A->BgetServerContext()
获取项目的ServletContext
对象
-
小例子
index.jsp代码如下:
-
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="show.jsp" method="get">
账号:<input type="text" name="account" /><br/>
密码:<input type="password" name="password" /><br/>
年龄:<input type="text" name="age" /><br/>
爱好:<input type="checkbox" name="hobbies" value="足球"/>足球、
<input type="checkbox" name="hobbies" value="篮球"/>篮球、
<input type="checkbox" name="hobbies" value="游戏"/>游戏、
<input type="checkbox" name="hobbies" value="游泳"/>游泳
<br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
show.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String account = request.getParameter("account");
String password = request.getParameter("password");
String age = request.getParameter("age");
String[] hobbies = request.getParameterValues("hobbies");
%>
注册成功,信息如下:<br/>
账号:<%=account %><br>
密码:<%=password %><br>
年龄:<%=age %><br>
爱好:<%
if(hobbies != null){
for(String hobbie: hobbies){
out.print(hobbie + " ");
}
}
%>
<br>
</body>
</html>
response
- 提供的方法
- void addCookie(Cookie cookie)服务端向客户端增加一个cookie
- void sendRedirect(“a.jsp”)重定向到a.jsp(页面跳转的一种方式),会抛异常throws IOException
- void setContentType(String type) 设置响应编码,设置服务端的content类型
- 小案例
login.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="check.jsp"> 账号:<input type="text" name="account" /><br/> 密码:<input type="password" name="password" /><br/> <input type="submit" value="登录"/> </form> </body> </html>
- 提供的方法
check.jsp代码如下:
<%@page import="java.io.IOException"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String account = request.getParameter("account");
String password = request.getParameter("password");
if(account.equals("张三") && password.equals("abc123")){
//如果账号密码正确则转发到success.jsp(数据不会丢失,通过forward(request, response)中的参数传递)
request.getRequestDispatcher("success.jsp").forward(request, response);
}else{
try{
//账号密码不正确,重定向到login.jsp(数据会丢失)
response.sendRedirect("login.jsp");
}catch(IOException e){
e.printStackTrace();
}
}
%>
</body>
</html>
success.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!<br/>
欢迎
<%=request.getParameter("account") %>
</body>
</html>
- 请求转发与重定向的区别
请求转发 重定向 地址栏是否改变 不变 是否保留第一次请求时的数据 保留 请求次数 1
-
session
- Cookie(不是内置对象,由服务端产生,再发送给客户端保存,相当于本地缓存)
- 可以Cookie可以提高访问效率,但是安全性较差
- Cookie:key = value
- 所在jar包:javax.servlet.http.Cookie
- Cookie方法:public Cookie(String key, String value)、String getName()、String getValue()、void setMaxAge(int expiry)设置最大有效期,单位是秒;
- 服务端发送给客户端:response.addCookie(Cookie cookie)
- 客户端获取Cookie:request.getCookies();
- 小案例
- Cookie(不是内置对象,由服务端产生,再发送给客户端保存,相当于本地缓存)
addCookie.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie cookie1 = new Cookie("name","张三");
Cookie cookie2 = new Cookie("password","abc123");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.sendRedirect("getCookie.jsp");
%>
</body>
</html>
getCookie.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
out.print(cookie.getName() + "---" +cookie.getValue() + "<br/>");
}
%>
</body>
</html>
效果:
- 记住密码和用户名案例
login.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
String uAccount;
String uPassword;
%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
if(cookie.getName().equals("name")){
uAccount = cookie.getValue();
}else if(cookie.getName().equals("password")){
uPassword = cookie.getValue();
}
}
%>
<form action="check.jsp">
账号:<input type="text" name="account" value="<%= uAccount==null?"":uAccount%>"/><br/>
密码:<input type="password" name="password" value="<%= uPassword==null?"":uPassword%>"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
check.jsp代码如下:
<%@page import="java.io.IOException"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String account = request.getParameter("account");
String password = request.getParameter("password");
//将用户信息添加到cookie中
Cookie uAccount = new Cookie("name",account);
Cookie uPassword = new Cookie("password",password);
response.addCookie(uAccount);
response.addCookie(uPassword);
uAccount.setMaxAge(60);
uPassword.setMaxAge(60);
response.sendRedirect("success.jsp");
%>
</body>
</html>
success.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
String uAccount;
%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
if(cookie.getName().equals("name")){
uAccount = cookie.getValue();
}
}
%>
登录成功!<br/>
欢迎
<%=uAccount %>
</body>
</html>
- session(会话)
- 从开始浏览网页到关闭网页为一次会话
- session机制:客户端第一次请求时,服务端会产生一个session对象(用于存储用户的信息),并且每个session对象都有一个唯一的sessionId(用于区分其他的session),服务端会产生一个cookie,并且该cookie的name = JSESSIONID,value = 服务端sessionId的值;服务端在响应客户端的时候会将该cookie发送给客户端,至此,客户端就有一个cookie(同时拥有JSESSIONID);客户端的cookie就可以和服务器端的session一一对应,(JSESSIONID与sessionId一一对应);当客户端第2/n此请求服务端时,服务端会先用客户端的cookie中的JSESSIONID去服务端session中匹配sessionId,如果匹配成功,说明此用户不是第一次访问,无需登录等操作,如果匹配失败,这需要登录。
- session方法:String getId()获取sessionId,Boolean isNew()判断是否是第一次访问,void invaliddate()是session失效,如退出登录,void setAttribute(),Object getAttribute(),void setMaxInactiveInterval(秒)设置最大有效非活动时间,int getMaxInactiveInterval()查看当前最大非活动时间
- 小例子
login.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String account = (String) session.getAttribute("account") == null ? "":(String) session.getAttribute("account");
String password = (String) session.getAttribute("password") == null ? "":(String) session.getAttribute("password");
if(account.equals("张三") && password.equals("abc123")){
response.sendRedirect("success.jsp");
}
%>
<form action="check.jsp">
账号:<input type="text" name="account" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
check.jsp代码如下:
<%@page import="java.io.IOException"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String account = request.getParameter("account") == null ? (String) session.getAttribute("account") : request.getParameter("account");
String password = request.getParameter("password") == null ? (String) session.getAttribute("password") : request.getParameter("password");
if(account == null || password == null){
try{
response.sendRedirect("login.jsp");
}catch(IOException e){
e.printStackTrace();
}
}else if(account.equals("张三") && password.equals("abc123")){
session.setAttribute("account", account);
session.setAttribute("password", password);
session.setMaxInactiveInterval(30);
response.sendRedirect("success.jsp");
}else{
try{
response.sendRedirect("login.jsp");
}catch(IOException e){
e.printStackTrace();
}
}
%>
</body>
</html>
success.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
登录成功!<br/>
欢迎
<%
String account = (String)session.getAttribute("account");
if(account == null){
response.sendRedirect("login.jsp");
}else{
out.print(account);
}
%>
<br>
<a href="logout.jsp">注销</a>
</body>
</html>
logout代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.invalidate();
response.sendRedirect("login.jsp");
%>
</body>
</html>
- session与cookie的区别
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
application
全局对象
- String getContextPath()获取虚拟路径
- String getRealPath(String name)获取绝对路径(与虚拟路径相对应的)
-
config
配置对象(服务器配置信息) -
page
当前jsp页面对象(相当于java中的this) -
exception
异常对象
四种范围对象
从小到大:pageContext(page对象)、request、session、application
对象 | 范围 |
---|---|
pageContext | 当前页面 |
request | 同一次请求有效 |
session | 同一次会话有效 |
application | 整个项目运行期间(切换浏览器仍然有效) |
- 以上四个对象,通过setAttribute赋值,通过getAttribute取值;
- 以上四个对象,尽量使用小范围,因为对象范围越大,性能损耗越大
以上四个对象共有的方法
- getAttribute(String name)根据属性名获取属性值
- void setAttribute(String name, Object obj)设置属性名和值(新增,修改)
- void removeAttribute(String name) 根据属性名删除对象
未完待续…