百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Java从坚持到精通-Javaweb(持续更新ing)

lipiwang 2024-11-24 18:33 15 浏览 0 评论

1.关于系统架构


系统架构包括C/S架构和B/S架构


2.C/S架构是什么?


C/S全称是Client/Server,也就是客户端/服务器。


C/S架构的软件有QQ、英雄联盟等。


特点:需要安装特定的客户端软件。


优点:
速度快、体验好、界面酷炫、服务器压力小、安全等


缺点:
升级维护比较麻烦


3.B/S架构是什么?


B/S全称是Browser/Server,也就是浏览器/服务器。


实际上B/S结构的系统还是一个C/S,只不过这个C比较特殊,这个Client是一个固定不变的浏览器软件。


优点:
升级维护方便、不需安装软件即可操作


缺点:
速度慢、体验差、不安全


4.Web服务器与应用服务器


Web服务器有:Tomcat、jetty


应用服务器:JBOSS、WebLogic、WebSphere


web服务器与应用服务器之间的区别?


应用服务器实现了JavaEE的所有规范(JavaEE有13个不同的规范)


Web服务器只实现了JavaEE钟大哥Servlet + JSP两个核心规范


5.tomcat中startup.bat的执行流程


执行startup.bat,实际上是指向执行了catalina.bat文件,catalina.bat里面又使用了JAVA_HOME,再找到MAlNCLASS=org.apache.catalina.startup.Bootstrap,也就是main方法,启动服务器。


6.前端访问路径的简写形式


正常的地址访问形式如href="http://127.0.0.1:8080/oa/login.html",可以简化掉协议、IP地址以及端口号,直接href="/oa/login.html"即可,注意开头有个斜杠。


7.Servlet对象的生命周期


默认情况下,服务器在启动的时候,Servlet对象并不会被实例化(因为构造方法未执行)。


如果想要让Servlet对象在服务器启动时就创建,需要在web.xml中的<servlet>标签中添加<load-on-startup>子标签,中间填写整数即可,数字越小,优先级越高,如写0。


用户在发送第一次请求的时候, 先执行构造方法,然后执行init方法,且都只执行一次。然后执行service方法,每次请求执行一次service方法。


所以,Servlet对象是单例的(单实例的,但是,Servlet对象是单实例的,Servlet类并不符合单例模式,我们称之为假单例。之所以单例是因为Servlet对象的创建我们程序员管不着,这个对象的创建只能是Tomcat来说了算,Tomcat只创建了一个,所以导致了单例,但是属于假单例。真单例模式,构造方法是私有化的。)


服务器关闭前,destroy会被调用。


8.ServletConfig接口详解


一个Servlet对象对应一个ServletConfig对象。(一对一关系)


ServletConfig里面包装了web.xml中<servlet>标签中的内容。


可以获取初始化参数的key和value,通过getInitParameter(String)和getInitParameterNames()方法


9.ServletContext接口详解


对于一个webapp来说,ServletContext对象只有一个。


常用方法:


public string getInitParameter(string name); //通过初始化参数的name获取value
public Enumeration<string> getInitParameterNames(); // 获取所有的初始化参数


// 以上两个方法是ServletContext对象的方法,获取的是如下配置在web.xml中的信息:


<context-param>
    <param-name>pageSize</param-name>
    <param-value>10</param-value>
</context-param>
<context-param>
    <param-name>startIndex</param-name>
    <param-value>0</param-value>
</context-param>



常用方法:


getContextPath():获取应用上下文的根路径
getRealPath(String):获取文件的绝对路径,从web根目录下开始获取,可以写“/”或者不写。


ServletContext对象还有另一个名字:应用域(后面还有其他域,例如:请求域、会话域)


如果所有的用户共享一份数据,并且这个数据很少被修改且数据量很少,可以将这些数据放到ServletContext这个应用域中


10.HttpServlet的继承结构


HttpServlet继承GenericServlet,GenericServlet实现Servlet


11.Get请求和Post请求的区别?


get请求只能携带普通的字符串,且发送的长度有限制。


post请求可以发送任何类型的数据,包括字符串、视频、声音、图片等,理论上没有限制。


get请求支持缓存,get请求的响应结果会被缓存起来。实际上每次get请求,浏览器都先会在缓存中找,找不到才发送请求


post请求不支持缓存,缓存没有意义


如果不希望get走缓存,可以在地址栏后面加上系统毫秒数之类的必定会变化的参数


12.HttpServlet源码解析


其中的service()方法使用了模板方法的设计模式,具体的实现延迟到子类去完成。


其中的doGet()方法和doPost()方法都是抛出了405异常(访问方法不正确状态码),所以如果不希望在请求的时候抛出405异常,字类就一定要重写doGet()方法和doPost()。


13.如何设置欢迎页面(不加资源名的默认页面)


在web.xml文件中添加如下标签


<welcome-file-list>
    <welcome-file>login.html</welcome-file>
</welcome-file-list>



14.关于WEB-INF目录


注意,放在WEB-INF目录下的资源是受保护的,在浏览器上不能直接访问,所以像html、css、js、image等静态资源一定要放到WEB-INF目录外。


15.HttpServletRequest接口详解


HttpServletRequest是一个接口,最终的实现类是RequestFacade。


16.request对象


request对象又称为“请求域”对象,在一个请求内有效。


17.请求域中怎么共享数据


可以使用转发机制来实现。(一次请求中)


具体实现代码如下:


request.getRequestDispatcher("/b").forward(request, response);



注意,请求转发也可以转发到静态资源页。


