javaWeb:web为网站,javaWab就是用java来解决web互联网领域的技术栈
B/S架构:Brower/Server,浏览器/服务器 架构模式,他的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器,好处是易于维护和升级,客户端无需任何部署就可以用到新版本
浏览器会通过http协议(类似之前学的tcp、tup协议),跟服务端,请求或响应,服务器会通过Servlet和JSP加载数据库,然后发给前端html、css、js封装后响应给客户端
其中
静态资源:html、css、js、图片等,负责静态的展示页面(每个用户登录后基本展示页面都一样)
动态资源:Servler、JSP等,负责逻辑处理(每个用户登录后展现的数据不一样)
数据库:复制存储数据
HTTP协议:定义通信规则
Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据
web服务器:由静态资源和动态资源组成,可以用Tomcat集成软件处理
HTTP:(后面统一用Tomcat)
HyperText Transfer Protocol ,超文本传输协议,规定了浏览器和服务器之间数据传输的规则
特点:
1.基于TCP协议:面向连接,安全
2.基于请求-响应模型:一次请求对应一次响应
3.http协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
缺点:多次请求间不能共享数据(后面会用java中的会话技术(Cookie、Session)解决,例如在点击加入购物车,数据需要在服务器进行记录,不然当用户点击查看购物车,数据是不会响应到客户端)
优点:速度快
http-请求数据格式:(了解)
1.请求行: 请求数据第一行,其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
2.请求头:第二行开始,格式为key:value形式
3.请求体:POST请求的最后一部分,存放请求参数(只有POST特有)
例如:
常见的HTTP请求头:
Host:表示请求 的主机名
User-Agent:浏览器版本
Accept:表示浏览器可以接收的资源类型
Accept-Language:表示浏览器偏好语言,服务器可以根据此返回不同语言的网页
Accept-Encoding:表示浏览器可以支持的压缩类型
http-响应数据格式:(了解)
1.响应行: 响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
2.响应头:第二行开始,格式为key:value形式
3.响应体:最后一部分,存放响应数据(就是HTML代码)
例:
常见的HTTP响应头:
Content-Type:表示乡音内容的类型
Content-Length:表示该响应内容的长度(字节数)预知大小
Content-Encoding:表示该响应压缩算法(压缩格式)浏览器需要指定解压方式
Cache-Control:指示客户端应如何缓存,例如数据缓存到客户端,客户可以快速的访问
状态码大全:状态 | Status - HTTP 中文开发手册 - 开发者手册 - 腾讯云开发者社区-腾讯云https://cloud.tencent.com/developer/chapter/13553
常见的:
1.200代表OK
2.404代表请求资源不存在,一般url输入有误或网站资源被删除
3.500代表服务器发送不可预期错误,服务器出异常了,赶紧看日志(java代码)
查询方式:
打开网页、f12、任意点击网页内容请求一下服务器、控制台的网络(Network)会进行抓包,点击任意抓包内容、点击Headers、如果由view resource可以点击,即可查看http协议内容
Tomcat-Web服务器:(大部分部署是web项目)
是一个软件,对http协议的操作进行封装,主要功能是“提供网上信息浏览服务”
Tomcat也被称为Web容器(Web服务器)、Servlet容器,Servlet就是一个java类,但是没有主方法去运行,需要依赖于Tomcat才能运行
Apache Tomcat® - Welcome!官网https://tomcat.apache.org/index.html
常用的是Tomcat 8.5版本
点击左侧Tomcat8然后下载右侧64位版本和下载下面的源码
bin目录下
.bat文件是windows类型文件,可以直接打开
.sh文件是linux文件
conf是放一些配置文件
logs放的是一些日志文件
temp是临时目录,临时产生的一些文件会在此文件夹
webapps当web项目写完放到此目录就完成了项目部署
work也是临时目录,临时产生的一些文件会在此文件夹(jsp使用)
解压完成后,打开bin目录,打开startup.bat
然后打开网页输入localhost:8080看看会不会自动打开Tomcat官网,如果有就安装成功了(要一直打开startup.bat才能打开网址)
注意:安装的时候路径一定要全英文的
但是打开的控制台startup.bat里都是乱码,可以打开配置文件conf里的logging.properties
找到java.util.logging.ConsoleHandeler.encoding = UTF-8(由于win是GBK格式)
startup.bat关闭方式:
1.直接关闭:关掉运行窗口(不要用这个)
2.bin/shutdown.bat:正常关闭(流程多)
3.ctrl+:正常关闭(比较常用)
配置:
1.修改启动端口号:conf/server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
注意:http协议默认端口号为80,如果将Tomcat端口号改为80,则将来范文Tomcat的时候,直接输入localhost即可,不用输入端口号
启动时可能出现的问题:
1.端口号冲突:找到对应程序,将其关闭
startup.bat窗口会报错
2.启动startup.bat窗口会一闪而过:检查JAVA_HOME环境变量是否配置正确(因为Tomcat是用java语言编写的,会借用jdk来运行)
Tomcat部署项目:
将项目放到webapps目录下,即完成部署
一般javaweb项目会被打包成war包,即.war格式,当放到javaweb目录下时,过一会就会自动生成项目的文件夹即自动解压war包
idea中创建Maven Web项目:
webapp是web项目特有的目录
—— html:html文件目录(可自定义)
—— WEB-INF是web项目核心目录(必须叫这个名字,打包会自动生成classes文件夹和lib文件夹,编译后的java文件和resources会放到classes文件夹下,pom.xml中依赖坐标对应的jar包会翻入lib文件夹下)
———— web.xml是web项目的配置文件
创建:
方式一:使用骨架创建(注意在webapp下会多一个index.jsp,而不使用骨架是没有的)
1.在创建Maven时需要勾选骨架(注意要选择maven-archetype-webapp)然后一直下一步
将pom.xml文件中从<name>标签到<build>标签删除
然后在main目录下创建java文件夹和resources文件夹
方式二:不使用骨架创建
1.正常创建一个module(maven格式)之后,先将pom.xml文件的坐标定位下加一个<packaging>war</packaging>(如果不先加打包方式,idea不会判定成web项目,就无法在模块中找到)(另外这个打包方式默认是jar包)
2.project construtrue然后点击Facets找打你的Web文件,在Web Resource Directories 栏下会有红色字提示未创建Webapp目录,双击一下一直下一步就可以创建,然后点击上面的Deployment Dscriptors点击+添加一下web.xml(版本默认4.0即可)然后一直下一步即可,然后将WEB-INF目录直接拖到webapp目录下就完成
在idea中使用tomcat
1.将本地tomcat集成到idea中,然后进行项目部署即可就是在idea中直接将war包解压到webapp目录中
点击添加配置文件,然后点击左上角的+号添加,选择Tomcat Local然后点击Configure...选择安装路径(注意不要添加到那种名字相同的包中包)
注意如果此处标红,请手动添加一下jsp-api.jar和servlet-api.jar两个包
点击artifact添加需要打包的web项目,选择(项目名称:war)种格式的
然后在webapp(刚刚你选择要打包的web项目)下创建一个a.html文件,在body里写aaaa随便的字,然后点击右上角运行
运行成功后会自动打开一个网页,然后在网址后面写a.html就能成功跳出刚刚输入的aaaa内容
2.idea中使用Tomcat Maven插件(缺点只能用到Tomcat7版本)
在pom.xml文件夹中添加依赖坐标
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8081</port><!--访问端口号-->
<path>/</path><!--项目访问路径(斜杠是访问任意地址)-->
</configuration>
</plugin>
</plugins>
</build>
使用Maven Helper 插件快速启动项目,选中项目,右键 --> Run Maven --> tomcat7:run
在java中看到规范就应该联想到接口interface
Servlet:
Servlet是java提供的一门动态web资源开发技术(例如:每个用户都有自己的用户名,登录后显示的用户名都不一样)
Servlet是javaEE规范之一,其实就i是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
快速入门:
1.在pom.xml中引入依赖坐标,作用范围是编译和测试,不能是运行,因为tomcat本身已包含该坐标,会引起冲突
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.创建java类,实现Servlet接口,在service这个方法中随便输出内容。并在开头用@WebServlet(“/demo1”)内容可以自定义,但是必须加/斜杠,这个注解是访问路径,即在最后运行时候(tomcat:run),会自动弹出浏览器,在网址后面加/demo就能搜出刚刚你输出的内容("asd123456789") ;但是在此处网页是没有显示任何东西的,因为没有向网页输出任何东西,sout是输出到控制台的,即idea的控制台
package com; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/demo1") public class servletdemo implements Servlet { public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("asd123456789"); } public void init(ServletConfig servletConfig) throws ServletException { } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } public void destroy() { } }
尽量不要用右键tomcat:run,直接点击右上角的run
执行流程:
http://localhost:8080/tomcat2_war/demo1
http://localhost:8080访问的是 Tomcat(web服务器)
/tomcat2_war访问的是在idea创建的web项目(tomcat2)war是因为会把整个打包成war压缩包,且在appweb目录中会自动生成文件夹
/demo1访问的就是对应的Servlet
tomcat会自动创建Servlet对象,因为实现接口必须重写方法,就必定有Service()方法,就会自动调用这个方法
生命周期:
对象的生命周期是指一个对象从被创建到被销毁的整个过程
Servlet运行在Servlet容器(web服务器)即Tomcat中,其生命周期由容器来管理,分为4个阶段:
1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
2.初始化:在Servlet实例化之后,容器将调用Sevlet的init()方法初始化这个独享,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次(配置文件这些加载一次就行)
3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
4.服务终止:当需要释放内存或容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在该方法调用之后,容器会释放这个Servlet实例,该实例随后会被java的立即回收器所回收
@WebServlet(urlPatterns = "/demo",loadOnStartup = 1)
负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
注意:当注解中只配置一个属性值,直接写即可,如果配置多个,得写全即value=“xx”,但此处value和urlPatterns所代表的含义是一样的,见明知意用第二个
在init方法中sout随便输出内容,service也也一样。
当运行了tomcat之后,会弹出浏览器,网址访问对应的Servlet,此时观察控制台,无论浏览器访问几次(可以使用刷新进行访问),init只会出现一次,而service的输出内容会出现多次即访问次数
注意:当直接在idea控制台中终止运行是不会执行destroy方法的,类似于直接中断了,属于非正常关闭。若需要正常关闭需要在terminal(在idea左下角)运行完之后用ctrl+c进行关闭(但是在输出的中文字出现乱码??但是集成tomcat就没问题,但集成的无法在terminal运行,没有tomcat8:run???)
总结一下:首先先创建webapp的maven文件夹(正常创建mvn文件是没有webapp的),建议不使用骨架创建web项目,暂时先使用插件形式的tomcat
另外两个方法比较少用,一个是info为作者信息,一个confige用来传递参数给init方法
体系结构:
由于Servlet接口重复性高,现在使用HttpServlert类来继承(Servlet接口→GenericServlet抽象实现类→HttpServlet对http协议封装的Servlet实现类),需要重写doGet和doPost方法
一样也需要配置访问路径即注解
运行之后直接在网址后面输入地址访问都是以doget方式访问
当在webapp下创建一个html页面,运行tomcat之后打开网址,在网址后面加上html的名称,访问之后提交信息,就是以dopost方式访问(action的访问路径是localhost:8080后面的所有路径)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/demo2" method="post"> <input name="username"><input type="submit"> </form> </body> </html>
httpServlet为什么要用不同的方法?
因为浏览器的get和post位置不一样,get的请求参数在请求行里,post的请求参数在请求体里,所以处理逻辑不一样
http协议里有7种不同的请求方式(在httpServlet抽象类中可以查看)调用方式重写doXxx方法
上面的网页是通过html文件去访问java的WebServlet路径
Servlet urlPattern配置:
进入WebServlet注解的源码种可以看到urlPatterns是个数组
例如:@WebServlet(urlPatterns = {"/demo1","/demo2"},loadOnStartup = 1)
无论在网页里输入demo1还是demo2都可以访问到该WebServlet
urlPattern配置规则:
优先级:精确路径>目录路径>扩展名路径>/*>/
1.精确匹配:/xxx/xxx。。。
2.目录匹配:/xxx/*
前面的是同一个文件夹,*指的是任意文件名
3.扩展名匹配:*.do
注意这个是不能加/斜杠的
4.任意匹配:/或/*(不要使用这个任意匹配)
当配置了/,会覆盖在tomcat的conf/web.xml中的DefaultServlet(用来处理静态资源)
<!-- The default servlet for all web applications, that serves static -->
<!-- resources. It processes all requests that are not mapped to other -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
镜像路径为 /
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
静态资源有包括html文件在内的文件。
先把所有的任意路径注解WebServlet注释掉,然后运行tomcat,打开a.html文件,然后再将注解打开,再运行一次tomcat,然后刷新一下html就刷新不出来了。(但我的一直实现不了这个问题??理解:html是客户端,后台是我们自己,如果我们这样操作了,客户就看不到我们的网址了)
xml配置方式编写Servlet:
从Servlet3.0版本之后就支持使用注解配置,之前只支持xml配置文件的配置方式
步骤:
1.编写Servlet类
2.在web.xml配置该Servlet
<!--
Servlet 全类名
-->
<servlet>
<servlet-name>demo13</servlet-name>
<servlet-class>com.itheima.web.ServletDemo13</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<servlet-name>demo13</servlet-name>
<url-pattern>/demo13</url-pattern>
</servlet-mapping>
</web-app>