1、JSP:动态网页
静态、动态:
1.不用 和 是否有“动感”混为一谈
2.是否 随着 时间、地点、用户操作 的 改变而改变
动态网页 需要使用到 服务端脚本语言(JSP)
jsp:在html中嵌套的java代码
在项目/WEB-INF/web.xml中设置 默认的初始页面
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
2、架构
CS:Client Server
CS不足:
a.如果 软件升级,那么全部软件都需要升级
b.维护麻烦:需要维护每一台 客户端软件
c.每一台客户端 都需要安装 客户端软件
BS :Broswer Server
客户端可以通过 浏览器 直接访问服务端
注意:bs和cs各有优势。
3、tomcat解压后目录:
bin:可执行文件(startup.bat shutdown.bat)
conf:配置文件(server.xml)
lib:tomcat依赖的jar文件
log:日志文件(记录出错等信息)
temp:临时文件
webapps:可执行的项目(将我们开发的项目 放入该目录)
work:存放由jsp翻译成的java,以及编辑成的class文件(jsp ->java ->class)
4、虚拟路径
a.方式一
将web项目配置到 webapps以外的目录
conf/server.xml中配置
host标签中:
<Context docBase="D:studyJspProject" path="/JspProject" />
docBase:实际路径
path:虚拟路径 (绝对路径、相对路径【相对于webapps】)
重启
b.方式二
D:studyapache-tomcat-8.5.30confCatalinalocalhost
中新建 “项目名.xml”中新增一行:
<Context docBase="D:studyJspProject" path="/JspProject" />
5、虚拟主机
通过www.test.com访问本机
a. conf/server.xml
<Engine name="Catalina" defaultHost="www.test.com">
<Host appBase="D:studyJspProject" name="www.test.com">
<Context docBase="D:studyJspProject" path="/"/>
</Host>
b.C:WindowsSystem32driversetchost
增加
127.0.0.1 www.test.com
流程:www.test.com -> host找映射关系 ->server.xml找Engine的defaultHost ->通过"/"映射到D:studyJspProject
5、常见状态码:
200:一切正常
300/301:页面重定向 (跳转)
404:资源不存在
403:权限不足 (如果访问a目录,但是a目录设置 不可见)
500:服务器内部错误(代码有误)
其他编码:积累
6、JSP执行流程
jsp- java(Servlet文件) -class
D:studyapache-tomcat-8.5.30workCatalinalocalhostJspProjectorgapachejsp
Jsp 和Servlet 可以相互转换
因为第一请求服务端 会有翻译 和编译的过程,因此比较慢; 后续访问 可以直接访问class,因此速度较快。但是 如果 服务端修改了代码,则再次访问时 会重新的翻译、编译。
7、使用Eclipse开发Web项目(JSP项目) tomcat
1)在Eclipse中创建的Web项目:
浏览器可以直接访问 WebContent中的文件,例如http://localhost:8888/MyJspProject/index1.jsp,其中的index1.jsp就在WebContent目录中;
但是WEB-INF中的文件 无法通过客户端(浏览器)直接访问,只能通过请求转发来访问
注意:并不是 任何的内部跳转都能访问WEB-INF;原因是 跳转有2种方式:请求转发 、重定向
2)配置tomcat运行时环境
jsp<->Servlet
a.将tomcat/lib中的servlet-api.jar加入项目的构建路径
b.右键项目->Build Path -> Add library ->Server Runtime
3)部署tomcat
在servers面板 新建一个 tomcat实例 , 再在该实例中 部署项目(右键-add)之后运行
注意:一般建议 将eclipse中的tomcat与 本地tomcat的配置信息保持一致: 将eclipse中的tomcat设置为托管模式:【第一次】创建tomcat实例之后, 双击,选择Server Location的第二项
4)统一字符集编码
a.编码分类:
设置jsp文件的编码(jsp文件中的pageEncoding属性): jsp -> java
设置浏览器读取jsp文件的编码(jsp文件中content属性)
一般将上述设置成 一致的编码,推荐使用UTF-8
文本编码:
i.将整个eclipse中的文件 统一设置 (推荐)
ii.设置 某一个项目
iii.设置单独文件
8、JSP的页面元素:
HTML java代码(脚本Scriptlet)、指令、注释
a.脚本Scriptlet
i.
<%
局部变量、java语句
%>
ii.
<%!
全局变量、定义方法
%>
iii.
<%=输出表达式 %>
一般而言,修改web.xml、配置文件、java 需要重启tomcat服务,但是如果修改 Jsphtmlcssjs ,不需要重启
注意:out.println()不能回车; 要想回车:“<br/>”,即out.print() <%= %> 可以直接解析html代码
b.指令
page指令
<%@ page ....%>
page指定的属性:
language:jsp页面使用的脚本语言
import:导入类
pageEncoding:jsp文件自身编码 jsp ->java
contentType:浏览器解析jsp的编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.Date" %>
c.注释
html注释<!-- --> ,可以被客户 通过浏览器查看源码 所观察到
java注释// /*...*/
jsp注释<%-- --%>
8、JSP九大内置对象(自带的,不需要new 也能使用的对象)
- pageContext JSP页面容器
- request 请求对象
- session 会话对象
- appliation 全局对象
- response 响应对象
- config 配置对象(服务器配置信息)
- out 输出对象
- page 当前JSP页面对象(相当于java中的this)
- exception 异常对象
out:输出对象,向客户端输出内容
request:请求对象;存储“客户端向服务端发送的请求信息”,request对象的常见方法:
String getParameter(String name):根据请求的字段名key (input标签的name属性值) ,返回字段值value (input标签的value属性值)
String[] getParameterValues(String name):根据请求的字段名key ,返回多个字段值value (checkbox)
void setCharacterEncoding("编码格式utf-8"):设置post方式的请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)
getRequestDispatcher("b.jsp").forward(request,response):请求转发 的方式跳转页面 A - > B
ServletContext getServerContext():获取项目的ServletContext对象
response:响应对象,提供的方法:
void addCookie( Cookie cookie ); 服务端向客户端增加cookie对象
void sendRedirect(String location ) throws IOException; :页面跳转的一种方式(重定向)
void setContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)
请求转发 | 重定向 | |
地址栏是否改变 | 不变 | 改变 |
是否保留第一次(4种范围对象) | 保留 | 不保留 |
请求的次数 | 1 | 2 |
跳转发生的位置 | 服务端 | 客户发出的第二次跳转 |
转发: 张三(客户端) -> 【 服务窗口 A (服务端 ) -> 服务窗口B 】 |
||
重定向: 张三(客户端) -> 服务窗口 B (服务端 ) ->结束 |
Cookie(客户端,不是内置对象):Cookie是由 服务端生成的 ,再发送给客户端保存。相当于本地缓存的作用: 客户端(hello.mp4;zs/abc)->服务端(hello.mp4;zs/abc)。
作用:提高访问服务端的效率,但是安全性较差。使用Cookie可以实现 记住用户名 功能。
a、不是内对对象,要使用必须new
b、但是,服务端会 自动生成一个(服务端自动new一个cookie) name=JSESIONID的cookie 并返回给客户端
javax.servlet.http.Cookie: name=value
public Cookie(String name,String value)
String getName():获取name
String getValue():获取value
void setMaxAge(int expiry):最大有效期 (秒)
服务端准备Cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取cookie: request.getCookies();
a、服务端增加cookie:response对象;客户端获取对象:request对象
b、不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
建议 cookie只保存 英文数字,否则需要进行编码、解码。
通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie
session(客户端):会话
a、浏览网站:开始-关闭
b、购物: 浏览、付款、退出
c、电子邮件:浏览、写邮件、退出
开始-结束
session机制:客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息),并且每个session对象 都会有一个唯一的 sessionId(用于区分其他session),服务端由会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值,然后服务端会在响应客户端的同时将该cookie发送给客户端,至此客户端就有了 一个cookie(JSESSIONID),因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID),客户端第二/n次请求服务端时,服务端会先用客户端cookie种的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;
顾客(客户端) | 存包处 - 商场(服务端) | |
顾客第一次存包 | 商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)。如果是新顾客(没钥匙) ,分配一个钥匙 给该顾客; 钥匙 会和 柜子 一一对应; | |
第二/n次 存包 | 商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)。如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙 会 和柜子 自动一一对应。 |
a、session存储在服务端
b、session是在 同一个用户(客户)请求时 共享
c、实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终 通过session的sessionid-cookie的jsessionid
session方法:
String getId() :获取sessionId
boolean isNew() :判断是否是 新用户(第一次访问)
void invalidate():使session失效 (退出登录、注销)
void setAttribute()
Object getAttribute();
void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
int getMaxInactiveInterval():获取最大有效 非活动时间
cookie和session的区别
session | cookie | |
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
四种范围对象(小 => 大)
对象 | 有效区域 | |
pageContext JSP页面容器 (page对象) | 当前页面有效,页面跳转后无效。 | |
request 请求对象 | 同一次请求有效,其他请求无效,请求转发后有效,重定向后无效。 | |
session 会话对象 | 同一次会话有效,无论怎么跳转,都有效,关闭/切换浏览器后无效,从 登陆->退出 之间 全部有效。 | |
appliation 全局对象 |
全局有效,整个项目运行期间都有效 (切换浏览器 仍然有效),关闭服务、其他项目 无效。 多个项目共享、重启后仍然有效 :JNDI |
String getContextPath():虚拟路径 String getRealPath(String name):绝对路径(虚拟路径 相对的绝对路径) |
以上4个对象共有的方法: Object getAttribute(String name):根据属性名,或者属性值 void setAttribute(String name,Object obj) :设置属性值(新增,修改) |
||
1、以上的4个范围对象,通过 setAttribute()复制,通过getAttribute()取值; 2、以上范围对象,尽量使用最小的范围。因为 对象的范围越大,造成的性能损耗越大。 |