JavaWeb
JavaWeb
什么是JavaWeb?
- JavaWeb就是指所有通过Java语言编写可以通过浏览器访问的程序的总称;
- 一个JavaWeb程序由多个静态web资源和动态资源组成,web程序开发完成后,若要被外界访问,就要把web应用所在的目录交给web服务器管理(虚拟目录的映射);
- JavaWeb是基于请求和响应来开发的;
静态Web
- 指任何时候访问的内容都一致的Web界面,没有交互;
- 静态资源:html、CSS、js、txt、mp4...
动态Web
- 只访问内容随时间改变的Web界面,有交互,一般是与数据库交互;
- 动态资源:jsp页面、Servlet程序...
什么是请求和响应?
请求
- 请求是指客户端向服务器发送数据,Request;
响应
- 响应是指服务器给客户端返回数据,Response;
请求和响应是成对出现的,有请求就有响应;
常用的Web服务器
Web服务器主要用来接收客户端发送的请求和响应客户端的请求;
-
Web服务器主要用来接收客户端发送的请求和响应客户端请求。
-
Tomcat(Apache)( 我们主要撸这只猫 ):当前应用最广的JavaWeb服务器;
-
JBoss(Redhat红帽):支持JavaEE,应用比较广EJB容器 –> SSH轻量级的框架代替
-
GlassFish(Orcale):Oracle开发JavaWeb服务器,应用不是很广;
-
Resin(Caucho):支持JavaEE,应用越来越广;
-
Weblogic(Orcale):要钱的!支持JavaEE,适合大型项目;
-
Websphere(IBM):要钱的!支持JavaEE,适合大型项目
Tomcat服务器
安装教程:
目录介绍
- backup:存放配置文件,是在第一次运行了Tomcat服务器之后产生的,和conf目录下的内容基本一致;
- bin:存放Tomcat服务器的可执行程序,核心包;
- conf:存放Tomcat服务器的配置文件;
- lib:存放Tomcat服务器的jar包;
- logs:存放Tomcat服务器运行时输出的日记信息;
- temp:存放Tomcat服务器运行时产生的临时数据;
- webapps:存放部署的Web工程,里面的一个文件夹就是一个Web工程;
- work:是Tomcat工作时的目录,用来存放Tomcat运行时jsp翻译为Servlet的源码,和Session钝化的目录;
启动Tomcat服务器
- 找到Tomcat安装目录下的bin目录下的startup.bat文件,双击即可启动Tomcat服务器;
- cmd命令行下,进入bin目录下,输入catalina run回车,即可启动;
启动Tomcat一闪而过问题解决:检查JDK的环境配置
测试Tomcat服务器是否开启成功
- 在浏览器中输入以下地址进行测试:
关闭Tomcat服务器
- 右上角X号;
- 快捷键Ctrl+C;
- Tomcat的bin目录下的shutdown.bat,双击;
修改Tomcat的端口号
- 找到Tomcat目录下的conf目录下的server.xml配置文件;
- 找到Connector标签,port就是端口号设置,修改它;
- Tomcat默认的端口号是8080;
- HTTP协议默认的端口号是:80;
将web工程部署到Tomcat服务器上
-
将Web工程拷贝到Tomcat安装路径的webapps目录中
- 访问Tomcat中的web工程:浏览器中输入http://ip:port/工程名/目录名/文件名
-
找到Tomcat安装目录中的conf目录下的Catalina目录下的localhost下,创建配置文件XXX.xml
-
-
访问Tomcat中的web工程:浏览器中输入http://ip:port/abc/ 就代表进入到了E:\book目录下,先要继续访问book文件中的信息,就继续/输入
-
手托html页面到浏览器与在浏览器输入框http://ip:port:工程名/访问的区别
地址栏的默认访问
- 浏览器地址栏如果输入http://ip:port/ 没有工程名,默认访问的就是Tomcat中的webapps目录下的ROOT工程
- 浏览器地址栏中输入http://ip:port/工程名/ 没有资源名,默认访问的就是该工程下的index.html文件
部署在IDEA或者eclipse上
https://blog.csdn.net/weixin_44775516/article/details/109522779
Web工程的目录介绍
- src:存放java代码;
- web:存放web工程的资源文件,html、css...
- WEB-INF:是一个受服务器保护的目录,浏览器无法直接访问到此目录中
- lib:存放第三方jar包,jar包需要配置
- web.xml:是整个动态web工程的配置部署文件,可以配置Servlet程序、Filter过滤器、Listener监听器、Session超时...组件
Web 中的相对路径和绝对路径
-
相对路径是:
- . 表示当前目录
- .. 表示上一级目录
- 资源名 表示当前目录/资源名
-
绝对路径:
- http://ip:port/工程路径/资源路径
web 中/ 斜杠的不同意义
- 在web中,/斜杠是一种绝对路径
- /斜杠在浏览器中被解析,地址是:http://ip:port/
- <a href="/">斜杠</a>
- / 斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径
- <url-pattern>/servlet1</url-pattern>
- servletContext.getRealPath(“/”);
- request.getRequestDispatcher(“/”);
- 特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到http://ip:port/
Servlet
什么是Servlet?
- Servlet(Server Applet),全称Java Servlet;
- Servlet是JavaEE规范之一,就是接口,是用java编写的服务端程序;
- Servlet是JavaWeb三大组件之一,都有:Servlet程序、Filter过滤器、Listener监听器;
- Servlet是运行在服务器上的一个Java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端;
第一个Servlet程序
- 编写一个类要实现Servlet接口
- 实现接口中的service()方法,用于处理请求与响应数据
- 在web.xml中配置Servlet程序的访问地址
这种方式一般不使用,我们继承他的实现类HttpServlet
JAVA代码:
web.xml配置文件:
URL地址到Servlet程序的访问
Servlet的生命周期
- 第一步:执行Servlet构造器方法;
- 第二步:执行init()初始化方法;
- 第三步:执行service()方法;
- 第四步:执行destroy()销毁方法;
第一部与第二步,只在第一次访问,创建Servlet程序的时候会执行;
第三步,每次访问Servlet程序的时候都会执行;
第四步,只当web工程停止的时候,会执行;
GET、POET请求的分发处理
- getMethod():可以获取请求过来的方式,是GET请求还是POST请求
主要类与方法
HttpServlet类
- 一般实现Servlet程序,都是使用继承HttpServlet类的方式来开发;
- 它在Servlet接口的基础上,分开了请求方式,还有一系列方法;
- 编写一个类继承HttpServlet类
- 重写它的doGet()、doPost()方法;
- 到web.xml文件中配置Servlet程序的访问地址
HttpServlet类的方法:
- doPost():处理post请求;
- doGet():处理get请求;
java代码
web.xml文件配置
html文件
- 当表单请求是post方法,只会调用Servlet2类中的doPost()方法!
IDEA中能够一键生成Servlet程序:右击包->点击NEW->Create New Servlet(在下面找)->Name框(自定义类名)
根据IDEA版本不同,会注解声明访问地址或者web.xml文件中声明
@WebServlet(name="Servlet3",urlPatterns = "/servlet3")这就是注解声明访问地址,idea自动生成的有问题,要自行修改
Servlet类的继承体系
ServletConfig类
- ServletConfig类是Servlet程序的配置信息类;
- Servlet程序和ServletConfig对象都是由Tomcat负责创建的,Servlet程序是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象;
ServletConfig类的作用
- 可以获取Servlet程序的别名,就是servlet-name标签中的值;
- 获取初始化参数init-param标签中的值;
- init-param标签只能在servlet标签中定义,它只属于它所在的Servlet程序;
- 只能被ServletConfig对象获取;
- 获取ServletContext对象;
ServletConfig类中的方法:
- getServletName():获取web.xml配置文件中servlet-name标签的值;
- getInitParameter(参数):获取init-param标签中的值;
- 参数:param-name标签
- 获取到param-value标签的值,这两个标签好比键值对
- getServletContext():返回ServletContext对象;
web.xml文件配置
Java代码
上方的是实现了Servlet接口,init()方法自然会重写Servlet接口中的方法;
下方:如果继承了HttpServlet类,它的父抽象类GenericServlet中有两个init()方法,一个是从接口Servlet中实现的有参方法,还有一个无参init()方法是独有的,如果自定义的类要重写HttpServlet类中的init()有参方法,一定要调用super.init(config);不然会在使用ServletConfig对象的时候会报500错误(内部服务器错误),空指针异常;
ServletContext类
- ServletContext是一个接口,表示Servlet上下文对象;
- 一个web工程只有一个ServletContext对象;
- ServletContext对象是一个域对象;
- 域对象,是可以像Map一样存取数据的对象;
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
- ServletContext在web工程启动的时候创建,在web工程停止的时候销毁;
ServletContext类的作用
- 获取web.xml中配置的上下文参数context-param标签;
- context-param标签是不能在servlet标签中的,只能在最外面,属于整个web工程,不单单只属于哪一个Servlet程序;
- 只能被ServletContext对象获取;
- 获取当前工程路径
- 获取工程部署后在服务器硬盘上的绝对路径;
- 像Map一样存取数据;
ServletContext类中的方法
- getInitParameter(参数):获取context-param标签中的数据;
- getContextPath():获取当前工程的路径;
- getRealPath(参数):获取工程部署后在服务器硬盘上的绝对路径;
- 参数/: 斜杠在服务器上会被解析为http://ip:port/工程名/ 就是映射到IDEA代码的web目录
- sc.getRealPath("/img"):表示获取该工程下的img目录在工程部署后在服务器硬盘上的绝对路径;
- setAttribute(别名,对象):将一个对象存储到ServletContext对象中,起个别名;
- getAttribute(别名):通过别名获取存入其中的对象;
- removeAttribute(别名):删除该别名中的对象;
web.xml文件配置
Java代码
这个上面的工程路径是IDEA整合Tomcat之后,Tomcat被拷贝的一些副本内容,就是将IDEA实际存在的项目,映射进Tomcat服务器中;
setAttribute存储的对象,要先存进去,然后整个web工程中所有Servlet程序才能够访问到,没有存储到ServletContext对象中,是获取不到的;
HttpServletRequest类
- 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet、doPost方法)中供我们使用;
- 通过HTTPServletRequest对象,可以获取所有请求的信息;
HTTPServletRequest类的方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的ip 地址
- getHeader(参数) 获取请求头
- 参数:要获取的请求头名称
- getMethod() 获取请求的方式GET 或POST
- getParameter(参数) 获取请求的参数
- 参数:要请求哪一个参数的值
- getParameterValues(参数) 获取请求的多个参数
- 参数:要请求哪一个参数的值
- setAttribute(别名,对象) 将对象作为request对象的一个属性存放到request对象中;
- 别名:String类型,就相当于request对象中的一个属性,自己起名;
- 对象:Object类型
- getAttribute(别名) 获取request对象中该别名的值(这个值可以是任何类型)
- getRequestDispatcher(参数) 获取请求转发对象
- 参数:就是要转发给谁
- getRequestDispatcher(参数).forward(request,response) 转发
java代码
表单代码
doGet()请求一般不会乱码,如果有,按照下面的方法解决:
String username = request.getParameter("username");
//先以iso-8859-1进行编码,再以utf-8进行解码
username = new String(username.getBytes("iso-8859-1"),"UTF-8");
//获取请求参数,就是获取表单提交过来的参数值
System.out.println("用户名:"+username);
HttpServletResponse类
- HttpServletResponse类和HttpServletRequest类一样,每一次请求进来,Tomcat服务器都会创建一个Response对象和Request对象;
- HttpServletResponse表示所有的响应信息,HttpServletRequest表示请求过来的信息;
- 要返回给客户端信息,都是通过Response对象进行设置;
两个输出流
- getOutputStream() 字节流,常用于下载,传递二进制;
- getWriter() 字符流,常用于回传字符串
- 两个流不能同时使用;
HttpServletResponse类的方法
- setContentType() 同时设置服务器和客户端的编码格式
- setCharacterEncoding() 设置服务器的编码格式
- setStatus(参数) 设置响应状态吗,表示重定向
- setHeader() 通过响应头设置浏览器的编码格式
- getWriter() 获取字符输出流对象PrintWriter
- writer(参数) 写数据,参数可以是Object、int、String、数组、double...
- getOutputStream() 获取字节输出流对象ServletOutputStream
- print(参数) 写数据,,参数可以是int、String、数组、double...不能写对象
- sendRedirect(参数) 重定向
- 参数:要重定向的路径
java代码
java.lang.IllegalStateException: 当前响应已经调用了方法getOutputStream()
两个流一起使用报错
请求转发与重定向
请求转发
- 服务器收到请求后,从一次资源跳转到另一个资源的操作,叫做请求转发;
表单
Servlet6
Servlet7
表单中的提交是post请求方式,所以在两个Servlet程序中,想要获取表单提交的数据,必须也是doPost方法进行获取;
a标签的转发
web工程下d.html
HTML下e.html
Servlet7
这种情况没有base标签给e.html进行参照路径的话,他就会报错,找不到文件;
下面解释:
- 当首先访问web工程下的d.html文件时,它的绝对路径是http://localhost:8080/JavaWeb_4/d.html;
- 当点击请求转发连接时,他就会跳到Servlet7程序所配置的路径上:http://localhost:8080/JavaWeb_4/servlet7;
- 然后当点击回到首页连接时,它相当于将a标签中的../d.html路径与他现在所在的路径进行拼接跳转,就会跳转到http://localhost:8080/JavaWeb_4/d.html(http://localhost:8080/JavaWeb_4/servlet7../d.html,../相当于与前面的目录相抵消)路径,当然找不到文件;
- 当base标签给e.html文件给定一个绝对路径http://localhost:8080/JavaWeb_4/HTML/e.html,就是该文件的绝对路径,不管怎么与a标签上的../d.html进行拼接,他就可以找到正确的路径
重定向
- 请求重定向,是指客户端给服务器发送请求后,返回服务器给客户端一个新地址,让客户端重新去访问新地址;
java代码
转发与重定向的区别
- 路径区别
- 地址栏的变化
- 转发:地址栏不会显示出转发后的地址;
- 重定向:则是完全跳转到新地址,地址栏也就是新地址;
- Request对象中的数据
- 转发:不会丢失数据;
- 重定向:会丢失数据;
- 请求次数
- 转发:客户端只向服务器发送一次请求;
- 重定向:客户端发送了两次请求给服务器;
- 跳转位置
- 转发:在服务器中跳转;
- 重定向:返回给客户端新地址,客户端跳转;
- 访问域
- 转发:只能在web工程中访问跳转;
- 重定向:可以跨域访问跳转;就是随便跳;
- 能否访问web工程的WEB-INF目录
- 转发:可以访问;
- 重定向:不可以访问;
监听器
什么是监听器?
- Listener监听器是JavaWeb的三大组件之一;
- 作用:监听某种事物的变化,然后通过回调函数,反馈给客户;
ServletContextListener监听器
- ServletContextListener 它可以监听ServletContext 对象的创建和销毁
- ServletContext 对象在web 工程启动的时候创建,在web 工程停止的时候销毁。
- 监听到创建和销毁之后都会分别调用ServletContextListener 监听器的方法反馈
如何实现ServletContextListener监听器监听ServletContext对象
ServletContextListener监听器的主要作用
- 初始化工作:初始化对象,初始化数据,比如加载数据库驱动,对连接池的初始化。
- 加载一些初始化的配置文件;
Cookie
什么是Cookie?
- Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息;
为什么需要Cookie?
- 因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分是否来源于同一个浏览器;
- 所以,需要额外的数据用于维护会话;Cookie正是这样一段随HTTP请求一起被传递的额外数据;
Cookie的注意点
能不能一次发送多个Cookie?
- 可以,可以创建多个Cookie对象,使用response调用多次addCookie方法发送即可;
Cookie能不能存中文?
- 在Tomcat8之前不能存中文,要进行URL编码(%E3)或者BASE64编码将中文数据转码
- 在Tomcat8之后支持中文数据,但是特殊字符还是不支持;
Cookie大小限制
- 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
Cookie的创建、获取、修改
html页面
java代码
查找Cookie
Cookie的生命周期
- setMaxAge(int seconds):这个方法就是设置Cookie的保存时间的方法;
- 正数:要保存的时间秒数,将Cookie数据写到硬盘中;
- 负数:默认值,当浏览器关闭,Cookie数据被销毁;
- 零:删除Cookie信息;
Cookie的共享设置
- 默认的Cookie只能在一个应用中共享,即一个Cookie只能由创建它的应用获得。
- setPath():设置cookie的共享范围;
- cookie.setPath("/"):可在同一应用服务器内共享方法
- cookie.setPath(request.getContextPath()+"/HTML");只在该工程的HTML下共享,别的目录下获取不到
免输入用户名登录
java代码
jsp页面
- jap页面中的用户名输入框中的value值就在cookie域中拿就行,第一次没有默认就为空,第二次访问时,Cookie域中就会保存有用户名,当访问时就有了用户名
Session
什么是Session?
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术;
- Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
- 客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了
创建Session对象、Session域中的存取
HTML页面
java代码
Session生命周期
- public void setMaxInactiveInterval(int interval) 设置Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
- 值为正数的时候,设定Session 的超时时长。
- 负数表示永不超时(极少使用)
- public int getMaxInactiveInterval()获取Session 的超时时间
- public void invalidate() 让当前Session会话马上超时无效
Session的默认Session超时时长
- IDEA中Using CATALINA_BASE整合后的路径下,web.xml配置文件中默认配置了Session的超时时长为30分钟
- 如果想修改整个Web工程的所有Session超时时长,可以在Web工程下的web.xml配置文件中添加配置,就是上面的
- 如果只想修改个别Session的超时时长,使用setMaxInactiveInterval()方法单独设置
Session的实现原理
- Session 技术,底层其实是基于Cookie 技术来实现的。
session和cookie的联系和区别
- session和cookie都可以保存跟特定会话关联的信息
- session的信息是存放在服务器端的,cookie的信息是存放在浏览器端
- session中可以存放Object,cookie只能存放字符串信息
过滤器
是什么过滤器?
- Filter过滤器是JavaWeb的三大组件之一;
- 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理;
- 它的作用:拦截请求,过滤响应;
- 拦截请求的常见应用场景:权限检查、日记操作、事务管理...
创建一个Filter过滤器
- 权限设定,没有登录的不能直接访问web工程下的HTML目录下的所有资源
首先一个登陆页面
- 提交到LoginServlet程序
LoginServlet程序
登陆成功之后将用户名放入到Session域中
创建Filter过滤器
当Session域中没有用户名的时候(用户没有登录),放强行访问HTML下的资源时,就会被过滤器重定向到登录页面,只有当Session域中存在用户名时,才会被过滤器放行允许其访问HTML下的资源
Filter过滤器的web配置
Filter的生命周期
构造方法与init()初始化方法在web工程启动的时候执行
doFilter()过滤方法在每次拦截到请求时执行
destroy()销毁方法在停止web工程的时候执行
FilterConfig类
- 它是Filter过滤器的配置文件类
- 当web工程创建Filter过滤器时,同时会创建一个FilterConfig类
- 它的作用:获取Filter过滤器的配置内容
- 获取Filter的名称,也就是filter-name标签中的内容
- 获取Filter中配置的init-param初始化的内容
- 获取ServletContext对象
FilterChain过滤链
- 如果有多个过滤器,它就形成了一个FilterChain过滤器链
- 那个Filter先执行与Filter的配置相关,在web.xml配置文件中,那个配置在最前方,那个就先执行
- 第一个执行到doFilter时,会进行判断,如果有下一个Filter,就去执行下个Filter;没有的话,就直接执行资源文件,然后返回Filter执行doFilter后面的代码
- 所有的Filter和目标资源默认在同一个线程中;多个Filter执行的时候,他们使用同一个Request对象
Filter的拦截路径分类
精确匹配
- 只会拦截HTML下的a.html的请求
目录匹配
- 只会拦截HTML下的所有请求
后缀名匹配
- 只会拦截以.html结尾的请求
Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在
__EOF__

本文链接:https://www.cnblogs.com/MLYR/p/17161332.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)