目录
一、JSP的页面元素
1.JAVA代码(脚本Scriptlet)
2.指令
3.注释
二、JSP九大内置对象
1.out:输出对象,向客户端输出内容
2.request:请求对象,存储“客户端向服务端发送的请求信息
3.response:响应对象
4.session
session:会话
session机制
5.application:全局对象
6.pageContext:JSP页面容器
7.config:配置对象(服务器配置信息)
8.page:当前JSP页面对象(相当于JAVA中的this)
9.exception:异常对象
四种范围对象(由小到大)
①pageContext JSP页面容器
②request 请求对象
③session 会话对象
④appliation 全局对象
①
<%
局部变量、Java语句
%>
②
<%!
全局变量、定义方法
%>
③
<%=输出表达式%>
eg:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
<%!
public String bookName;
public void init(){
bookName = "java书";
}
%>
<%
String name = "zhangsan";
out.print("hello..."+name);
init();
%>
<%="hello..."+bookName%>
修改web.xml、配置文件、java,需要重启Tomcat服务
修改Jsp\tml\css\js,不需要重启
<%%>里的print输出的是HTML文本
<%@ %>
page指令:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
page指定的属性:
<%-- --%>
自带的,不需要new也能使用的对象
对象常见方法
示例:
注册 register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
int age = Integer.parseInt(request.getParameter("uage"));
String pwd = request.getParameter("upwd");
String[] hobbies = request.getParameterValues("uhobbies");
%>
注册成功,信息如下:
姓名:<%=name %>
年龄:<%=age %>
密码:<%=pwd %>
爱好:
<%
if(hobbies!=null){
for(String hobby:hobbies){
out.print(hobby+" ");
}
}
%>
get提交方式:method="get" 和 地址栏、超链接()请求方式 默认都属于get提交方式
get与post请求方式的区别:
get方式在地址栏显示请求信息(但是地址栏能够容纳的信息有限,4-5KB);post不会显示
文件上传操作,必须是POST
推荐使用POST
提供的方法:
void addCookie(Cookie cookie):服务端向客户端增加cookie对象
void sendRedirect(String location) throws IOException:页面跳转的一种方式(重定向)
void setContentType(String type):设置服务端相应的编码(设置服务端的contentType类型)
实例:登录
login.jsp -> check.jsp -> success.jsp
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if(name.equals("aa") && pwd.equals("abc")){
//response.sendRedirect("success.jsp"); 页面跳转:重定向,导致数据丢失
//页面跳转:请求转发,可以获取到数据,并且地址栏没有改变(仍然保留转发时的页面)
request.getRequestDispatcher("success.jsp").forward(request,response);
}else{
out.print("用户名或密码错误");
}
%>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登陆成功!
欢迎您:
<%
String uname = request.getParameter("uname");
%>
<%=uname %>
请求转发 | 重定向 | |
地址栏是否改变 | 不变 | 改变 |
是否保留第一次请求时的数据 | 保留 | 不保留 |
请求的次数 | 1 | 2 |
跳转发生的位置 | 服务端 | 客户端 |
session | cookie | |
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
Cookie是由服务端生成的,再发送给客户端保存。
相当于本地缓存的作用:客户端 -> 服务端
作用:提高访问服务端的效率,但是安全性较差
Cookie:name=value
javax.servlet.http.Cookie
①服务端产生cookie:
public Cookie(String name,String value)
String getName()
String getValue()
void setMaxAge(int expiry); 最大有效期(秒)
②服务端准备Cookie:
response.addCookie(Cookie cookie)
③页面跳转(转发,重定向)
④客户端获取cookie:
request.getCookies();
~服务端增加cookie:response对象;客户端获取对象:resquest对象
~不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为JSESSIONID的cookie
建议cookie只保存英文数字,否则需要进行编码、解码
服务端在响应客户端时,会发送一个JESSION的 cookie:客户端在第一次请求服务端时,如果服务端发现此请求没有 JSESSIONID,则会创建一个name=JSESSIONID的 Cookie并返回给客户端
eg:使用Cookie实现记住用户名功能
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%!
String uname;
%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("uname")){
uname = cookie.getValue();
}
}
%>
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
//将用户名加入到cookie中
Cookie cookie = new Cookie("uname",name); //不要中文
response.addCookie(cookie);
response.sendRedirect("A.jsp");
%>
浏览网站:开始-关闭
购物:浏览、付款、退出
电子邮件:浏览、写邮件、退出
从开始到结束是一次会话
客户端第一次请求服务器时,(jsessionid - sessionid进行匹配,不存在时)服务端会产生一个session对象(用于保存该客户的信息)
并且每个session对象 都会有一个唯一的sessionId(用于区分其他session)
服务端就会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值
然后服务端会在响应客户端的同时将该 cookie发送给客户端,至此客户端就有了一个 cookie(JSESSIONID)
因此,客户端的cookie就可以和服务端的session一一对应(JSESSION - sessionID)
客户端第二/n次请求服务器时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和session sessionid)说明此用户不是第一次访问,无需登录;
session:
1、session存储在服务端
2、session是在同一个用户(客户)请求时共享
3、实现机制:第一次客户请求时 产生一个sessionid 并复制给cookie的jsession然后发给客户端。最终通过session的sessionid-cookie的jsessionid匹配
session方法:
String getId():获取sessionId
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效(退出登录、注销)
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval(秒):设置最大有效非活动时间
int getMaxInactiveInterval():获取最大有效非活动时间
示例:登录、注销
request:数据同一次请求有效
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if(name.equals("aa") && pwd.equals("abc")){
//只有登录成功,session中才会存在uname/upwd
session.setAttribute("uname", name);
session.setAttribute("upwd", pwd);
//session.setMaxInactiveInterval(10);
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
response.sendRedirect("login.jsp");
}
%>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登陆成功!
欢迎您:
<%
String name = (String)session.getAttribute("uname");
//如果用户没有登录,而是直接通过地址栏访问welcome.jsp,则必然获取到的name是null
if(name!=null){
out.print(name);
System.out.println("sessionId:"+session.getId());
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("JSESSIONID")){
System.out.println("JSESSIONID:"+cookie.getValue());
}
}
%>
注销
<%
}else{//如果没有登录,应该跳转登录页面
response.sendRedirect("login.jsp");
}
%>
String getContextPath() 虚拟路径
String getRealPath(String name) 绝对路径(虚拟路径 相对的绝对路径)
显示:
<%="当前项目的虚拟路径:"+application.getContextPath()+"
"%>
<%="虚拟路径对应的绝对路径:"+application.getRealPath("/项目名")+"
"%>
pageContext JSP页面容器 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
appliation 全局对象 全局有效(整个项目有效)
以上四个对象共有的方法:
Object getAttribute(String name):根据属性名,获取属性值
void setAttribute(String name,Object obj):设置属性值(新增,修改)
void removeAttribute(String name):根据属性名,删除对象
当前页面有效,页面跳转后无效
同一次请求有效,其它请求无效(请求转发有效,重定向无效)
同一次会话有效(无论怎么跳转,都有效;关闭/切换浏览器后无效;从登陆到退出之间全部有效)
整个项目运行期间都有效(切换浏览器仍然有效)
以上项目尽量用小,因为范围越大性能损耗越大