Java Web
HNU Peter Lv2

Java Web

1、基本概念

  • 静态web:html、css等文件,提供的数据是静态的(所有人看到的都是一样)

    • 无法和数据库交互(数据无法持久化)
      image-20220420092108293
  • 动态web:看到的数据时刻发生变化

    • 技术栈:Serverlet/JSP、(微软ASP)

    image-20220420092356939

在java中方,动态web资源开发技术统称为JavaWeb

  • web应用程序:可供浏览器访问的程序
    • web应用组成:
      • html、css、js
      • jsp、serverlet
      • java程序
      • jar包
      • 配置文件(properties)

2、web服务器

2.1 技术栈

  • ASP(微软):最早,页面混乱,维护成本高
  • PHP:开发速度快,功能强,跨平台,代码简单(WP),无法承载大访问量
  • JSP/Serverlet:B/S浏览器服务器架构,可承载三高问题,基于Java

2.2 Tomcat

==注意:==启动前先配置好java环境变量,tomcat环境变量,否则会闪退!

image-20220420105204706

配置:server.xml

  • 改端口:
1
2
3
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
  • 改主机名localhost(127.0.0.1):
1
2
<Host name="localhost"  appBase="webapps"  //网站存放应用位置webapps
unpackWARs="true" autoDeploy="true">

2.3 发布web网站

基于Tomcat的网站结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--webapps :Tomcat的web目录
-ROOT
-xxx //网站目录名
-WEB-INF
-classes //java程序
-lib //java应用所依赖的jar包
-web.xml //网站配置文件
-index.xml //默认首页
-static
-css
-style.css
-js
-img
-.....

3、Maven

包管理工具。

  • 核心思想:约定大于配置!

下载安装—>配置环境变量—->更改配置文件(镜像地址和本地仓库地址)

4、==IDEA中的Maven==

!!!!注意:IDEA版本和Maven的版本要适配,2021版的idea勿用maven3.8!!!(3.6.3可用)

新建maven项目时发现archetype很少—->先关闭当前项目,再新建项目,则会加载很多模板!

  • 新建的mavenweb文件结构如下:
  • IDEA标记文件夹功能

==未来可能遇到的问题:==由于maven的约定大配置,我们之后可能遇到我们的配置文件,无法被导出或者生效的问题

==解决方案:==在pom.xml中加入如下配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering> //关闭过滤,确保配置文件被导出
</resource>
</resources>
</build>

5、Maven仓库的使用

地址:https://mvnrepository.com/

6、Servlet

6.1 Servlet简介

  • sun公司开发动态web的一门技术

开发Servlet只需要完成如下两个步骤:

1. 编写一个类,实现Servlet接口
1. 把开发好的Java类部署到web服务器中

把实现了Servlet接口的Java程序叫做:Servlet

6.2 构建Servlet

步骤:

  1. 构建一个普通的Maven项目,删掉src目录,将该工程作为主工程(Maven父子工程)

父项目中ppom.xml新增以下内容:

1
2
3
<modules>
<module>servlet01</module>
</modules>

父项目中的jar包子项目可以直接使用,反之不可

  1. maven环境:
  • 修改web.xml为最新(可以在tomcat里面找到)

  • 将maven的web结构设置好

  • 编写Servlet接口实现类,继承HttpServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.pans.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter(); //响应流
writer.print("hello servlet!");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
  1. 编写Servlet映射

为何需要映射:我们写的java程序,需要通过浏览器访问,而浏览器需要链接web服务器,所以需要在web服务器中注册我们的Servlet!

1
2
3
4
5
6
7
8
9
10
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.pans.servlet.HelloServlet</servlet-class>
</servlet>
<!--映射路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name> //名字要一致
<url-pattern>/hello</url-pattern>
</servlet-mapping>
  1. 配置Tomcat

注意项目发布路径

  1. 启动

在访问编写的java文件路径时出现了一个问题:

经过百度发现时Tomcat10之后包名不再是”javax.servlet”,则是改为”jakarta.servlet”

解决方案时:

  1. Tomcat版本改为10以下的版本
  2. “javax.servlet”改为”jakarta.servlet”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>

<!--类中的导入部分也需要更改
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-->

6.3 Servlet原理

image-20220421152428129

6.4 Servlet 的Mapping

1
2
3
4
5
<!--映射路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name> //名字要一致
<url-pattern>/hello</url-pattern>
</servlet-mapping>
  • 一个Servlet可以指定一个映射路径
  • 一个Servlet可以指定多个映射路径
  • 一个Servlet可以指定通用映射路径
  • 指定后缀或者前缀等。。

