JavaWeb入门

108 阅读10分钟

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

截屏2023-09-20 20.31.20.png

不足

  1. 如果软件要升级,那么所有设备都要升级
  2. 维护麻烦: 需要维护每一台 客户端软件
  3. 每一台客户端 都需要按转客户端软件
    我们玩QQ,需要安装

优势
美观

BS:Broser Server

e.g.
网页版:京东,百度
客户端通过浏览器 直接访问 服务端

截屏2023-09-20 20.36.08.png

注意: 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.配置

  1. 配置jdk(必须配置JAVA_HOME) java_home classPath path
  2. 配置catalina_home

之后打开 terminal 输入
cd /Users/xzl/Desktop/conf/apache-tomcat-8.5.93/bin
进入到tomcat的bin文件夹
再输入
./catalina.sh start
会看到

截屏2023-09-24 00.12.19.png

可以在浏览器中输入 http://localhost:8080 访问 Tomcat 的欢迎页面。如果成功打开了页面,那么 Tomcat 就正常运行了。

关闭Tomcat
./catalina.sh stop

常见错误: 可能与其他服务的端口号冲突
Tomcat端口号默认8080,太常见了,建议修改

修改端口号:
到conf目录下的server.xml的第69行

截屏2023-09-24 00.15.58.png

4.访问

http://localhost:8888/

截屏2023-09-24 00.20.54 (2).png

这个界面是从哪里来的呢
答: 是/apache-tomcat-8.5.93/webapps 这个目录下的ROOT,这是默认的

截屏2023-09-24 00.24.49.png

如果要访问其他的,直接在http://localhost:8888/后面加东西就好,比如:

http://localhost:8888/examples/

截屏2023-09-24 00.26.14.png

那么问题来了,这个又是哪里来的呢?

答:examples里面的WEB-INF里面的web.xml中,第406行

截屏2023-09-24 00.29.19.png

如果没有第一个文件就第二个,没有第二个就第三个

要是把index.html删了就会404

复习八股:

200:一切正常

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

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

404: 资源不存在

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

其他编码:积累

5. 创建自己的项目

在webapps目录下创建JspProject

要遵循一些规则:

  • WEB-INF文件夹一定要有!从ROOT里面cv过来,这个里面要有.xml文件,以及:
    • 一个classes文件夹
      • 上面提到的字节码文件
    • 一个lib文件夹
      • 三方依赖库,比如一些引用的jar包

截屏2023-09-24 00.40.45.png

回到JspProject, 创建index.jsp

<html>
    <head>
        <title>my first jsp project</title>
    </head>

    <body>
            hello jsp ... 
            <%
                out.print("hello");
            %>
    </body>
</html>

启动tomcat后把网址改成JspProject

截屏2023-09-24 00.46.57.png

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"); 分号去掉

截屏2023-09-24 13.56.51.png

6. 虚拟路径

Tomcat怎么知道你默认要访问webapps里面的内容呢

答:虚拟路径

方式1:

缺点: 需要重启

在conf/server.xml中161行

截屏2023-09-24 14.09.27.png

最常用用法

将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 &quot;%r&quot; %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

就改好了,能正常运行

截屏2023-09-24 14.27.20.png

方式2:

/conf/Catalina/localhost中创建 项目名.xml

<Context docBase="/Users/xzl/Desktop/JspProject" path="/JspProject" />

把这一行放过去就行

截屏2023-09-24 14.36.19.png

两种方式都很常见

第二种方法还有一招:把 .xml 文件名字改成 ROOT.xml

这样的话我们访问http://localhost:8888/就行,因为启动Tomcat的时候它默认去ROOT.xml中找映射

一般不这样干

7.虚拟主机

通过www.test.com访问本机

补充八股again!

截屏2023-09-24 15.30.59.png

在访问一个网址后,会先在本机解析,如果本机有那么就直接加载本机的ip地址。如果没有,比如www.jd.com,那么就回去域名解析器中找对应的ip地址。

127.0.0.1 是localhost的IP地址

怎么在mac中查看localhost的IP地址?

ifconfig lo0 | grep "inet "

步骤

  1. 先在server.xml中配置

截屏2023-09-24 15.57.49.png

先把141行的defaultHost改成我们想要的www.test.com

再把下面的Host依样画葫芦的写,值得注意的是Context中的 path 我们写的是"/"而不是 "JspProject" 这是因为我们这样的话就可以简化我们的网址。如果还是写 "JspProject" 的话那我们输入的网址就要是 www.test.com/JspProject了。所以这里我们简单一点。

  1. 添加127.0.0.1到www.test.com的映射,方法如下:

要将 127.0.0.1 映射到 www.test.com,你可以通过修改你的系统的 hosts 文件来实现。

