author: Zilin Xu
date : 2023.9.20
link: 【JavaWeb视频教程(JSP/Servlet/上传/下载/分页/MVC/三层架构/Ajax)】www.bilibili.com/video/BV18s…
第一阶段:入门
0.
JSP: 动态网页
静态/动态:
- 不要和是否有动感混为一谈
- 是否 随着 时间,地点,用户操作 的 改变而改变
e.g.
静态: 一篇公众号
动态: 查看天气的网站
1. 架构
CS: Client Server
不足
- 如果软件要升级,那么所有设备都要升级
- 维护麻烦: 需要维护每一台 客户端软件
- 每一台客户端 都需要按转客户端软件
我们玩QQ,需要安装
优势
美观
BS:Broser Server
e.g.
网页版:京东,百度
客户端通过浏览器 直接访问 服务端
注意: BS和CS各有优势
2.tomcat解压后目录
bin:可执行文件(startup.bat shutdown.bat)
conf:配置文件(server.xml)
lib: tomcat依赖的jar文件
log:日志文件(记录出错等信息)
temp: 临时文件
webapps: tomcat的可执行项目(我们开发完的项目放入该目录)
work: 存放由jso翻译成的java,以及编译成的class文件
jsp - > Java -> class
3.配置
- 配置jdk(必须配置JAVA_HOME) java_home classPath path
- 配置catalina_home
之后打开 terminal 输入
cd /Users/xzl/Desktop/conf/apache-tomcat-8.5.93/bin
进入到tomcat的bin文件夹
再输入
./catalina.sh start
会看到
可以在浏览器中输入 http://localhost:8080 访问 Tomcat 的欢迎页面。如果成功打开了页面,那么 Tomcat 就正常运行了。
关闭Tomcat
./catalina.sh stop
常见错误: 可能与其他服务的端口号冲突
Tomcat端口号默认8080,太常见了,建议修改
修改端口号:
到conf目录下的server.xml的第69行
4.访问
这个界面是从哪里来的呢
答: 是/apache-tomcat-8.5.93/webapps 这个目录下的ROOT,这是默认的
如果要访问其他的,直接在http://localhost:8888/后面加东西就好,比如:
http://localhost:8888/examples/
那么问题来了,这个又是哪里来的呢?
答:examples里面的WEB-INF里面的web.xml中,第406行
如果没有第一个文件就第二个,没有第二个就第三个
要是把index.html删了就会404
复习八股:
200:一切正常
300/301:页面重定向(跳转)
403: 权限不足(如果访问a目录,但是a目录设置 不可见)
404: 资源不存在
500:服务器内部错误(代码有误)
其他编码:积累
5. 创建自己的项目
在webapps目录下创建JspProject
要遵循一些规则:
- WEB-INF文件夹一定要有!从ROOT里面cv过来,这个里面要有.xml文件,以及:
- 一个classes文件夹
- 上面提到的字节码文件
- 一个lib文件夹
- 三方依赖库,比如一些引用的jar包
- 一个classes文件夹
回到JspProject, 创建index.jsp
<html>
<head>
<title>my first jsp project</title>
</head>
<body>
hello jsp ...
<%
out.print("hello");
%>
</body>
</html>
启动tomcat后把网址改成JspProject
jsp:在html中嵌套Java代码<% %>
如何指定打开哪个文件
在项目/WEB-INF/web.xml中设置 默认的 初始页面
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.xhtml</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
什么时候会报错 500
Java代码写错了
比如:把上面的.jsp里面的out.print("hello"); 分号去掉
6. 虚拟路径
Tomcat怎么知道你默认要访问webapps里面的内容呢
答:虚拟路径
方式1:
缺点: 需要重启
在conf/server.xml中161行
最常用用法
将web项目放到webapps以外的目录下
docBase: 实际路径
path:虚拟路径 (绝对路径, 相对路径 相对于webapps)
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context docBase="" path="/JspProject" />
</Host>
上面 /JspProject 是相对路径,相对于webapps,等同写法:
/Users/xzl/Desktop/conf/apache-tomcat-8.5.93/webapps/JspProject
一般来说用相对路径
把webapps/JspProject挪到桌面,上面17行改成
<Context docBase="/Users/xzl/Desktop/JspProject" path="/JspProject" />
这一行的含义是,当我们访问 path 的时候 就访问 docBase
就改好了,能正常运行
方式2:
在/conf/Catalina/localhost中创建 项目名.xml
<Context docBase="/Users/xzl/Desktop/JspProject" path="/JspProject" />
把这一行放过去就行
两种方式都很常见
第二种方法还有一招:把 .xml 文件名字改成 ROOT.xml
这样的话我们访问http://localhost:8888/就行,因为启动Tomcat的时候它默认去ROOT.xml中找映射
一般不这样干
7.虚拟主机
通过www.test.com访问本机
补充八股again!
在访问一个网址后,会先在本机解析,如果本机有那么就直接加载本机的ip地址。如果没有,比如www.jd.com,那么就回去域名解析器中找对应的ip地址。
127.0.0.1 是localhost的IP地址
怎么在mac中查看localhost的IP地址?
ifconfig lo0 | grep "inet "
步骤
- 先在server.xml中配置
先把141行的defaultHost改成我们想要的www.test.com
再把下面的Host依样画葫芦的写,值得注意的是Context中的 path 我们写的是"/"而不是 "JspProject" 这是因为我们这样的话就可以简化我们的网址。如果还是写 "JspProject" 的话那我们输入的网址就要是 www.test.com/JspProject了。所以这里我们简单一点。
- 添加127.0.0.1到
www.test.com的映射,方法如下:
要将 127.0.0.1 映射到 www.test.com,你可以通过修改你的系统的 hosts 文件来实现。
以下是具体步骤:
-
打开终端应用程序。
-
输入以下命令以编辑 hosts 文件:
sudo nano /etc/hosts你可能需要输入管理员密码以确认。
-
在打开的文本编辑器中,找到一个空白行(或在文件末尾添加一个新行),然后输入:
127.0.0.1 www.test.com这将把
www.test.com映射到本地主机的 IP 地址127.0.0.1。 -
保存并退出文本编辑器。如果你使用的是 nano 编辑器,可以按下
Ctrl + X,然后按Y确认保存,最后按Enter退出。 -
刷新 DNS 缓存:
在终端中运行以下命令以刷新 DNS 缓存:
sudo dscacheutil -flushcache或者在较新版本的 macOS 中,你可以使用以下命令:
sudo killall -HUP mDNSResponder
现在,当你在浏览器中访问 www.test.com 时,它将会映射到本地主机 127.0.0.1。请注意,这只会在你的计算机上有效,而不会影响到其他设备。
这个时候我们访问www.test.com:8888就会出现
如果需要省略端口号的话,就去把8888改成80(虽然我没成功)
回顾一下整个流程
www.test.com -> host找映射关系 -> server.xml找Engine的defaultHost -> 通过“/”(可以省略)映射到/Users/xzl/Desktop/JspProject
这个只是学习一下,一般开发不会用,将上面复原!
8.JSP执行流程
第一次访问:
JSP -> Java -> class
.java 和 .class文件都放在
/Users/xzl/Desktop/offer comes!!!/notes/javaweb 2023.9.20/apache-tomcat-8.5.93/work/Catalina/localhost/JspProject/org/apache/jsp中
第二次访问:直接访问.class文件
注意
如果服务端代码修改了,将会再访问时重新翻译,编译
对比一下:
.java文件严格来说是Servlet文件
Jsp和Servlet可以相互转换
因为第一次请求服务端会有翻译和编译的过程,因此比较慢;后续访问 可以直接访问class,因此速度较快。但是 如果服务端修改了代码,则再次访问时会重新的翻译和编译
第二阶段: 使用Eclipse开发
1.使用Eclipse 开发Web项目 (JSP)
- 用Eclipse配置tomcat
- 打开preference,找到server,选runtime environment
- 在Sever(面板)里配置tomcat
- 点window,把server面板show出来
- 在面板里添加tomcat
在eclipse里创建project
- 点击file,newproject, other, 搜web,选择Dynamic Web Project
- 在出来的页面里,规定名字,选择tomcat刚才配置的版本,那个version3.1就是 servlet版本,后面会讲
- 然后点next,在最后把
web.xml钩上
补充一个eclipse小知识
如果你的界面混乱了,点 window -> Perspective -> Reset Perspective
在webapp目录下分别创建两个.jsp文件
注意
第一次创建的时候选new -> other然后搜jsp
添加两行代码
怎么启动呢
在server面板里右击,add and remove,把刚才创建的project加进去就行
在右击,start就行。输入网址http://localhost:8888/MyJspProject/index1.jsp
为什么输入http://localhost:8888/MyJspProject/ 找不到呢404
因为我们没有在web.xml配置
在web.xml中改成index1.jsp,然后在下面面板中restart就行。
值得一提的是
http://localhost:8888/MyJspProject/ 这个地址是个相对路径,eclipse帮我们配置好了,意思就是访问目录/webapp下的项目
那我们试一下/WEB-INF/index2.jsp
因为出于安全考虑,WEB-INF这个文件夹权限比较高,客户端(浏览器)不能直接访问。只能通过请求转发访问。
注意
并不是任何内部跳转都能访问WEB-INF,原因是, 跳转有两种方式
- 请求转发
- 重定向(访问不了)
统一字符集编码
-
编码分类
- 设置jsp文件的编码: jsp -> java, 配置方法:jsp文件中的pageEncoding属性
- 设置浏览器读取jsp文件的编码 配置方法: jsp文件中的content属性
一般将上述设置成一样的,推荐使用国际编码,UTF-8
- 文本编码: jsp文件本身的编码
- 将整个eclipse中的文件统一设置: preference -> Jsp files -> encoding
- 设置某一个项目
- 设置单独文件: 右键 properties
来看个小问题
我们如果在我们安装tomca的文件夹(offer comes/ notes/ javaweb)里面的server.xml里面改了端口号的话,我们发现对我们eclipse里面的项目没有任何影响。这是因为,我们在eclipse中配置tomcat的时候,会自动拷贝一份独立出来。
要选择上面的Use Tomcate installation意思是托管模式
注意,只能在第一次部署tomcat的时候修改这个选项(双击)
JSP页面元素
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello index1 你好
<%
String name = "Bruce";
out.println("hello JSP" + name);
%>
</body>
</html>
0. 脚本Scriptlet(line 21 - line 25)
- <% 局部变量、Java语句 %>
- <%! 定义全局变量,方法 %>
- <%= 输出表达式%>(和二基本一样,这个不用分号) <%= "hello" + name %>
一般而言修改web.xml、配置文件、java 需要重启tomcat服务器
如果修改jsp/html/css/js,不需要重启
注意
在jsp里面,println不会回车,如果需要的话要这样
out.println("hello JSP" + name + "<br/>");
1. 指令(第一第二行)
page指令(用得最多,还有两种另外的指令)
<%@ page ....%>
指定的属性:
- language:jsp页面使用的脚本语言(Java)
- import:导入类
- pageEncoding:jsp文件自身编码 jsp->java
- contentType: 浏览器解析jsp的编码(一般和上面保持一致)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello index1 你好
<%!
public String name;
public Date date = new Date();
public void init(){
name = "Bruce";
}
%>
<%
init();
out.println("hello JSP");
out.println(name + date);
%>
</body>
</html>
2. 注释
html comment: <!-- -->(可以被客户通过浏览器查看源代码所观察到,其他两个不行)
java comment: // /* */
jsp comment: <%-- --%>
JSP九大内置对象(自带的,不需要new 也能使用的对象)
- out: 输出对象,向客户端输出
- request:请求对象,存储客户端向服务端的请求信息
request对象常见方法
String getParamater(String name) : 根据请求的字段名key,返回字段值value
String[] getParamaterValues(String name) : 根据请求的字段名key,返回多个字段值value(数组,比如checkbox多选按钮)
setCharacterEncoding("编码格式utf-8"):设置请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改成了utf-8)
getRequestDispatcher(“B.jsp”).forward(request,response); : 请求转发 页面A -> B
ServletContext getServerContext():获取项目的ServletContext对象
-
pageContext
-
response
-
session
-
application
-
config
-
page
-
exception