文章目录
- JSP基础
- JSP简介
- JSP显示过程
- Tomcat服务器
- JSP生命周期
- JSP页面元素
- 九大内置对象
- request对象
- request对象方法:
- request内容乱码问题
- response对象及方法
- 重定向与请求转发的区别
- session对象
- cookie对象
- session对象
- application对象
- 四大范围对象
JSP基础
JSP简介
JSP也是一种可以显示的页面类型,与HTML相似。JSP与HTML的区别就是:
- JSP是动态页面
- HTML是静态页面
什么是动态静态?
静态动态的区别就是是否随着时间、地点、用户操作的改变而而改变。
JSP是javaweb的一种技术,也就是JavaEE的一种技术。JavaEE与JavaSE之间最大的区别就是JavaSE是用的CS架构(Client Service),JavaEE用的是BS架构(Browser Service)。后者是使用浏览器作为客户端与服务端通过HTTP进行交互的。
CS架构的不足:
- 如果软件要升级,那么所有软件都需要升级。例如:QQ、CF
- 维护麻烦,需要维护每一台客户端软件
- 每一台客户端主机都要安装客户端软件
- 总而言之麻烦,但也有不可替代的好处
CS架构的好处:
- CS更美观
- 相应更快
BS架构的优点:
- 服务端升级,客户端无需升级。只需要客服端自己升级即可。
- 维护简单,只要服务器不崩就不会有麻烦。
JSP显示过程
JSP在编译的过程中会先转换成Java文件再进行运行。这个Java文件就是Servlet(后面会讲),Servlet是JavaEE提供的一种服务类,其可以进行请求的拦截并且进行服务操作。
怎么可以看出是先解释成java生成class后执行的呢?例如使用的tomcat服务器,可以通过以下文件路径找到。
使用IDEA创建的web项目,由于IDEA会将tomcat复制一份。所以可以在c:/user/.inteliJidea2018.2这些目录中找到这些class与java。
在访问时,客户端第一次访问JSP页面时会解释成class文件后再执行。所以我们往往打开第一个页面时速度慢,但是再一次访问会快(因为直接访问的class)。
Tomcat服务器
我们的web项目都要放在服务器上才能执行,tomcat是一个轻量级的服务器。我们需要将tomcat嵌入web项目才能运行项目。
Tomcat的文件架构:
- bin:放可执行文件
- conf:放配置文件
- lib:放各种包
- log:放日志文件(就是出错记录还有其他信息都在日志文件中)
- temp:临时文件
- webapps:可执行项目(开发的项目放在这里)
- work:存放由jsp翻译成的java、class文件
tomcat的默认端口号是8080,有时会冲突,在配置文件中改一下端口号就好了。
JSP生命周期
JSP由四大生命周期,对应Servlet的五大生命周期。
- 编译阶段:
- 解析:判断jsp代码有无错误。
- 翻译:将jsp代码翻译成servlet源码。
- 编译:编译生成的servlet源码,生成类。
- 初始化:初始化servlet。(对应servlet的初始化)
- 服务:调用servlet实例的服务方法。(对应servlet的服务)
- 销毁:调用servlet对象的销毁函数。
JSP页面元素
JSP是一种Servlet,由JSP的生命周期可知。
- 脚本书写(写java代码的地方)
代码定义:
<%
//写java代码的地方,此处的代码是servlet的执行代码。
%>
代码的定义在编译后的servlet中的**_jspService**函数中,其中定义了java代码与html代码。
html代码使用的是out对象(PrintWriter类的实例)进行输出到页面上的。在servlet中的就是service部分的代码。
- 指令书写
代码定义:
<%@ %>
<%-- 例如: --%>
<%@page %>
<%@include %>
<%@taglib %>
以上三个都是指令。
page指令:
<%@page %>
page指令行中的属性:
- language:指定jsp的脚本使用的语言。
- import:导入jsp要引用的外部类。
- pageEncoding:jsp页面的编码格式。
- contentType:浏览器解析jsp的编码格式。
- 注释书写:
<%--在此处书写注释--%>
九大内置对象
jsp中直接定义的,不像在servlet中还需要进行类的实例化。
- out:进行页面上的输出显示。
- pageContext:页面上下文域对象,对应变量可以在真个页面中存储访问。
- request:请求域对象,与请求相关的对象。(客户端访问服务端是通过请求完成的)对应变量可以在相应请求中存储访问。
- response:与相应相关的对象。(每次客户端访问服务端后,服务端对向客户端相应一下)。
- session:会话域对象,对应变量可以在整个会话中存储访问。
- application:应用域对象,对应变量在整个项目中都可以存储访问。
- config:配置对象。
- page:起到jsp对应servlet的this的作用。
- exception:只有在错误页面中才能使用该对象。
request对象
request对象方法:
- String getParameter(String name);
获取通过form、a标签获取到的数据。根据对应的name获取值。
- String[] getParameterValues(String name);
当form中有input类型为checkbox时,这个时一个name多个option,所以获取时只能用获取值数组的形式。
- void setCharactorEncoding(String encod);
设置请求的中值的编码格式。
- void getRequestDispatcher(String url).forword(request。 respond);
请求转发,收到的请求中的数据原封不动的转发向url。
- ServletContext getServerContext();
获取上下文对象。
- Cookie[] getCookies() ;
获取客户端的cookie们。
request内容乱码问题
- 使用get方式时乱码
- 将每个变量改变编码。
name = new String(name.getBytes("ios-8859-1"), "utf8");
// 原变量获取格式为ios-8859-1的byte,新变量为utf8格式
tomcat的默认编码时ios-8859-1。
- 修改server.xml配置文件的编码格式。(在改端口的地方最后加上URIEncoding=“utf-8”)
- 使用post方式时乱码
在获取变量之前,使用request的修改编码。
request.setCharacterEncoding("utf-8");
在tomcat8中默认编码改为了utf-8。
response对象及方法
当收到用户请求后会给予用户一个相应。
response对象方法:
- void addCookie(Cookie cookie);
服务端向客户端请求中携带cookie。
- void setContentType(String Encoding);
设置相应编码。
客户端在接受到服务端的相应,会将信息显示在jsp页面上。响应编码就是在服务端相应客户端浏览器时,按照那种格式将信息进行翻译并显示。
例如:
response.setContentType("text/html; charset=utf-8");
就是告诉客户端,我用的时html格式解析显示的。其Encoding时MIME格式。
值得注意的时:服务端与客户端之间的交流是依靠Http协议进行网络传输的。
- void sendRedirect(String url);
重定向到url页面。
重定向与请求转发的区别
重定向 | 请求转发 | |
地址栏是否改变 | 改变 | 不改变 |
是否保留上次收到请求时的数据 | 不保留 | 保留 |
请求的次数 | 2 | 1 |
可以从以上看出两者的区别。
session对象
在讲session对象之前不得不提一下与session对象类似的存在于客户端的域对象,Cookie。
cookie对象
**Cookie对象存在于客户端浏览器,并且cookie对象时服务端产生的,然后发送给客户端由客户端进行存储。**并且在服务端中并没有cookie内置对象,所以必须显示new一个。
例如:
<!--在doGet或doPost函数中-->
Cookie cookie1 = new Cookie("name", "zs");
Cookie cookie2 = new Cookie("age", 29);
reoponse.addCookie(cookie1);
response.addCookie(cookie2);
<!--在jsp中接收获取cookie-->
Cookie[] cookies = request.getCookies();
说白了cookie就是一种键值对的数据结构(key:value)。
cookie方法:
- String getName();获取键名。
- String getValue();获取值。
- void setMaxAge(int time);设置最大生存时间,过了时间cookie失效。
值得注意的时:在客户端域服务端建立连接后服务端会根据session的sessionId生成一个Cookie,name为JSessionId(sessionId的值等于JSessionId)。也就是说在建立连接后使用request.getCookies必会有一个sessionId的cookie。
在自动登录时,其实就是判断SESSIONID与JSESSIONID是否相同。相同就说明这个用户不是第一次登录了,直接自动登录。(第一次登录会创建一个SESSIONID=JSESSIONID)当cookie失效后,再一次登录时没有cookie了就会再次产生一个连接,生成一个新的SESSIONID与新的JSESSIONID。(当session时间长了会自动销毁,所以不用担心cookie失效后新session会使服务端爆炸)。
如果没有对cookie设置MaxAge,那默认保存在浏览器缓存中,当关闭浏览器就会清除。
session对象
每个用户都会产生一个session,session的JSESSIONID与cookie的SESSIONID保证了不同用户访问服务端时之间互不影响。
session存在于服务端。
什么时会话?
当你使用浏览器点进系统后,直到关闭浏览器。这是一次会话。(不关闭浏览器再次进入系统仍是同一次会话)
session方法:
- String getID();获取JSESSIONID。
- boolean isNew();判断用户是否是第一次访问。
- void invalidate();使session失效。
- void setMaxInactiveInterval(int time);设置最大非活动时间。(最大非活动时间:用户在该时间内不动就会使得session失效。也就是退出登录了。)
- void setAttribute(key,value);session也是一个域对象,可以往其中设置属性。
- Object getAttribute(key);根据key获取值。得到值需强转一下,才能得到所需要的类型。
application对象
可以获取当前项目的所有信息。
- String getContextPath();获取虚拟路径。
- String getRealPath(String contextPath);获取绝对路径。
四大范围对象
对象 | 作用域 |
page | 当前页面有效 |
request | 当前请求有效 |
session | 当前会话有效 |
application | 当前项目有效 |
以上四对象作用域从高到低,作用域依次增加。
既然都是范围对象,所以都有一下两函数:
- void setAttribute(String name, Object value);
- Object getAttribute(String name);
- void removeAttribute(String name);
在使用这几个对象时,作用域越小越好(开销少)。
对象 | 作用域 |
page | 当前页面有效 |
request | 当前请求有效 |
session | 当前会话有效 |
application | 当前项目有效 |
以上四对象作用域从高到低,作用域依次增加。
既然都是范围对象,所以都有一下两函数:
- void setAttribute(String name, Object value);
- Object getAttribute(String name);
- void removeAttribute(String name);
在使用这几个对象时,作用域越小越好(开销少)。