以下是具体步骤:

  1. 打开终端应用程序。

  2. 输入以下命令以编辑 hosts 文件:

    sudo nano /etc/hosts
    

    你可能需要输入管理员密码以确认。

  3. 在打开的文本编辑器中,找到一个空白行(或在文件末尾添加一个新行),然后输入:

    127.0.0.1  www.test.com
    

    这将把 www.test.com 映射到本地主机的 IP 地址 127.0.0.1

  4. 保存并退出文本编辑器。如果你使用的是 nano 编辑器,可以按下 Ctrl + X,然后按 Y 确认保存,最后按 Enter 退出。

  5. 刷新 DNS 缓存:

    在终端中运行以下命令以刷新 DNS 缓存:

    sudo dscacheutil -flushcache
    

    或者在较新版本的 macOS 中,你可以使用以下命令:

    sudo killall -HUP mDNSResponder
    

现在,当你在浏览器中访问 www.test.com 时,它将会映射到本地主机 127.0.0.1。请注意,这只会在你的计算机上有效,而不会影响到其他设备。

这个时候我们访问www.test.com:8888就会出现

截屏2023-09-24 16.03.43.png

如果需要省略端口号的话,就去把8888改成80(虽然我没成功)

回顾一下整个流程

www.test.com -> host找映射关系 -> server.xml找Engine的defaultHost -> 通过“/”(可以省略)映射到/Users/xzl/Desktop/JspProject

这个只是学习一下,一般开发不会用,将上面复原!

8.JSP执行流程

第一次访问:

JSP -> Java -> class

截屏2023-09-24 19.59.23.png

.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文件

注意

如果服务端代码修改了,将会再访问时重新翻译,编译

对比一下:

截屏2023-09-24 20.05.48.png

.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版本,后面会讲

截屏2023-10-06 15.46.29.png

  • 然后点next,在最后把web.xml钩上

补充一个eclipse小知识

如果你的界面混乱了,点 window -> Perspective -> Reset Perspective

截屏2023-10-06 15.55.52.png 在webapp目录下分别创建两个.jsp文件

注意

第一次创建的时候选new -> other然后搜jsp

添加两行代码

截屏2023-10-06 15.57.06.png

怎么启动呢

在server面板里右击,add and remove,把刚才创建的project加进去就行

截屏2023-10-06 15.58.24.png

截屏2023-10-06 15.58.37.png

在右击,start就行。输入网址http://localhost:8888/MyJspProject/index1.jsp

截屏2023-10-06 16.00.31.png

为什么输入http://localhost:8888/MyJspProject/ 找不到呢404

因为我们没有在web.xml配置

在web.xml中改成index1.jsp,然后在下面面板中restart就行。

截屏2023-10-06 16.03.38.png

截屏2023-10-06 16.04.22.png

值得一提的是

http://localhost:8888/MyJspProject/ 这个地址是个相对路径,eclipse帮我们配置好了,意思就是访问目录/webapp下的项目

那我们试一下/WEB-INF/index2.jsp

截屏2023-10-06 16.07.57.png

因为出于安全考虑,WEB-INF这个文件夹权限比较高,客户端(浏览器)不能直接访问。只能通过请求转发访问。

注意

并不是任何内部跳转都能访问WEB-INF,原因是, 跳转有两种方式

  • 请求转发
  • 重定向(访问不了)

统一字符集编码

  1. 编码分类

    1. 设置jsp文件的编码: jsp -> java, 配置方法:jsp文件中的pageEncoding属性
    2. 设置浏览器读取jsp文件的编码 配置方法: jsp文件中的content属性

    一般将上述设置成一样的,推荐使用国际编码,UTF-8

    截屏2023-10-06 16.22.48.png

    1. 文本编码: jsp文件本身的编码
      1. 将整个eclipse中的文件统一设置: preference -> Jsp files -> encoding
      2. 设置某一个项目
      3. 设置单独文件: 右键 properties

来看个小问题

我们如果在我们安装tomca的文件夹(offer comes/ notes/ javaweb)里面的server.xml里面改了端口号的话,我们发现对我们eclipse里面的项目没有任何影响。这是因为,我们在eclipse中配置tomcat的时候,会自动拷贝一份独立出来。

截屏2023-10-08 01.44.28.png

要选择上面的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)

  1. <% 局部变量、Java语句 %>
  2. <%! 定义全局变量,方法 %>
  3. <%= 输出表达式%>(和二基本一样,这个不用分号) <%= "hello" + name %>

一般而言修改web.xml、配置文件、java 需要重启tomcat服务器

如果修改jsp/html/css/js,不需要重启

注意

在jsp里面,println不会回车,如果需要的话要这样

out.println("hello JSP" + name + "<br/>");

1. 指令(第一第二行)

page指令(用得最多,还有两种另外的指令)

<%@ page ....%>

指定的属性:

  1. language:jsp页面使用的脚本语言(Java)
  2. import:导入类
  3. pageEncoding:jsp文件自身编码 jsp->java
  4. 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:请求对象,存储客户端向服务端的请求信息 截屏2023-10-08 12.24.27.png

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