一.初识JSP
Jsp页面的组成:静态内容、指令、表达式、小脚本、声明、标准动作、注释等元素构成
Url:统一资源定位符
Url组成:协议、主机名(包括端口号)、路径
1.注释的方式:
1.HTML注释:在浏览器页面可以看见,不安全
<!----html注释----->
2.Jsp注释:在浏览器页面看不见
<%--jsp注释--%>
3.在jsp脚本中注释:在浏览器页面看不见
<%//单行注释%>
<%/*多行注释*/%>
二.脚本元素:
Jsp声明-->java文件的成员方法<%!%>
Jsp小脚本-->java文件中的jspService方法的一段代码<%%>
Jsp表达式-->java文件中的jspService方法中的一段代码,<%=变量或者表达式%>;
三.指令
1.Page指令
Page指令是针对当前页面进行设置的知名,通常位于jsp页面的顶端,一个页面可以包含多个page指令,page指令只对当前jsp页面有效。
1.Page指令中如果使用import要导入多个包时,使用“,”分隔
2.Page指令中contentType=“text/html;charset=utf-8”
3.isErrorPage 取值为true时,表示这是一个处理异常的页面
4.Jsp脚本<%%>中间的java代码必须符合我们java代码的书写格式
用户首次访问页面时 Web容器处理jsp文件请求需要经过的3个阶段
Jsp执行过程
(1)翻译阶段:用户第一次通过浏览器来访问jsp的时候。Tomcat负责把jsp转化成为java文件
(2)编译阶段:服务器把java文件编译成为class文件
(3)执行阶段:首先对生成的java类进行实例化
调用实例化后对象的_jspService()方法输出html给浏览器
(4)浏览器渲染html数据
如果jsp文件没有修改,用户再次请求页面,不用再次翻译和编译,如果文件有改动,则会重新翻译和编译
2. include指令
Include指令表示,,在JSP编译时插入一个包含文本或代码的文件包含的文件可以是jsp页面.html网页.文本文件等,include指令只有一个file属性,表示被包含文件的路径,一个jsp页面可以有多个include指令
01静态包含:
静态包含
静态包含就是讲内容进行了直接替换,就好比程序中定义的变量一样.
语法:
<%@ include file=”应用文件路径 %”>
02动态包含:
(1)不传参数:
<jsp:include page=”{要包含的文件路径|<%=表达式%>}” flush=”true|flase”/>
(2)传递参数:
<jsp:include page=”{要包含的文件路径|<%=表达式%>}” flush=”true|flase”>
<jsp:param name=”参数名称” value=”参数内容”(常量)/>(可以向被包含页面中传递多个参数)
<jsp:param name=”参数名称” value=”<%=参数内容%>”(变量)/>
</jsp:include>
静态包含,遇到同名变量时,先包含后处理,会出现异常
动态包含,遇到同名变量时,先处理后包含,不会出现异常
二.Jsp内置对象
内置对象:内置对象就是由web容器加载的一组ServletAPI的实例,这些实例由JSP规范进行了默认的初始化操作,可以直接在JSP中使用(注意:jsp的内置对象名称均是jsp的保留字,不得当做自定义变量名使用)
不经常使用的内置对象
pageContext 内置对象的集大成者,可以通过pageContext获取到其他的内置对象
Config 指定jsp页面初始配置的对象 Servlet会使用
Page 当前jsp实例化的对象,使用的方法非常有限,一般很少使用
Exception 用来处理页面异常,以后的异常基本都是在java代码中处理,所以很少使用
经常使用的内置对象
Session
Application
Out
Request
response
是由web容器创建的一组对象
1.Jsp内置对象Out
是jspWriter类的实例,作用是用于向浏览器输出数据
01.Out对象经常使用的方法:
(1).void Print(object c)向客户端打印数据(将各种类型的数据转换成字符串);
(2)、 void write(charset) 向客户端打印字符相关的数据(字符、字符数组、字符串);
(3)、void println(Object c) 向客户端打印数据(将各种类型的数据转换成字符串)并换行。
2.request对象主要用于处理客户端的请求
客户请求访问服务器,会携带一些数据,比如客户端的信息,用户填写的信息,提交给服务器,服务器拿到数据后,会分析整理,整理成request对象,然后提交给jsp页面。
01.Request对象的常用方法:
方法名称 | 说明 |
String getParemeter(String name) | 根据表单组件名称获取提交数据 参数中的name必须和input中name属性相对应;
|
String[] getParemeterValues(String name) | 获取表单组件对应多个值时的请求数据。 |
Void setCharacterEncoding(String charset) | 指定每个请求的编码,不包括URL编码,可解决使用post方式提交的乱码问题
|
RequestDispatcher gerRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward()方法用于转发请求 |
02.页面乱码分析:
(1)jsp页面本身的编码;
即page指令里面
注意:一旦指定了一种编码格式 另外一种编码格式不指定的话 默认都采用已经指定的编码格式。
pageEncoding:页面本身的编码;
contentType:指定的是浏览器渲染页面的时候采用的编码格式;
(2)浏览器渲染页面采用的编码;和页面本身的编码格式一致
(3)服务器保存数据采用的编码(request)
服务器默认编码是使用ISO-8859-1来保存数据
解决方法:
对于post方式:
设置读取请求信息的字符编码为UTF-8
在获取请求信息前设置request.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8")设置的是request内部保存数据的格式,不包括url
对于get方式:
Get方式提交的数据在URL里面
1.改变request获取出来的数据的编码
这种方式开发中不推荐使用,使用这种方式,每个数据都必须要进行转码,在实际编码中使用这种方式处理,比较麻烦
2.改变url编码(推荐使用)
3.response 用于响应客户请求并向客户端输出信息
01.常用方法
方法名称 | 说明 |
Void addCookie(Cookie cookie) | 向客户端添加Cookie |
Void setContentType(String type) | 设置HTTP响应的contentType类型 |
Void setCharacterEncoding(String charset) | 设置响应所采用的字符编码类型 |
Void sendRedirect(String location) | 将请求重新定位到一个新的URL上(重定向) |
02.页面重定向
Void sendRedirect(String location)
客户端将重新发送请求到指定的URL,客户端浏览器显示的地址是重定向的地址,客户端可以查看到发起了两次请求
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
response.sendRedirect("welcome.jsp");
}else{
out.print("用户名或密码不正确");
}
%>
状态码
302代表告诉浏览器该重定向一个url了
404代表找不到页面
200,代表0K
重定向页面使用request.getParameter获取不到数据的原因:
客户端带着数据来请求页面时,请求页面告诉浏览器该去请求另一个页面,这时候第一 次请求中的数据就失效了,第二次请求时便只携带了客户端的信息,不带客户信息
解决方法:
1.当第一次请求失效的时候,把数据进行保存,使用数据作为参数发起第二次请求
Get请求的参数是放在url里面的,所以可以使用这种方式来解决,这和表单的提交方式没有关系,"welcome.jsp?userName="+name
第一个请求的页面
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
response.sendRedirect("welcome.jsp?userName="+name);
}else{
out.print("用户名或密码不正确");
}
%>
第二次请求的页面再使用request.getParameter(“参数”)来获取
<% String name=request.getParameter("userName"); %>
<h1>欢迎<%=name %>访问!</h1>
03.转发
2.能不能只发一次请求,来完成页面的跳转
使用转发,客户端浏览器显示的是用户直接请求的页面的url,并且客户端浏览器显示只发送一次请求,整个过程是都是在服务器内部完成的
使用转发来取代重定向实现页面跳转
转发的实现使用Request.getRequestDispatcher(ul);方法来实现
客户端用户直接请求的页面
<%
String name=request.getParameter("userName");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"admin".equals(pass)){
RequestDispatcher rd=request.getRequestDispatcher("welcome.jsp");
rd.forward(request, response);
}else{
out.print("用户名或密码不正确");
}
%>
目标页面:
<% String name=request.getParameter("userName"); %>
<h1>欢迎<%=name %>访问!</h1>
转发和重定向的区别:
相同点:
转发和重定向都是能够实现页面的跳转
不同点:
转发过程:web服务器内部将一个request请求的处理权交给另一个资源,属于同一个访问请求和响应过程,所以request对象的信息不会丢失
转发是在服务器端发挥作用,通过RequestDispatcher对象的forward()方法将提交的信息在多个页面间进行传递;
转发是在服务器内部控制权的转移,客户端浏览器的地址栏不回显示出转向后的地址。
重定向过程:web服务器向浏览器返回一个响应,浏览器接受此响应后再发送一个新的http请求到服务器,这属于两次不同的请求,则上一次请求的request数据将丢失。
重定向是在客户端发挥作用,通过新的请求实现页面转向,其通过浏览器重新请求地址,在地址栏中可以显示转向后的地址。
在URL中参数的拼接 get传参方式
<a href="result.jsp?color=red">red</a>
4.Session会话机制 用于区分客户端
每个session会话都会有一个sessionID ,同一个session对象sessionID相同
Session和浏览器窗口
通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
Sessionid是通过键值对的形式保存在本地的Cookie中
01、Session对象的常用方法:
方法名称 | 说名 |
String getId() | 获取sessionid |
Void setMaxInactiveInterval(int interval) | 设定session的非活动时间(即最大失效时间) |
Int getMaxInactiveInterval() | 获取session的非活动时间(以秒为单位) |
Void invalidate() | 设置session对象失效(用户退出时使用) |
Void setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
Void removeAttribute(String key) | 从session中删除指定名称(key)所对应的对象 |
02session对象的实例:
控制页面代码:
<%
request.setCharacterEncoding("UTF-8");
String userName=request.getParameter("userName");
String passwrod=request.getParameter("passwrod");
boolean flag=false;
//这个if是判断账号和密码是否正确
if("admin".equals(userName)&&"admin".equals(passwrod)){
flag=true;
//用户名和密码正确时,将用户信息保存到session
session.setAttribute("test", userName);
}else{
out.print("你输入的账号或密码不正确");
}
//这是判断用户是否是直接在浏览器输入control.jsp进入的
if(flag){
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
response.sendRedirect("login.jsp");
}
%>
主页面的代码:
<%
//从session中获取用户信息
Object obj=session.getAttribute("test");
if(obj==null){
//使用转发,目的是让用户浏览器窗口的url也变成login.jsp
response.sendRedirect("login.jsp");
return;
}
%>
欢迎<%=obj %>登陆
2session失效
会话超时:会话超时是指两次请求的时间间隔超过了服务器允许的最大时间间隔.
01.手动设置失效: invalidate()
02.超时失效: 通过setMaxInactiveInterval()方法,单位是秒
03.修改配置文件: 通过项目下的web.xml或Tomcat目录下的/conf/web.xml
文件,单位是分钟
<session-config>
<session-timeout>10</session-timeout>
</session-config>
5 application内置对象
作用:用于同一个应用中的所有用户之间的数据共享
01 常用方法:
方法名称 | 说明 |
Void setAttribute(String key,Object value) | 以key/value的形式将对象储存到application中 |
Object getAttribute(String key) | 通过key获取application中存储的对象 |
String getRealPath(String path) | 返回相对路径的真实路径 |
三.四大作用域
四大作用域:page作用域,request作用域,session作用域,application作用域.
四.Cookie
Cookie是web服务器保存在客户端的一系列文本信息
Cookie的作用 对特定对象的追踪,实现各种个性化服务.实现登录
创建cookie
Cookie newCookie= new Cookie(String key,String value);
写入cookie
Response.addCookie(newCookie);
读取cookie
Cookie cookies[]=request.getCookies();