注意:指定的固有映射路径优先级大于默认路径。

6.5 ServletContext

web容器在启动的时候,它会为每个web程序创建一个对应的ServletContext对象,它代表当前web应用;(类似Context是个全局对象,为所有Servlet共享(一个Servlet对应一个映射路径))

作用:(几乎都会被替代)

  • 共享数据(会被Session或者request替代)
  • 获取初始化参数
  • 请求转发(由request替代)
  • 读取资源文件(由类加载或者反射来实现)

6.6 HttpServletResponse

应用:

  • 下载文件
  • 验证码功能
  • 重定向!!(一定要注意路径问题)

example:登录界面重定向

index.jsp

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<h2>Hello World!</h2>
<%@ page pageEncoding="UTF-8" %>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit">
</form>
</body>
</html>

login

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.pans.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入此方法!");

String username = req.getParameter("username");
String password = req.getParameter("password");

System.out.println(username+":"+password);

//重定向登录成功页面
resp.sendRedirect("/s1/success.jsp");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

success.jsp

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>success!!!!</h1>
</body>
</html>

6.7 HttpServletRequest

7、Cookie、Session

客户端 服务端

  1. 服务端给客户端一个信件,客户端下次访问时带上信件(cookie)

  2. 服务端登记你来过,下次你来我匹配你(session)

7.1 保存会话的两种技术

cookie:保存在客户端

  • 客户端技术

session:存储在服务端

  • 服务器技术,可以保存用户的会话信息,把信息或者会话放在Session中

应用:用户登录状态

  1. 从请求中拿到cookie
  2. 服务器响应给客户端cookie
1
2
3
4
5
Cookie[] cookies = req.getCookies();  //获得cookie
cookie.getName(); //获得cooKie的key
cookie.getValue(); //获得cooKie的value
Cookie cookie = new Cookie("name","peter"); //创建一个cookie(key,value)
resp.addCookie(cookie); //给客户的响应cookie(间接设置客户端cookie)

7.2 ==Session(重点)==

  • 服务器为每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没关,Session就存在

Cookie与Session区别:

  • Cookie是把用户的数据写到用户浏览器,浏览器保存(可以多个)
  • Session 把用户的数据写到用户独占Session中,服务器端保存
  • Session对象由服务器创建

使用场景:

  • 保存一个登录用户信息
  • 购物车信息
  • 在整个网站中中经常会使用的数据,保存在Session中

8、JSP(Java Server Page服务器端页面)

和Servlet一样用于开发动态页面。

在IDEA编写的jsp文件,可以去IDEA中的工作目录下的tomcat找到当前工作项目,发现jsp底层仍然是java文件:

因此,jsp本质上就是servlet。

浏览器向服务器发送请求,不管在访问什么资源(文件),其实都是在访问Servlet!

9、JavaBean

实体类

JavaBean特有写法:

  • 必须要有一个无参构造
  • 属性必须私有
  • 必须有对应的get/set方法

一般用来和数据库的字段做映射:==ORM==

ORM:对象关系映射

  • 表—>类
  • 字段—>属性
  • 行记录—->对象

10、MVC三层架构

Model(模型) View(视图) Controller(控制器)

image-20220424165922993

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(DAO)

View

  • 展示数据
  • 提供链接发起Servlet请求

Controller(Sevlet)

  • 接收用户请求:(req:请求参数,Session信息)
  • 交给业务层处理对应的代码
  • 控制视图跳转

登录--->接收用户登录请求---->处理请求(获取用户参数)---->交给业务层处理登录业务(判断用户)---->Dao层查询用户名密码----->查数据库

11、==Filter过滤器==

用于过滤网站数据(乱码,过滤文字,权限拦截)

添加过滤器步骤:

  1. 导入相关依赖(pom.xml)
  2. 编写过滤器,实现(implements)Filter接口里面的方法
  3. 在web.xml中配置过滤器(和sevlet类似)
1
2
3
4
5
6
7
8
<filter>
<filter-name>CharactorFilter</filter-name>
<filter-class>com.pans.servlet.login</filter-class> //login为实现Filter的类
</filter>
<filter-mapping>
<filter-name>CharactorFilter</filter-name>
<url-pattern>/*</url-pattern> //需要过滤的网站
</filter-mapping>

12、监听器

编写监听器方法,pom.xml注册监听器

13、JDBC

==项目中实践。。。未完待续。。。==