1 Web相关概念
1.1 软件的基本分类
1.1.1 cs和bs的概念
CS,即C/S(Client/Server)结构,是一种客户机和服务器结构。cs也是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
BS即Browser/Server(浏览器/服务器)结构,就是只安装维护一个服务器,而客户端采用浏览器运行软件。
1.1.2 cs和bs的区别(了解)
1.开发维护成本
cs开发维护成本高于bs。
因为因为采用cs结构时,对于不同的客户端要开发不同的程序,而且软件安装调试和升级都需要在所有客户机上进行。
bs只需要在软件服务器上升级就可以的。
2.安全性
cs安全性高于bs。
cs适用于专人使用的系统,可以通过严格的管理派发软件。
bs使用人数多,不固定,安全性低。
3.客户端负载
cs客户端负载大于bs。
cs客户端不仅负责和用户的交互,收集用户信息,而且还需要通过网络向服务器发出请求。
bs把事务处理逻辑部分交给了服务器,客户端只是负责显示。
4.响应速度
cs响应速度高于bs。
1.2 资源的分类
1.2.1 概念
静态资源:我的理解是前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面。
具体形式为:客户端发送请求到web服务器,web服务器拿到对应的文件,返回给客户端,客户端解析并渲染出来。
动态资源:需要程序处理或者从数据库中读数据,能根据不同的条件在页面显示不同的数据,优点是内容更新不需要修改页面,缺点是访问速度不及静态页面。
具体形式为:客户端请求的动态资源,先把请求交给web的一个存储点,web存储点连接数据库,数据库处理数据之后,将数据交给web服务器,web服务器返回给客户端解析渲染处理。
1.2.2 区别
- 静态资源一般都是设计好的html页面,而动态资源依靠设计好的程序来实现按照需求的动态响应或者从数据库中读数据;
- 静态资源的交互性差,不好更改,而动态资源可以根据需求获取内容;
- 在服务器的运行状态不同,静态资源不需要与数据库参于程序处理,动态资源需要一个或多个数据库的参与运算。
1.3 Tomcat
服务器的种类有很多,有文件服务器、邮件服务器、web服务器、数据库服务器。我们的动态资源是部署在web服务器上的,web服务器接收到http请求之后把请求交给Servlet来处理,调⽤业务类实现动态资源获取。
web服务器有很多,比如tomcat、jetty、weblogic,jboss。
1.3.1概念
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
broswer—>tomcat[servlet]—>jdbc—>数据库
1.3.2 tomcat的下载与安装
官网:https://tomcat.apache.org/
安装:下载绿色版tomcat后,解压到本地磁盘即完成安装
1.3.3 tomcat的目录结构
子目录 | 说明 |
---|---|
bin | 命令中心(启动命令,关闭命令……) |
conf | 配置中心(端口号,内存大小……) |
lib | Tomcat 的库文件。Tomcat 运行时需要的 jar 包所在的目录。 |
logs | 存放日志文件。 |
temp | 存储临时产生的文件,即缓存。 |
webapps | 存放项目的文件,web 应用放置到此目录下浏览器可以直接访问。 |
work | 编译以后的 class 文件。 |
1.3.4 启动tomcat
启动:双击bin/startup.bat文件
访问:游览器搜索栏输入:http://locall:8080
关闭:双击bin/shutdown.bat文件
1.4 war包
war 包是 Sun 提出的一种 web 应用程序格式,它与 jar 类似是一个特殊的压缩包。一个 war 文件包含 Servlet、HTML 页面、Java 类、图像文件及其他资源,简单的来说,jar 只是类的归档文件,而 war 包是一个完整的 web 应用程序。我们war文件直接放在 Tomcat 的 webapps 文件夹下就可以启动该项目了。
1.5 http协议
全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
Request Line:请求行,url、请求方式、状态码、协议/版本
Request Header:请求头,浏览器发送给服务器的一些信息,浏览器---->服务器
Request body:请求体,post请求发送的参数,eg:key=value
Response Header:响应头,服务器返送给浏览器的一些信息,服务器------>浏览器
Response Body:响应体,服务器返回的html
2 Servlet入门
2.1Servlet介绍
2.1.1什么是Servlet
Servlet(Server Applet),全称Java Servlet,未有中文译文。是Java语言编写的运行在tomcat上的程序,用来处理http请求。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP的Web服务器。
2.1.2 Servlet的工作模式
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
2.1.3 Servlet 的主要类型
- Servlet接口:只负责定义Servlet程序的访问规范;
- GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;
- HttpServlet抽象类:实现了service方法,并实现了请求分发处理;
2.2 Servlet的简单使用
实现:
访问tomcat,并渲染到页面一些简单的文字
2.2.1创建web项目
2.2.2添加Servlet依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
2.2.3 添加子项目
添加子项目之后父项目里的依赖子项目也拥有,不用重新添加依赖
没有web目录,参考IDEA 2023.2以上版本,找不到Add framework support选项,创建Java Web解决办法_idea_m0_46717709-GitCode 开源社区 (csdn.net)
这是添加完目录的结构
- webapp:静态资源比如 html css js jsp可以定义在web下面
- WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件
- index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp
2.2.4 创建servlet实例
在main/java目录下创建实现类实现Servler接口,并重新所有方法
package com.by.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author qc
* @version 0.1
* @className HelloServlet
* @date 2024/5/29 20:26
* @since jdk11
*/
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//规定了页面格式文本类型以及在页面渲染一个标题标签内容为hello
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().write("<h1>hello<h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.2.5配置servlet
在src/main/webapp/WEB-INF里配置web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<!-- servlet-name必须和 servlet-mapping里的保持一致 -->
<servlet-name>hello</servlet-name>
<!-- 实现类的全限定名-->
<servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<!-- 自定义url路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
也可以用注解的方式配置
@WebServlet("/hello")
public class HelloServlet implements Servlet {}
2.2.6设置打包方式
修改pom.xml
<!--打包方式-->
<packaging>war</packaging>
2.2.7部署web项目
-
点击Edit Configurations
-
点击+号,选择tomcat下的local
-
选择自己的Tomcat路径,点击右下角fix
-
点击.war点ok
-
启动Tomcat
此时会自动弹出页面
-
在浏览器搜索栏加上/hello测试是否成功
-
webapp目录下也出现war包
自此我们已经学会简单的web项目的创建了
3 Servlet的生命周期
3.1 servlet生命周期中重要的方法
- 构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。
- init方法:创建完servlet对象之后调用,也只是会调用1次。
- service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。
- destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。
3.2 tomcat服务器内部执行代码的原理
1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName(“com.by.servlet.ServletDemo”);
Object o = clazz.newInstance();
3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod(“init”,ServletConfig.class);// 获取方法对象
method.invoke(o,config);
4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod(“service”,ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod(“destroy”,null);
m1.invoke(o,null);
3.3 测试生命周期
package com.by.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author qc
* @version 0.1
* @className LifeCycleServlet
* @date 2024/5/29 21:07
* @since jdk11
*/
@WebServlet("/life")
public class LifeCycleServlet implements Servlet {
public LifeCycleServlet() {
System.out.println("LifeCycleServlet is running");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init is running");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service is running");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy method has run........");
}
}
这里在每个生命周期里面输出一句话
运行tomcat效果应该如图所示
4 servlet的三种创建方式
4.1 实现Servlet接口
package com.by.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author qc
* @version 0.1
* @className ImplementServlet1
* @date 2024/5/29 21:18
* @since jdk11
*/
@WebServlet("/servlet1")
public class ImplementServlet1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是Servlet接口创建的ImplementServlet1");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4.2继承GenericServlet抽象类
package com.by.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author qc
* @version 0.1
* @className ImplementServlet1
* @date 2024/5/29 21:18
* @since jdk11
*/
@WebServlet("/servlet2")
public class ImplementServlet2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是继承GenericServlet抽象类创建的ImplementServlet2");
}
}
4.3继承HttpServlet的方式
package com.by.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author qc
* @version 0.1
* @className ImplementServlet1
* @date 2024/5/29 21:18
* @since jdk11
*/
@WebServlet("/servlet3")
public class ImplementServlet3 extends HttpServlet {
//因为在前端的时候,有两种请求方式get和post
//doGet和doPost方法写在了Service方法中了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("我是继承HttpServlet抽象类的ImplementServlet3");
}
}
还未写完,更新中
更新完成:javaWeb学习笔记(2)