JSP

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:\study\JspProject" path="/JspProject" />

docBase:实际路径

path:虚拟路径 (绝对路径、相对路径【相对于webapps】)

重启

b.方式二

D:\study\apache-tomcat-8.5.30\conf\Catalina\localhost

中新建 “项目名.xml”中新增一行:

<Context docBase="D:\study\JspProject" path="/JspProject" />

5、虚拟主机

通过www.test.com访问本机

a. conf/server.xml

<Engine name="Catalina" defaultHost="www.test.com">

  <Host appBase="D:\study\JspProject" name="www.test.com">

    <Context docBase="D:\study\JspProject" path="/"/>

  </Host>

b.C:\Windows\System32\drivers\etc\host

增加

127.0.0.1 www.test.com

流程:www.test.com -> host找映射关系 ->server.xml找Engine的defaultHost ->通过"/"映射到D:\study\JspProject

5、常见状态码:

200:一切正常

300/301:页面重定向 (跳转)

404:资源不存在

403:权限不足 (如果访问a目录,但是a目录设置 不可见)

500:服务器内部错误(代码有误)

其他编码:积累

6、JSP执行流程

jsp- java(Servlet文件) -class

D:\study\apache-tomcat-8.5.30\work\Catalina\localhost\JspProject\org\apache\jsp

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服务,但是如果修改 Jsp\html\css\js ,不需要重启

注意: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 也能使用的对象)

  1. pageContext  JSP页面容器
  2. request   请求对象
  3. session   会话对象
  4. appliation 全局对象
  5. response  响应对象
  6. config  配置对象(服务器配置信息)
  7. out    输出对象
  8. page   当前JSP页面对象(相当于java中的this)
  9. 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 】

重定向:
张三(客户端) -> 服务窗口 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) :设置属性值(新增,修改)
     setAttribute("a","b") ;//如果a对象之前不存在,则新建一个a对象 ;如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象

1、以上的4个范围对象,通过 setAttribute()复制,通过getAttribute()取值;

2、以上范围对象,尽量使用最小的范围。因为 对象的范围越大,造成的性能损耗越大。





posted @ 2021-02-10 11:48  我等着你  阅读(461)  评论(0)    收藏  举报