javaweb入门到实战
Posted ꧁༺空༒白༻꧂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaweb入门到实战相关的知识,希望对你有一定的参考价值。
JavaWeb
1、基本概念
1.1、前言
-
web也就是网页的意思,如www.baidu.com
-
静态web
- html,css
- 提供给所有人看的数据始终不会发生改变
-
动态web
- 比如淘宝,几乎所有网站
- 提供给所有人看的数据始终在发生改变,每个人在不同时间地点获取的信息不同
- 技术栈:Selvet/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
-
x.htm,X.html都是页面的后缀
-
客户端–请求(network)–>web Service–服务器–>index.html
-
index.html–>web Service–响应Response–>客户端
-
-
静态web存在的缺点
- web页面无法动态更新,所有用户看到的都是同一个页面
- 轮番图,点击特效,伪动态
- javascript【开发常用】
- VBscript
- 他无法和数据库交互(数据无法持久化,用户无法交互)
- web页面无法动态更新,所有用户看到的都是同一个页面
1.4、动态web
-
页面会动态展示:”展示效果随着每个人每个时间地点的发生,打开的web也会发生改变“
-
客户端–请求(network)–>web Service–服务器–>index.html
-
index.html–>web Service–响应Response–>客户端
-
在上述的基础上加上动态的服务
-
请求的时候先来到WebServer Plugin–动态资源&&静态资源–>动态web资源jsp/Servlet&&静态资源web Service
-
-
缺点
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布
- 此时需要停机维护
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布
-
优点
-
web页面可以动态更新,所有用户看到都不是同一个页面
-
它可以与数据库交互(数据持久化:注册登录页面的所有信息)
动态web资源jsp/Servlet–jdbc–>数据库
-
2、web服务器
2.1、技术讲解
ASP:
-
微软:国内最流行的就是ASP;
-
在html中嵌入VB的脚本,ASP+COM;
-
在ASP开发中,基本一个页面都会有几千行代码
-
维护成本极高
-
c#
<h1> <% System.out.println("hello"); /%> </h1>
PHP:
- 开发速度很快,功能很强大,跨平台,代码简单
- 无法承载大访问量的情况
JSP/Servlet
- B/S:浏览和服务器
- C/S:客户端和服务器
- 基于java语言的所有公司,或者开源的组件
- 可以承载三高问题带来的影响(高并发,高可用,高性能)
- 语法像ASP,加强市场强度
2.2、web服务器
服务器是一种被动操作,用来处理用户的一些请求和用户一些响应信息
LLS
微软的;ASP,Window自带的
Tomcat(免费)
实际上就是运行了JSP页面和Servlet
3、Tomcat详解
3.1、安装tomcat
Tomcat官网:http://tomcat.apache.org/
安装教程参考https://www.cnblogs.com/wangshunli/p/4230382.html
3.2、Tomcat启动和配置
文件夹的作用
-
bin:启动和关闭的脚本文件
-
conf:配置
-
lib:依赖的jar包
-
logs:日志
-
webapps:发存放网站
启动、关闭Tomcat
- shutdown.bat停止
- startup.bat启动
访问测试:http://localhost:8080/
访问不了可能发生的问题:
- java环境没有配置
- 闪退问题,需要配置兼容性
- 乱码问题:配置文件中设置
3.3、配置
可以配置启动的端口号
- tomcat的默认端口号为:8080
- mysql:3306
- http:80
- https:443
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="84443"/>
可以配置主机名
- 默认的主机名为:localhost地址127.0.0.1
- 默认网站应用存放的位置:webapps
<Host name="www.kongkong.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
面试题
请你谈谈网站是如何进行访问的!
- 输入一个域名:回车
- 检查本机的C:\\Windows\\System32\\drivers\\etc\\hosts配置文件下有没有这个域名映射;
- 有的话:直接放回对应的IP地址,这个地址有可以访问的web程序
- 没有的话:去DNS服务器找,找到就返回,反之
3.4、发布一个web网站
将自己写的网站,放在Tomcat中指定的web文件夹webapps下,就可以访问网站应该有的结构了
--webapps:Tomcat服务器的web目录
-ROOT
-konkong:网站的目录名
-WEB-INF
-classes:java程序
-lib:web应用所要依赖的jar包
-web.xml:网站配置文件
-index.html默认的首页
-statics
-css
-style.css
-js
-img
........
4、HTTP详解
4.1、什么是HTTP
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上
- 文本:html,字符串
- 超文本:图片、音乐、视频
- 80
Https:安全的
- 443
4.2、两个时代
- http1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开链接
- http1.2:客户端可以与web服务器连接后,可以获取多个web
4.3、HTTP请求
- 客户端–发送请求(request)–服务器
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET
Status Code: 307 Internal Redirect 状态码
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 语言
Connection: keep-alive
请求行
- 请求中的请求方式:GET
- 请求方式:GET,POST,HEAD,DELETE,PUT
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效
请求头
Accept: text/html 告诉浏览器支持的数据类型
Accept-Encoding: gzip, deflate, br 编码格式
Accept-Language: zh-CN,zh;q=0.9 语言
Connection: keep-alive 请求状态
Host: 主机
4.4、响应
- 服务器–响应–客户端
Cache-Control: private 缓存控制
Connection: keep-alive 链接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
响应体
Accept: text/html 告诉浏览器支持的数据类型
Accept-Encoding: gzip, deflate, br 编码格式
Accept-Language: zh-CN,zh;q=0.9 语言
Connection: keep-alive 请求状态
Host: 主机
Refrush: 告诉客户端多久刷新一次
Location:让网页重新定位
响应码
200:请求响应成功
3xx:请求重定向304
- 重新到新位置去
4xx:找不到资源 404
- 资源不存在
5xx:服务器代码错误 500 502:网关错误
常见面试题
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
5、Maven
5.1、为什么需要这种技术
- 在javaweb开发中,需要用大量的jar包,我们手动导入;
- 如何能够让一个东西自动帮我们导入和配置jar包,也就是我们现在所要学习的Maven
5.2、Maven项目架构管理工具
核心思想:约定大于配置
- 有约束,不要违反
5.3、下载安装Maven
官网:http://maven.apache.org/
下载后解压即可
友情提示:下载好的所有环境放在同一个文件夹下面,方便管理
5.4、配置环境变量
我的电脑右键–>属性–>环境变量配置如下:
-
M2_HOME maven目录下的bin目录
-
MAVEN_HOME maven的目录
-
path配置中配置%MAVEN_HOME%\\bin
-
输入mvn -version测试Maven安装是否成功
出现版本号即为成功
5.5、本地仓库
建立一个本地仓库(不需要每次去下载,因为下载很慢)
建立一个本地仓库 localRepository
5.6、在IDEA中使用Maven
-
新建一个项目的时候,点击maven,勾选选项后,可以选择自己需要的依赖包
-
命名包名,最好是用结构com.xxx(这里是你自取).包名
类似与www.baidu.com的倒叙结构com.baidu.www
5.7、IDEA配置Tomcat
在运行的地方点击配置,点+号按钮,找到Tomcat,选择local(本地)
-
解决警告问题
为什么会有这个问题:访问一个网站,需要制定一个文件夹名字
5.8、pom.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>youxaing</groupId>
<artifactId>youxiang</artifactId>
<version>1.0-SNAPSHOT</version>
<!--依赖包-->
<dependencies>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
</dependencies>
</project>
5.9、maven仓库
官网:https://mvnrepository.com/
直接搜索想要的依赖包如何复制到pom.xml文件下即可
6、Servlet
6.1、Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- sun在这些API提供一个接口:Servlet,如果想要开发一个Servlet程序,只需要完成两个小步骤
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
6.2、HelloServlet
-
构建一个maven项目,可以将其src目录删掉,以后我们的学习就在这个项目里面建立model,这个空的工程就是maven主工程
-
关于Maven父子工程的理解
父项目中
<modules> <module>javaweb</module> </modules>
子项目中
<parent> <groupId>HelloServlet</groupId> <artifactId>javaweb</artifactId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java子项目可以直接使用
son extends father
-
Maven环境优化
-
修改web.xml为最新的
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> </web-app>
-
将maven的结构搭建完整
-
-
编写一个Servlet程序
- 编写一个普通类
- 实现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,servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
编写Servlet的映射
为什么需要映射,我们写的是Java程序,但是的通过浏览器连接到web服务器,所以我们要在web服务器中注册我们写的Servlet
<!--注册Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.kongkong.serlvet.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
注意:配置运行项目
-
测试项目
6.3、Servlet原理
由web服务器调用,web服务收到请求后Tomcat将http请求接收并解析为HttpServletRequest对象,
发送给ServletTomcat将HttpServletResponse对象变成http响应,发送给浏览器Servlet是一个基于Java技术的Web组件,运行在服务器端。
它由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。
原文链接:https://blog.csdn.net/chboyce/article/details/79209345
6.4、Mapping问题
- 一个Servlet可以指定一个映射路径
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 可以指定多个映射路径
<!--Servlet的请求路径--><servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping><servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
- 可以指定通配路径
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 自定义后缀
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
-
映射优先级
一般情况下先走固定路径,找不到的时候再走默认路径
<!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.kongkong.serlvet.Error</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
再创建一个Error类来写映射页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.print("<h1>404</h1>"); } }
6.5、ServletContext
web容器启动的时候,他会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
1、共享数据
在这个Servlet中保存的数据,另一个也可以拿到
2、代码实现
-
Servlet1(存数据)
public class Servlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String name="kong"; context.setAttribute("name",name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
-
Servlet2(取数据)
public class Servlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String name = (String) context.getAttribute("name"); resp.getWriter().print(name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
测试代码结果;
3、转发请求数据
public class Servlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//RequestDispatcher requestDispatcher context.getRequestDispatcher("/g");//转发请求路径
//requestDispatcher.forward(req,resp);//调用forward实现转发
context.getRequestDispatcher("/ser").forward(req,resp);
}
4、读取资源文件
public class Servlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is=this.getServletContext().getResourceAsStream("/com/kongkong/servlet/aa.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("userName");
String pwd = prop.getProperty("password"); resp.getWriter().print(user+":"+pwd);
}
userName=kongkong;password=12345;
6.6、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse
- 如果要获取客户端请求过来的参数:找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
1、简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
负责向浏览器发送一些响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setBufferSize(int var1);
响应的状态码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
应用
2、文件下载
-
向浏览器输出消息(一直在讲,就不说了)
- 获取下载文件的路径
- 下载的文件名是啥
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象、
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
public class FileConfig extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取下载文件的路径
String filePath=全网最细的教程javaweb项目入门到实战教程(下)