JavaWEB
1.1.基本概念
web开发:
-
web:网页
-
静态web
- html,css
- 提供给所有人看的数据始终不会发生改变
-
动态web
- 提供给所有人看的数据始终会发生改变
- 技术栈:servlet/jsp,asp,php
在Java中,动态web资源开发的技术称为JavaWEB
1.2.web应用程序
web应用程序:可以提供浏览器访问的程序
- a.html,b.html…多个web资源,这些web能被外部访问
- 能访问到的任何一个页面或者资源,都存在某一个计算机上
- url:
- 这些统一的web资源会被放在同一个文件夹下,web应用程序----->Tomcat:服务器
- 一个web应用由多部份组成(静态web,动态web)
- html,css,js
- jsp,servlet
- Java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器
1.3.静态web
- *.html网页后缀,如果服务器上一直存在这些东西,我们就可以直接访问
- 静态web的缺点
- web页面无法更新,所有用户看到的都是同一个页面
- 无法和数据库交互,数据无法持久化,用户无法交互
1.4.动态web
页面会动态展示:“web的页面展示的效果因人而异”
缺点:
- 假如服务器的动态web资源出现错误,我们需要重写编写我们的后台程序,重新发布
- 停机维护
优点:
- 可以动态更新
- 可以与数据库交互(数据持久化)
2.web服务器
2.1技术
asp,
- 微软:国内最早流行的是asp
- 在html中嵌入了vb脚本,asp+com;
- 在asp开发中,基本一个页面都有几千行的业务逻辑代码
- 维护成本高
- C#
- iis服务器
php
- PHP开发速度快,功能很强大,跨平台,代码简单
- 无法承载大访问量的情况
jsp/servlet
- sun公司主推的B/S架构
- 基于Java语言,所有的大公司和开源的组件都是Java开发
- 可以承载三高问题带来的影响
2.2web服务器
服务器是一种被动操作,用来处理用户的一些请求和一些响应信息
IIS
微软的:运行asp程序
Tomcat
下载Tomcat:
1.安装
2.了解配置文件及目录结构
3.这个东西的作用
3.Tomcat
3.1安装Tomcat
3.2Tomcat启动和配置
启动,关闭Tomcat
测试连接
localhost:8080
可能遇到的问题:
- Java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中的设置
3.3配置
可以配置启动的端口号
可以配置主机名称
面试题:
1.输入域名:
2.查找本机的dns缓存
找不到再去找本机的host文件
再找不到就去访问dns服务器
3.4发布一个web网站
4.HTTP
4.1.什么是HTTP
超文本传输协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
4.2.两个时代
- http1.0
- http/1.0:客户端可以与web服务器连接,只能获得一个资源,请求一次就断开连接
- http2.0
- http/1.1:客户端可以与web服务器连接,可以获得多个资源
4.3.http请求
客户端–请求–服务器
1.请求行
- 请求行中的请求方式:GET
- 请求方式:Get,post
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的url地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会会在浏览器的url地址栏显示数据内容,安全,但不高效
2.消息头
4.4.http响应
服务器–响应–服务器
1.响应体
2.响应的状态码
200:请求响应成功
3**:请求重定向
- 重定向:你重新到我给你的新的位置
4xx:找不到资源 404
- 资源不存在
5xx:服务器代码错误 500
网关错误:502
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间能够展示回来,经历了什么
5.Maven
为什么要学maven?
1.在Javaweb开发中,需要使用大量的jar包
2.如何能够让一个东西自动帮助我们导入和配置这个jar包
由此,maven诞生
5.1maven项目架构管理工具
我们目前用它来方便导入jar包的
maven的核心思想:约定大于配置
- 有约束,不要去违反
maven会规定好你如何去编写我们的Java代码,必须按照这个规范来
5.2安装
下载完成后解压即可
5.3环境变量配置
在我们系统环境变量中进行如下配置
- M2_HOME maven目录下的bin目录
- MAVEN_HOME maven的目录
- 在系统的path中的配置%MAVEN_HOME%\BIN
5.4配置镜像
- 镜像:
- 作用:加速我们的下载
- 建议使用阿里云镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--mirrorOf>central</mirrorOf-->
<mirrorOf>*</mirrorOf>
</mirror>
5.5本地仓库
在本地的仓库,远程仓库
建立一个本地仓库:
/path/to/local/repo
5.6在idea中使用maven
1.启动IDEA
2.创建一个maven web项目
4.观察maven仓库的变化
5.idea中的maven设置
idea项目创建成功后,看一眼maven设置
6.到这里,maven在idea中的配置就完成了
5.7创建一个普通的maven项目
不使用模板直接创建
这个只有在web应用下才会有的
5.8在idea中标记文件夹功能
在使用模板建好的maven项目下我们在建一个Java和resources目录,并指定他们的功能
5.9在idea中配置tomcat
上面warning解决:
为什么会出现这个警告:我们访问呢一个网站,需要指定一个文件夹的名字,所以我么一定要配置
5.10pom文件
pom.xml是maven的核心配置文件
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
<?xml version="1.0" encoding="UTF-8"?>
<!--maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--这里是我们刚才配置的GAV-->
<groupId>com.cyz</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--package:项目的打包方式
jar:Java应用程序
war:Javaweb应用
-->
<packaging>war</packaging>
<name>javaweb-01-maven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认构建版本-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编码版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<build>
<finalName>javaweb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
我们在bulid下建立resource
5.13解决遇到的问题
1.maven 3.6.2不能导出项目
2.Tomcat闪退
3.idea中每次都要重复配置maven
4.maven项目中的tomcat无法配置
5.maven导出文件问题
6.servlet
6.1.servlet简介
- servlet就是sun公司开发动态web的一门技术
- sun公司在这些api中提供了一个接口叫做:servlet,如果想开发一个servlet程序,只需要完成两个小步骤:
- 编写一个类,实现servet接口
- 把开发好的Java类部署到web服务器中
把实现了servlet接口的Java程序叫做servlet
6.2,HelloServlet
GET和POST是什么?HTTP协议中的两种发送请求的方法。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
参考博客:https://www.cnblogs.com/logsharing/p/8448446.html
servlet接口在sun公司有两个默认的实现类:HttpServlet,GenericServlet
步骤:
1.构建一个普通的maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立moudel,这个空的工程就是maven的主工程
2.关于maven父子工程的关系
父项目中会有一个
<modules>
<module>javaweb-01-moudl-maven</module>
</modules>
子项目中会有一个
<parent>
<artifactId>javaweb-03-maven</artifactId>
<groupId>com.cyz</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的Java子项目可以使用
3.maven环境优化
【1】修改web.xml为最新的
【2】将maven的结构搭建完整
4.编写一个servlet程序
【1】编写一个普通类
【2】实现servlet接口,我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或post只是请求的方式不同,所以可以相互调用,业务逻辑一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.print("hello word");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
5.编写servlet的映射
为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的servlet,还需要给他一个浏览器能够访问的路径
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用元素和元素完成。
元素用于注册Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。
一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
————————————————
原文链接:https://blog.csdn.net/honghailiang888/article/details/50585475
<!--注册Servlet-->
<servlet>
<servlet-name>servlet</servlet-name> <!--注册servlet的名称,以什么名称注册-->
<servlet-class>com.cyz.servlet.HelloServlet</servlet-class><!--注册的servlet的类的全名称,包括包名-->
</servlet>
<!--映射servlet到url上-->
<servlet-mapping>
<servlet-name>servlet</servlet-name> <!--已经注册的servlet的名称-->
<url-pattern>/*</url-pattern><!--映射到的url路径-->
</servlet-mapping>
6.配置tomcat
注意:配置项目发布的路径
7.启动测试
6.3servlet原理
servlet是由web服务器调用,web服务器在收到浏览器请求后,会:
6.4mapping
1.一个servlet可以指定一个映射路径
2.一个servlet可以指定多个映射路径
3.一个servlet可以指定通用映射路径
4.指定一些后缀或前缀,如:*.cyz注意:*前面不能加请求路径
6.优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.cyz.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
6.5 ServletContext
ServletContext:web应用程序的上下文
web程序和上下文的关系,这里引用一下来说明:如果对“上下文”不太了解的,我这边说下,程序里面所谓的“上下文”就是程序的执行环境,打个比方:你有家吧?如果家都没有就别学编程了,租的也行啊!你就相当于web程序,家就相当于web程序的上下文,你可以在家里放东西,也可以取东西,你的衣食住行都依赖这个家,这个家就是你生活的上下文环境。
web容器在启动的时候,他会为每个web程序都创建一个对应的servletContext对象,他代表了当前的web应用
servletContext在servlet之上,由下图可知,他们拿的都是同一个servletcontext
1.共享数据
我在这个servlet中保存的数据,可以在另外一个servlet中拿到
存放数据的类
package com.cyz.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PutServlet extends HttpServlet {
/*
public ServletContext getServletContext() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletContext();
}
}
*/
//this.getServletContext() servlet上下文
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在ServletContext中放入数据
String name = "陈颍州";
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("username", name); //将一个数据保存在servletcontext中 键值对 key:value
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
获取数据的类
package com.cyz.servlet