JavaWeb
1、JSP(动态网页)
1.1.1静态,动态区分
1.不用和是否有“动感”混为一谈
2.是否随时间,地点,用户操作的改变而改变
动态网页:需要使用到服务端脚本语言就(JSP)
1.1.2架构
CS:Client Server
CS不足:
a. 如果软件升级,那么全部软件都需要升级
b. 维护麻烦:需要维护每一台客户端软件
c.每一台客户端都需要安装客户端软件
BS:Browser Server
客户端可以通过浏览器直接访问服务端
注意:BS和CS各有优劣
1.1.3 Tomcat解压后目录
bin:可执行文件(startup.bat shutdown.bat)
conf:配置文件(server.xml)
lib:tomcat以来的jar文件
temp:临时文件
webapps:可执行的项目(将我们开发的项目放入该目录)
work:存放有jsp翻译成的java,以及编辑成的class文件(jsp->java->class)
1.1.4 配置Tomcat
a. 配置jdk(必须配置JAVA_HOME)
b.配置catalina_home(大小写无所谓)
双击bin/startup.bat启动Tomcat常见错误:
1.可能与其他服务的端口号冲突。Tomcat端口号默认8080(此端口号较为常见,容易冲突),建议修改此端口号(8888)
修改端口号:在配置文件修改
1.1.5 访问Tomcat
默认访问路径:D:\java\tomcat\apache-tomcat-8.5.47\webapps\ROOT
修改默认访问路径:设置默认访问界面。D:\java\tomcat\apache-tomcat-8.5.47\webapps\host-manager\WEB-INF\ 下的web.xml中welcom-file-list
常见状态码:
200:一切正常
300/301:页面重定向(跳转)
404:资源不存在
403:权限不足(如果访问a目录,但是a目录设置不可见)
500:服务器内部错误(代码有误)
新建一个web项目必须有的文件:
WEB-INF目录下的文件:
1.web.xml
2.classees目录:放置字节码文件
3.lib:三方依赖库(jia包)
jsp:就是在HTML中嵌套java代码 用<% java代码 %>
1.1.6虚拟路径
将web项目配置到webapps以外的目录
a.方式一
在D:\java\tomcat\apache-tomcat-8.5.47\conf\server.xml中
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<!--Host 中设置虚拟路径appBase(路径) name(名字)-->
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
pattern="%h %l %u %t "%r" %s %b"
prefix="localhost_access_log"
suffix=".txt"
/>
<!--在其中添加Context标签(区分大小写)docBase:实际路径,path:虚拟路径(绝对路径或者相对路径)-->
<!--相对路径/Servlet2.5Project1 相对于D:\java\tomcat\apache-tomcat-8.5.47\webapps-->
<!--访问/Servlet2.5Project1
相当于访问D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1-->
<Context docBase="D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1" path="/Servlet2.5Project1"
reloadable="true"
source="org.eclipse.jst.jee.server:Servlet2.5Project1"
/>
</Host>
</Engine>
缺点:配置完后,需要重启
b.方式二
在D:\java\tomcat\apache-tomcat-8.5.47\conf\Catalina\localhost下建立 项目名.xml写入 当项目名是ROOT时 可以直接访问项目名.jsp
<Context docBase="D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1" path="/Servlet2.5Project1"
reloadable="true"
source="org.eclipse.jst.jee.server:Servlet2.5Project1"
/>
注意:不重启Tomcat也可以访问
1.1.7 虚拟主机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KeVzp6F-1608624299823)(C:\Users\陈思源\AppData\Roaming\Typora\typora-user-images\image-20201220165346406.png)]
通过WWW.test.com访问本机
a.conf/server.xml中
修改defaultHost
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1" autoDeploy="true" name="www.test.com" unpackWARs="true">
<!--在其中添加Context标签(区分大小写)docBase:实际路径,path:虚拟路径(绝对路径或者相对路径)-->
<!--相对路径/Servlet2.5Project1 相对于D:\java\tomcat\apache-tomcat-8.5.47\webapps-->
<!--访问/Servlet2.5Project1
相当于访问D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1-->
<Context docBase="D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1" path="/"
/>
</Host>
b.C:\Windows\System32\drivers\etc中hosts文件。增加映射
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XGuSElt9-1608624299824)(C:\Users\陈思源\AppData\Roaming\Typora\typora-user-images\image-20201220165857260.png)]
网站默认端口是:80
端口默认是80时不用加端口
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fod1ucuK-1608624299827)(C:\Users\陈思源\AppData\Roaming\Typora\typora-user-images\image-20201220170629304.png)]
流程:
www.test.com->hosts找映射关系->server.xml找Engine的defaultHost->通过“/”映射到"D:\java\tomcat\apache-tomcat-8.5.47\wtpwebapps\Servlet2.5Project1"
1.1.7 JSP执行流程
客户端给服务端发送请求->第一次访问:服务端将jsp翻译成java,再将java编译成class文件 第二次访问:直接访问class文件(如果服务端代码修改了,将会在访问时重新翻译、编译)
jsp->java(Servlet文件)->class
jsp和Servlet可以相互转换
因为第一次请求服务端 会有翻译和编译的过程,因此比较慢;后续访问可以直接访问class文件,所以比较块。但是如果服务端修改了代码,则会重新翻译、编译。
2 Eclipse开发Web项目(jsp项目)Tomcat
在Eclipse中创建的Web项目:
浏览器可以直接访问WebContent中的文件,但是WEB-INF中的文件,无法通过客户端(浏览器)直接访问,只能通过跳转(请求转发)来访问。
注意:并不是任何的内部的跳转都能访问WEB-INF。原因时跳转有2中方式:请求转发、重定向。
配置Tomcat运行时环境
第一次在编译器中添加Tomcat环境
a. 在D:\java\tomcat\apache-tomcat-8.5.47\lib找到jar包servlet-api.jar 加入项目的构建路径。
b. 右键项目->Build Path->Add library -> Server Runtime
统一字符集编码
a.编码分类:
设置jsp文件的编码(jsp文件中的pageEncoding属性):jsp-java
设置浏览器读取jsp文件的编码(jsp文件中的content属性)
一般将上述设置成一致的编码,推荐使用UTF-8(不区分大小写)
文本编码:
i. 让整个eclipse中的文件 统一设置
ii. 设置某个项目
iii.设置某个文件
JSP的页面元素:HTML java代码(脚本Scriptlet)指令 注释
a.脚本Scriptlet
i. <%
局部变量、java语句
%>
ii.<%!
定义全局变量、方法
%>
iii. <%=输出表达式%>
一般而言,修改web.xml、配置文件、java 需要重启Tomcat服务,但是修改JSP\html\css\js,不需要重启。
注意:out.println()不能回车,要想会回车:"
"即out.print() <%=%>可以直接解析HTML代码
b.指令
page指令
<%@ page …%>
page置顶的属性:
language:JSP页面使用的脚本语言
import:导入类包
pageEncoding:JSP文件自身编码 JSP->java
contentType:浏览器解析JSP的编码
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" import="java.util.Date"%>
c.注释:
- html注释 可以被客户通过浏览器看到
- java注释// /…/ 文本注释 看不到
- JSP注释<% %> 看不到
3、JSP9大内置对象(自带的,不需要new 也能使用的对象)
3.1out:输出对象,向客户端输出内容
3.2 request:请求对象
请求对象:存储“客户端向服务端发送的请求信息”,数据只会在同一次请求有效
request对象常见的方法:
String getParameter(String name):根据请求的字段名key,返回value(根据input name值,拿input value值)
String[] getParameterValues(String name):根据请求的字段名key,返回多个字段值value(checkbox)
void setCharacterEncoding(“编码格式utf-8”):设置post请求编码(Tomcat7以前默认ios-8859-1,Tomcat8及以后改为UTF-8)
getRequestDispatcher(“b.jsp”).forward(request,response);请求转发的方式跳转页面:A->B
ServerletContext getServerContext():获取项目的ServerletContext对象
get提交方式:method=“get”、超链接()和地址栏 请求方式默认都属于get提交方式
get和post请求方式的区别:
a.get方式在地址栏 显示请求信息(但是地址栏能够容乃的信息有限,4-5KB,如果存在大文件就会报错)
b.文件上传操作必须是post
推荐使用post
统一请求的编码 request:
get方式请求 如果出现乱码,解决:
a. 统一每个变量的编码(不推荐)
new String(旧编码,新编码)
name=new String (name.getBytes(“iso-8859-1”),“utf-8”);
b.修改server.xml,一次性修改更改Tomcat默认get提交方式的编码(UTF-8)建议使用Tomcat时,首先在server.xml中统一get方式的编码URLEncoding=“UTF-8”
post: request.setCharacterEncoding(“UTF-8”)
3.3response:响应对象
常用方法:
void addCookie(Cookie cookie);服务端向客户端增加Cookie
void sendRedirect(String location)throw IOException:页面跳转的一种方式(重定向)
void setContentType(String type)设置服务端的响应编码(ContentType类型)
注意:重定向会导致页面跳转时数据丢失,地址栏改变;请求转发,可以获取数据,并且地址栏没有改变(仍然保持转发时的页面)
请求转发 | 重定向 | |
---|---|---|
地址栏是否改变 | 不变 | 改变 |
是否保留第一次请求时的数据 | 保留 | 不保留(具有偶然性) |
请求的次数 | 1 | 2 |
3.4 session:会话对象
3.4.1Cookie(客户端,不是内置对象):
a.不是内置对象,要使用必须new
b.但是,服务端会自动生成一个(服务端自动new一个cookie)name=JSESSIONID的cookie并返回给客户端。
Cookie时有服务端生成的,再发送给客户端保存。相当于本地缓存的作用:客户端->服务端
作用:可以提高访问服务端的效率,但是安全性较差
Cookie:name=value
javax.servlet.http.Cookie
public Cookie(String name,String value)
String getName();获取name
String getValue();获取value
void setMaxAge(int expiry);最大有效期(秒)
服务端准备Cookie:
response.addCookie(Cookie cookie)
页面跳转(转发、重定向)
客户端获取cookie:request.getCookies();(只能获取全部的Cookie,不能获取单独的Cookie)
a.服务端增加cookie:response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将全部的cookie
拿到
客户端在第一次请求服务端时,如果服务端发现,此请求没有JSESSIONID,则会创建一个name=JSESSIONID的cookie,并发挥给客户端。
通过F12可以发现,除了自己设置的Cookie对象外,还有一个name为JSESSIONID的cookie
建议cookie只保存英文和数字,否则需要进行编码、解码
3.4.2 session:会话
a.浏览网站:开始-关闭
b.购物:浏览、付款、退出
c.电子邮件:浏览、写邮件、退出 开始-结束
session运行机制:
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该客户的信息),并且每个session对象都会有一个唯一的sessionID(用于区分其他session);服务端由会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端SESSIONID的值,然后服务端会在响应客户端的同时将该cookie发送给客户端,至此 客户端就有了一个cookie(JSESSIONID)。因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID=SESSIONID)。
第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID和服务端中的session中的SESSIONID匹配。如果匹配成功,则说明此用户不是第一次访问,无需登录。
3.4.3 session重点(面试常问)
a.session存储在服务端
b.session是在同一个用户(客户)请求时共享
c.实现机制:第一次客户请求时,产生一个SESSIONID并复制给cookie的JSESSIONID,然后发个客户端。最终,通过session的SESSIONID与cookie的JSESSIONID产生一一对应的关系。
3.4.4 session常用方法
String void getId();获取SESSIONID
Boolean isNew();半段是否是新用户(第一次访问)
void invalidate();使session失效(退出登录,注销)
void removAttribute(Object args)移除session某一个属性
void setAttribute();设置属性
Object getAttribute();获取属性
void setMaxInactiveInterval(秒)设置最大有效非活动时间
int getMaxInactiveInterval();获取最大有效非活动时间(不动网页的时间)
3.4.5 session和cookie的区别(面试常考)
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
3.5 application:全局对象
3.5.1常用的方法
String getContextPath() 虚拟路径
String getRealPath(String name);绝对路径(虚拟路径的相对路径)
3.6 pageContext JSP页面容器
3.7 config配置对象(服务器配置信息)
作用:做一些配置信息
3.8 page 当前JSP页面对象(相当于java中的this)
3.9 exception 异常对象
3.10 总结
3.10.1四种范围对象(小->大)
对象 | 有效范围 | 解释 |
---|---|---|
pageContext JSP页面容器(实际上是page对象,容易与page混淆) | 当前页面有效 | 当前页面有效(页面跳转后无效) |
request 请求对象 | 同一次请求有效 | 同一次请求有效,其他请求无效(请求转发后有效,重定向后无效) |
session 会话对象 | 同一次会话有效 | 同一次会话有效(无论怎么跳转,都有效;关闭/切换浏览器后无效:从 登录->退出 之间全都有效) |
application 全局对象 | 全局有效(整个项目有效) | 全局变量;整个项目运行期间都有效(切换浏览器仍然有效);关闭项目、其他项目之后就无效 注意:多个项目共享、重启后仍然有效:JNDI |
以上四个对象共有的方法:
Object getAttribute(String name):根据属性名,或者属性值,来取值
void setAttribute(String name,Object obj):设置属性值(新增,修改)
例如:setAttribute(“a”,“b”)如果a对象之前不存在,则新建一个a对象;如果a之前就已经存在,则将a的值改为b
void removeAttribute(String name)根据属性名,删除对象
注意:
- 以上的四个范围对象,通过setAttribute()赋值,通过getAttribute()取值
切换浏览器后无效:从 登录->退出 之间全都有效) |
| application 全局对象 | 全局有效(整个项目有效) | 全局变量;整个项目运行期间都有效(切换浏览器仍然有效);关闭项目、其他项目之后就无效 注意:多个项目共享、重启后仍然有效:JNDI |
以上四个对象共有的方法:
Object getAttribute(String name):根据属性名,或者属性值,来取值
void setAttribute(String name,Object obj):设置属性值(新增,修改)
例如:setAttribute(“a”,“b”)如果a对象之前不存在,则新建一个a对象;如果a之前就已经存在,则将a的值改为b
void removeAttribute(String name)根据属性名,删除对象
注意:
- 以上的四个范围对象,通过setAttribute()赋值,通过getAttribute()取值
- 以上四个范围对象,尽量使用最小的范围。因为对象的范围越大,造成的性能损耗越大。