听完后的总结:编写javaweb的过程:
1.建Maven项目,引入jar包
2.建Maven的webapp项目,将web.xml的内容更新成固定模板
1 | <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" |
3.写前端:jsp文件(项目路径:${pageContext.request.contextPath})
4.写后端:class文件:
先extends HTTPServlet
然后Alt+Ins,重写doGet和DoPost方法(后者不需要的话可以直接调用前者)
在服务端输出用的函数:“sout”
在前端输出:out.write()
更改和查看服务器所发出包的内容(主要是更改):resp.方法()
(get/set/add+……)
更改和查看客户端的数据(主要是查看):req.方法()
(get/set/add+……)
路径:和后面在web.xml注册的路径有关,注册的内容可以当成一个文件来理解其绝对和相对路径,绝对路径是从此项目开始的。
5.注册网页:
在web.xml上写以下内容
1 | <!--注册Servlet--> |
6.配置Tomcat
点右上角编辑配置,选择tomcat-本地
填:“名称”“服务器”“默认浏览器”(下面的URL可以参考为路径)“JRE”“端口”
然后必须点“部署”,点“+”,点“工件”,导入对应的war包(很重要!)
点确定,点开始
正片:
1.1 web开发:
静态web:html,css。提供给所有人看的数据始终不会发生变化
动态web:常用技术栈:Servlet/JSP,ASP,PHP。我的理解:不同账号看到的信息不同。
在Java中,动态web次元开发的技术统称为JavaWeb
1.2 web应用程序
web应用程序:可以提供浏览器访问的程序;
1.3 静态web
*.htm、*.htm
缺点:无法动态更新
轮播图:点击特效:伪动态
JavaScript、VBScript
无法和数据库交互
1.4 动态web
2.1 web服务器
ASP:微软:国内最早流行的。在HTML中嵌入了VB的脚本,ASP+COM。在ASP开发中,基本上一个页面都有几千行的业务逻辑代码,页面极其混乱,维护成本高(重构成本高)。C#。IIS服务器。
PHP:PHP开发速度很快,功能很强大,跨平台,代码很简单。无法承载大访问量的情况下(如果淘宝用PHP,双十一一天几亿的并发,秒炸),所以局限在中小型网站(占中国70%左右)
JSP/Servlet:sun公司开发。B/S架构:浏览器和服务器。基于Java语言的,所有大公司,或者一些开源组件,都是用Java写的。可以承载三高问题带来的影响。语法像ASP。
2.2 web服务器
IIS(微软)(Windows自带的和WebLog等)
Tomcat
文件目录:
bin:启动,关闭的脚本文件
conf:配置
lib:以来的jar包
logs:日志
webapps:存放网站
启动、关闭tomcat
startup.bat
shutdown.bat
(有时候会报错没有JAVA_HOME,就现在用户环境下建一个JAVA_HOME,然后在系统变量的Path下放一个%JAVA_HOME%)(或者直接改bat里的路径,但是会影响idea)
3.1目录:
conf:配置
server.xml:服务器核心配置
Connector:改端口(默认8080)
Host(不要碰Engine!):改name能改访问的域名(原来为localhost),但是并没有改域名解析,所以暂时是无法访问的,可以改C:\Windows\System32\drivers\hosts可以解析上去(phpstudy应该就是这样做的),但不建议。改appBase可以修改网站目录
logs:日志(非常重要,可以看所有的传包的GET传参内容)
webapps:网站目录
ROOT:根目录
WEB-INF:下面有和web.xml。这个是安全目录,客户端无法访问,只有服务端可以访问的目录(可以把很多后端脚本扔进去,防止被访问到)。
访问顺序:如果访问index/这个目录,会先检索webapps目录,如果有index目录则访问其中的index.*,如果没有会检索ROOT目录的index目录
examples:例子目录(有大量源码,用于学习)
docs:tomcat的帮助文档
manager和host-manager:管理页面,需要登录
4.1 HTTP
HTTP/1.0
HTTP/1.1
头部参数(消息)
Accept:告诉浏览器所支持的数据类型
Accept-Encoding:支持哪种编码格式(GBK,UTF-8)
Accept-language:语言环境
Cache-Control:缓存控制
Connection:告诉浏览器请求完成是断开还是保持连接
HOST:主机
Refresh:多久刷新一次
Location:让网页重新定位
200:成功
3xx:重定向
4xx:资源不存在
5xx:服务器代码错误(502:网关错误)
5.Maven
为什么学习这个技术:
1.在Javaweb开发中,需要使用大量的jar包,我们手动去导入
2.如何能够让一个东西自动帮我们导入并配置这个jar包
5.1 Maven项目架构管理工具
目前用来导入jar包
核心思想:约定大于配置
有约束,不要去违反
Maven会规定好你该如何去编写我们的java代码,必须按照这个规范来
5.2安装Maven
下载zip包解压
然后配置镜像(mirror),不然下的死慢
配阿里云,从网上搜maven阿里云镜像,然后把一整格mirror标签扔进mirrors标签里
5.3配置环境变量
系统变量:
M2_HOME maven的bin目录
MAVEN_HOME maven的目录
Path中 maven的bin目录
测试:mvn -version
5.4 本地仓库
新建文件加maven-repo
在settings票签下建一个localRepository标签,然后把路径放进去
更新仓库
5.5 在IDEA中使用Maven
1.启动IDEA
2.创建一个Maven项目
5.6 在IDEA中使用MAVEN
1.启动IDEA
2.创建一个MavenWeb项目(勾选Create from archetype可以使用Maven的模板)
(选中maven-archetype-webapp,点击next,创建组和名,next,path选中maven,finish)
IDEA项目创建成功后,看一眼Maven的配置
5.7 创建一个普通的Maven项目
不勾选,直接走下一步(没有选仓库的位置,容易出问题,要改setting下的目录)
src目录下:
main:
java:放置java源代码
resources:放置配置文件
test:
java:测试使用
刚刚创建的Maven:
main:
webapp:
WEB-INF
index.jsp
所以要在main下加java和resources文件夹,然后标记java为源码目录,就可以创建class文件了,将resources目录标记为资源目录
5.8 在IDEA中配置Tomcat
1.点击右上角的“添加配置”,点击“+”
2.找到并选择Tomcat,用本地
3.名称:服务器启动名称,随便配
浏览器:
JRE:配java环境
端口:Tomcat的端口
底下会报错:未指定应用服务器。
是因为没选择tomcat目录
然后转到“部署”,点“+”,“工件”,新建第一个
4.启动Tomcat
访问端口就会显示index.jsp的内容
5.9 Maven侧边栏
点开右侧的Maven
“生命周期”下是Maven的命令行操作
“插件”:甚至可以删掉
“项目依赖”
5.10 pom文件
pom.xml 是Maven的核心配置文件
Maven版本和头文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
Maven的高级之处在于它会帮你导入这个jar包所依赖的其他jar包
Maven由于约定大于配置,所以之后有可能会遇到自己写的配置文件,无法被导出或者生效的问题,解决方案:在build下面加一个resources(可以百度:Maven资源导出问题)
Maven右边栏打开后在最上行有一个“显示依赖项”,点击后可以生成目录的树,直接显示所有jar包的依赖关系(比如一个包出问题了,可以显示会影响到哪些包)
6.Servlet
6.1 Servlet简介
sun公司开发动态web的一门技术
sun公司在这些API中提供了一个接口叫:Servlet,如果想开发一个Servlet程序,只需要完成两个步骤:
编写一个来,实现Servlet接口
把开发好的Java类部署到Web服务器中
把实现了Servlet接口的Java程序叫做Servlet
6.2 HelloServlet
1.构建一个普通的Maven项目,删掉src目录,以后学习就在这个项目里建立Module;这个空的工程就是Maven的主工程(记得先把Maven的目录配置了)
2.导入依赖(百度:Maven Servlet jsp依赖)(Tomcat10+的依赖变为jakarta.servlet)(最好直接去Maven官网搜servlet API,jsp API)(貌似也搜到了tomcat Servlet API和tomcat jsp API)(询问过群里师傅发现,tomcat10是支持Servlet5.0版本的,但是servlet API只到4.0.1,所以只能用tomcat-servlet API)
快捷键:alt+ins:调出重写等选项的框
alt+enter:引入局部变量
3.新建一个module
Maven选webapp
4.编写一个类
1 | package com.kuang.servlet; |
5.编写Servlet的映射
为什么要映射?
我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径(修改web.xml)
1 | <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" |
6.配置tomcat
一定要在“工件”里导入war包!!!(第一次没有这个选项就重启idea)
7.启动测试
如果是tomcat10的话直接用Servlet的api会500,只能用tomcat-Servlet的api(或者jakarta.servlet.api,换名字了)(参考版本对比表)(需要删掉原api,重新调用)https://blog.csdn.net/m0_49500992/article/details/108452815
6.3 Servlet原理
6.4 Mapping
1.一个Servlet可以指定一个映射路径
1 | <servlet-mapping> |
2.一个Servlet可以指定多个映射路径
1 | <servlet-mapping> |
3.一个Servlet可以指定通用的映射路径(通配符*)
1 | <servlet-mapping> |
特例:因为优先级更高,所以会直接覆盖index.jsp(少用)
1 | <servlet-mapping> |
4.指定一些后缀或前缀等等(可能会报错,*
前面不能加项目映射的路径,包括/
,意思是以这个结尾的所有路径)(很多网页都用do,是以前遗留的问题)
1 | <servlet-mapping> |
5.重写404页面
1 | package com.kuang.servlet; |
web.xml:
1 | <!--404--> |
(理论上也包含了hello,但是并不影响,因为优先级问题)
6.优先级问题
置顶了固有的映射路径优先级更高(hello),如果找不到就会走默认的处理请求(通配符)
6.5 ServletContext
部署时保证war包只有一个,不然会重新打包一遍
web容器在启动的时候,它回味每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
应用:
(1)共享数据
我在这个Servlet保存的数据,可以在另外一个Servlet中拿到
1 | package com.kuang.servlet; |
1 | package com.kuang.servlet; |
web.xml:
1 | <servlet> |
(2)配置和调用初始化参数:
1 | package com.kuang.servlet; |
web.xml:
1 | <!--配置一些web应用初始化参数--> |
(3)请求转发(和重定向有区别,url路径没有变,返回值是200,不是300):
1 | package com.kuang.servlet; |
1 | <servlet> |
(4)读取资源文件
Properties类
在java目录下新建properties
在resources目录下新建properties
发现:都被打包到了同一个路径下:classes,我们速成这个路径问classpath
思路:都需要一个文件流
资源文件:
1 | username=root |
1 | public class ServletDemo05 extends HttpServlet { |
6.6 httpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HTTPServletRequest对象,代表响应的一个HTTPServletResponse
如果要获取客户端请求过来的参数:找HTTPServletRequest
如果要给客户端响应一些信息:找HTTPServletResponse
1、简单分类
负责向浏览器发送数据的方法:
getOutputStream()
getWriter()
负责向浏览器发一些响应头的方法:
setCharacterEncoding()
setContentLength()
setContentLengthLong()
setContentType()
setDateHeader()
addDateHeader()
setHeader()
addHeader()
setIntHeader()
addIntHeader()
setStatus()
2.常见应用
1.向浏览器输出信息(略)
2.下载文件
获取下载路径
下载的文件名
设置想办法让浏览器能够支持下载我们需要的东西
获取下载的文件输入流
创建缓冲区
获取OutputStream对象
将FileOutputStraem流写入到buffer缓冲区
使用OutputStream将缓冲区中的数据输出到客户端
1 | package com.kuang.servlet; |
3.验证码功能
前端实现
后端实现,需要用到Java的图片类,产生一个图片
1 | package com.kuang.servlet; |
4.重定向(最重要的)
url会变
常见场景:用户登录
方法:sendRedirect
1 | package com.kuang.servlet; |
重定向(发两次请求,先向A发请求,获得B的路径,然后向B发请求)
转发(发一次请求,向A发请求,A获取B的内容后直接返回给客户端)
6.7 Request应用
HttpServletRequest
代表客户端的请求,客户通过Http协议请求访问服务器,Http请求中的所有信息会被封装到HTTPServletRequest,通过这个HTTPServletRequest的方法,获得客户端的所有信息
req.getContextPath()//获取项目路径(不是很好用,要确定它的根目录是什么)
补充:自己的理解:注册其实相当于创建一个文件,不如注册一个路径为/login,相当于在网页此项目上创建一个login文件,然后像是/index.jsp相当于和它同目录下的文件,所以互相访问可以用相对路径index.jsp和绝对路径/index.jsp
1 | package com.kuang.servlet; |
1 | <%-- |
1 | <%-- |
1 | <servlet> |
7.Cookie、Session
Cookie:服务端发给客户端,保存在客户端上的
Session:服务器自己保存客户端的访问信息,保存在服务器上
7.2 保存会话的两种技术
cookie
客户端技术(响应,请求)
session
服务器技术,可以保存用户的会话信息,我们可以把信息或者数据放在Session中
常见:登录维持
cookie:
1 | package com.kuang.servlet; |
可以用这个程序测试cookie特性:当浏览器关闭(整个关闭)后,就不会再保存cookie了,会再次显示“这是第一次访问”
1 | (这种方法只是设置了cookie在浏览器的生存周期,cookie内容的有效期验证在服务端,根据cookie的内容等信息进行验证) |
1 | 创建一个对象: |
1 | 查询session: |
1 | 注销session: |
1 |
|
1 |
|
1 |
|
1 | JSP脚本片段```<%= java代码%>```:作用域为方法 |
1 | JSP声明 ```<%! java代码%>```:作用域为类 |
1 | JSP声明会被编译到生成的JAVA类的类中,JSP脚本片段会被生成到_jspService方法中 |
1 |
|
1 |
|
<%
pageContext.setAttribute(,); //保存的数据只在一个页面中有效
request.setAttribute(,); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute(,); //保存的数据只在一次会话中有效,从打开刘loan器到关闭浏览器
application.setAttribute(,); //保存的数据只在服务器中有效,从打开浏览器到关闭浏览器
%>
1 |
|
<jsp:include page=”” />
<jsp:forward page=”” />
<jsp:forward page=”” >
<jsp:param name=”name” value=”kuang”>
<jsp:param name=”age” value=”1”>
1 |
|
1 |
|
<jsp:useBean id=”people” class=”” scope=”page”/> //class的参数是自己设置的实体类,里面存的数据,可以理解为数据库
<jsp:setProperty name=”people” property=”name” value=”kuang”/> //存数据
<jsp:getProperty name=”people” property=”name” /> //查数据
1 |
|
String url=”jdbc:mysql://localhost:3306/jdbc?useUnicode=true&charaterEncode=utf-8&useSSL=true”;
String username=”root”;
String password=”123456”;
Connection connection= DriverManager.getConnection(url,username,password);//通过访问端口的方式连接sql
Statement statement=connection.createStatement();//执行sql的对象
String sql=”SELECT * FROM users”;
ResultSet resultSet = statement.executeQuery(sql);//查询并返回结果
//打印
while(resultSet.next()){
System.out.println(resultSet.getObject(“id”));
}
//释放连接
resultSet.close();
statement.close();
connection.close();
```