目录
一、JSP的页面元素
1.JAVA代码(脚本Scriptlet)
2.指令
3.注释
二、JSP九大内置对象
1.out:输出对象,向客户端输出内容
2.request:请求对象,存储“客户端向服务端发送的请求信息
3.response:响应对象
4.session
cookie和session的区别
cookie(客户端,不是内置对象,要使用必须new)
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"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> <%! public String bookName; public void init(){ bookName = "java书"; } %> <% String name = "zhangsan"; out.print("hello..."+name); init(); %> <%="hello..."+bookName%> </body> </html>修改web.xml、配置文件、java,需要重启Tomcat服务 修改Jsp\tml\css\js,不需要重启 <%%>里的print输出的是HTML文本
<%@ %>
page指令:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>page指定的属性:
language:jsp页面使用的脚本语言import:导入类pageEncoding:jsp文件自身编码 jsp->javacontentType:浏览器解析jsp的编码 import="java.util.Date"<%-- --%>
自带的,不需要new也能使用的对象
对象常见方法
String getParameter(String name):根据请求的字段名key,返回字段值valueString[] getParameter(String name):根据请求的字段名key,返回多个字段值value(checkbox)void setCharacterEncoding("编码格式utf-8"):设置请求编码(tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)getRequestDisatcher("b.jsp").forward(request, response):请求转发的方式跳转页面 A->BServletContent getSeverContent():获取项目的ServletContent对象示例: 注册 register.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"> 用户名:<input type="text" name="uname"/></br> 密码:<input type="password" name="upwd"/></br> 年龄:<input type="text" name="uage"/></br> 爱好:</br> <input type="checkbox" name="uhobbies" value="足球"/>足球 <input type="checkbox" name="uhobbies" value="篮球"/>篮球 <input type="checkbox" name="uhobbies" 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 name = request.getParameter("uname"); int age = Integer.parseInt(request.getParameter("uage")); String pwd = request.getParameter("upwd"); String[] hobbies = request.getParameterValues("uhobbies"); %> 注册成功,信息如下:</br> 姓名:<%=name %></br> 年龄:<%=age %></br> 密码:<%=pwd %></br> 爱好:</br> <% if(hobbies!=null){ for(String hobby:hobbies){ out.print(hobby+" "); } } %></br> </body> </html>get提交方式:method="get" 和 地址栏、超链接(<a href="xx">)请求方式 默认都属于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"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="check.jsp" method="post"> 用户名:<input type="text" name="uname"></br> 密码:<input type="password" name="upwd"></br> <input type="submit" value="登录"></br> </form> </body> </html>check.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 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("用户名或密码错误"); } %> </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 uname = request.getParameter("uname"); %> <%=uname %> </body> </html> 请求转发重定向地址栏是否改变不变改变是否保留第一次请求时的数据保留不保留请求的次数12跳转发生的位置服务端客户端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"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <%! String uname; %> <% Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies){ if(cookie.getName().equals("uname")){ uname = cookie.getValue(); } } %> <form action="check.jsp" method="post"> 用户名:<input type="text" name="uname" value="<%=uname==null?"":uname%>"></br> 密码:<input type="password" name="upwd"></br> <input type="submit" value="登录"></br> </form> </body> </html>check.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 name = request.getParameter("uname"); String pwd = request.getParameter("upwd"); //将用户名加入到cookie中 Cookie cookie = new Cookie("uname",name); //不要中文 response.addCookie(cookie); response.sendRedirect("A.jsp"); %> </body> </html>浏览网站:开始-关闭 购物:浏览、付款、退出 电子邮件:浏览、写邮件、退出 从开始到结束是一次会话
客户端第一次请求服务器时,(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"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="check.jsp" method="post"> 用户名:<input type="text" name="uname"></br> 密码:<input type="password" name="upwd"></br> <input type="submit" value="登录"></br> </form> </body> </html>check.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 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"); } %> </body> </html>welcome.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 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()); } } %> <a href="invalidate.jsp">注销</a> <% }else{//如果没有登录,应该跳转登录页面 response.sendRedirect("login.jsp"); } %> </body> </html>String getContextPath() 虚拟路径 String getRealPath(String name) 绝对路径(虚拟路径 相对的绝对路径)
显示:
<%="当前项目的虚拟路径:"+application.getContextPath()+"<br/>"%> <%="虚拟路径对应的绝对路径:"+application.getRealPath("/项目名")+"<br/>"%>
pageContext JSP页面容器 当前页面有效 request 请求对象 同一次请求有效 session 会话对象 同一次会话有效 appliation 全局对象 全局有效(整个项目有效)
以上四个对象共有的方法: Object getAttribute(String name):根据属性名,获取属性值 void setAttribute(String name,Object obj):设置属性值(新增,修改) void removeAttribute(String name):根据属性名,删除对象
当前页面有效,页面跳转后无效
同一次请求有效,其它请求无效(请求转发有效,重定向无效)
同一次会话有效(无论怎么跳转,都有效;关闭/切换浏览器后无效;从登陆到退出之间全部有效)
整个项目运行期间都有效(切换浏览器仍然有效)
以上项目尽量用小,因为范围越大性能损耗越大