18.获取前端的请求体乱码问题


tomcat10版本已经设置了utf-8,但是tomcat9以及9之前的版本,未设置字符集,可以使用request.setCharacterEncoding("UTF-8");设置字符集


19.如何获取应用根路径?


可以使用request.getContextPath()。


20.资源绑定器的用法


如果我们在src下有properties资源文件,可以使用资源绑定器。具体使用如下:


private static ResourceBundle bundle = ResourceBundle.getBundle("resources.jdbc");
private static String driver = bundle.getrString("driver");



21.请求转发和重定向的区别


请求转发,不管转发了多少次,都是一次请求,浏览器地址栏的地址不变。


重定向是多次请求,浏览器的地址栏会改变。(浏览器是自发地向服务器发送新的请求,路径上需要添加项目名),如:


response.sendRedirect(request.getContextPath() + "/b");



22.Servlet的注解式开发


可以在servlet类上添加@WebServlet来替代原来的web.xml中的servlet方法。


23.JSP本质


访问jsp文件会生成相应的.java文件,该文件中的类继承HttpJspBase,再继承HttpServlet。


24.JSP响应乱码的问题


使用<%@page contentType="text/html;charset=UTF-8"%>解决响应乱码问题。


25.JSP基本语法


<%%>中间书写java代码,存在于service()方法中。


<%! %>这里面的代码会被翻译到service()方法外。


<%=%>如果输出内容包含java代码,可以直接写在等号后面,最终是被翻译成out.print();,且里面不能加分号,因为翻译后已经包含了分号。


26.session机制


session指的是会话,会话指的是用户打开浏览器,进行操作后,关闭浏览器,是一次会话。会话对应服务器端的session对象。一个会话中包含多次请求。
request.getSession()可以获取到服务器的session对象。


为什么需要session对象来保持会话状态呢?


因为HTTP协议是一种无状态协议,也就是在请求时才建立B/S的连接,请求结束后就断开连接。


为什么HTTP要设置成无状态协议,可以减少服务器与客户端的压力。


服务器不知道浏览器的关闭状态。


打开浏览器,发送请求或者打开浏览器标签,都是共享同一个会话,只有右上角的浏览器关闭才是结束会话。


request.getSession(false);如果传参false,获取不到session时,不会新建session,会返回null。


27.session的实现原理


在web服务器中有一个session列表,类似于map集合,这个map集合的key存储的是sessionid,value存储的是对应的session对象


用户发送第一次请求的时候:服务器会创建一个新的session对象,同时给该对象生成一个id,也就是sessionid,然后发送给浏览器,浏览器保存该sessionid到缓存中。


用户发送第二次请求的时候,会自动将浏览器缓存中的sessionid自动发送给服务器,服务器获取到sessionid,然后从session列表中找到对应的session对象。


JSESSIONID=xxx,这个是以cookie的形式保存在浏览器内存中的


28.为什么关闭浏览器,session会话会结束?


因为关闭浏览器之后,浏览器中保存的sessionid消失了,下次重新打开浏览器之后,浏览器缓存没有对应的sessionid,就找不到服务器中的session对象。


29.session对象的销毁


session对象有两种销毁方式,一是超时自动销毁,二是用户手动销毁(安全退出的方式)。


session.invalidate();


30.Cookie禁用了,session还能找到吗?


cookie禁用:服务器正常发送JSESSIONID给浏览器,但是浏览器不要了,相当于缓存中没有sessionid。所以会找不到服务器的session。但是session机制还能实现吗?可以的。需要使用URL重写机制。在地址栏后面加上分号再加jsessionid=xxx。


31.Cookie理论基础


JSESSIONID=xxx,这样的键值对存在于cookie中,这个cookie制备保存在浏览器的“运行内存”中的,只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。


cookie的创建:Cookie cookie = new Cookie(String, String);


使用时,需要使用response.add(cookie);


32.cookie的有效时间


设置有效时间:cookie.setMaxAge(int);参数是秒


如果没有设置有效时间,默认保存在浏览器的运行内存中,浏览器关闭则cookie消失。


设置cookie的MaxAge>0时,计时生效
设置cookie的MaxAge=0时,删除同名cookie
设置cookie的MaxAge<0时,不会被存储到硬盘文件中,放在浏览器运行内存中,与不写是一样的,浏览器关闭则cookie失效


33.什么情况下,cookie会被携带发送?


默认情况下:在设置cookie的时候,请求的路径的父路径以及这个父路径的子路径再次请求时,会携带这个cookie。


手动设置cookie的path:cookie.setPath("/servlet");表示只要是这个servlet项目的请求路径,都会提交cookie给服务器。


34.jsp中page指令的一些属性


<%page errorPage="/error.jsp"%>:当前页面出现异常后,跳转到error.jsp页面


<%page isErrorPage="true"%>:表示启用JSP九大内置对象之一:exception,默认值是false


35.EL表达式


格式:${表达式}


作用:
1.从某个域中取数据
2.将取出的数据转换成字符串
3.将字符串输出到浏览器


36.Filter过滤器


Filter是过滤器,可以在Servlet目标程序执行之前添加代码,也可以在目标程序执行之后添加代码,之前之后都可以添加过滤规则。


一般情况下,过滤器中编写的都是公共代码。


filter对象中的方法说明:
init():在filter对象第一次被创建后调用,并且只调用一次
doFilter():只要用户发送一次请求,则执行一次。发送N次请求执行N次。这里执行过滤规则。
destroy():在filter对象被释放/销毁之前调用,并且只执行一次。

?

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: