以下内容是在学习某机构视频过程中记录的笔记,不准确的地方请大家评论指正。

JavaWeb是使用Java语言开发基于互联网的项目。
资源分类有两类:
静态资源:
使用静态网页开发技术发布的资源。
特点:所有用户访问,得到的结果是一样的。如:HTML,CSS,JavaScript(三个并称静态网页开发技术)。如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器,浏览器中内置了静态资源的解析引擎,可以展示静态资源。
动态资源:
使用动态网页技术发布的资源。
特点:所有用户访问,得到的结果可能不一样。 如:jsp/servlet,php,asp等。如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器。

web.xml配置文件的作用:配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。从Servlet 3开始提供了基于注解的部署方式,可以分别使用@WebServlet、@WebFilter、@WebListener替代web.xml中的<servlet>、<filter>、<listener>

Tomcat就是一个运行JAVA代码的网络服务器,底层是Socket的一个程序。同时Tomcat也是JSP和Serlvet的一个容器。

Tomcat是一个web服务器软件,可以接收用户的请求,处理请求,做出响应。 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。我们通过html和css写的页面只能自己访问,别人并不能远程访问,Tomcat就是提供能够让别人访问自己写的页面的一个程序。通过它我们可以很方便地接收和返回请求(如果不用Tomcat,那我们需要自己写Socket来接收和返回请求)。

Tomcat三个功能:web服务器、jsp容器、servlet容器。

conf文件夹中:
server.xml文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)
web.xml文件配置web应用(web应用相当于一个web站点)
tomcat-user.xml配置用户名密码和相关权限

webapps目录结构

可以在web.xml文件中配置如下代码来设置项目首页

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

Tomcat配置虚拟目录:
如果把所有web站点的目录都放在webapps下,可能导致磁盘空间不够用,也不利于对web站点目录的管理(如果存在非常多的web站点目录)。把web站点的目录分散到其他磁盘管理就需要配置虚拟目录(默认情况下,只有webapps下的目录才能被Tomcat自动管理成一个web站点)。把web应用所在目录交给web服务器管理,这个过程称之为虚拟目录的映射
配置虚拟目录方法1步骤:
1、在其他盘符下创建一个web站点目录,并创建WEB-INF目录和一个html文件。
2、找到Tomcat目录下/conf/server.xml文件,在server.xml中的节点下添加如下配置。path表示的是访问时输入的web项目名(也就是虚拟目录),docBase表示的是站点目录的绝对路径

    <Context path="/web1" docBase="D:\web1"/>

配置虚拟目录方法2步骤:
1、进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字(也就是虚拟目录)。
2、xml文件的代码如下,docBase是web站点的绝对路径

<?xml version="1.0" encoding="UTF-8"?><ContextdocBase="D:\web1"reloadable="true"></Context>

配置虚拟主机:
为了让多个不同域名的网站共存于一个Tomcat中,我们可以配置虚拟主机。比如我们开发了4个网站,有4个域名。如果不配置虚拟主机,一个Tomcat服务器运行一个网站的话,我们就需要4台电脑才能把4个网站运行起来。
在tomcat的server.xml文件中添加配置虚拟主机名

<Host name="xunizhujiname" appBase="D:\web1"><Context path="/web1" docBase="D:\web1"/></Host>

Tomcat体系结构:

浏览器访问WEB资源的流程图

Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。单纯的java程序很难实现聊天、发帖等交互功能,sun公司就提供了Serlvet这种技术供我们使用。

Servlet最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。

Struts2和SpringMVC底层都离不开servlet,Struts2的核心用的是Filter(过滤器),而SpringMVC的核心用的就是Servlet。

浏览器不管请求多少次Servlet,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。为了避免线程安全问题:如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){};如果一个变量不需要共享,则直接在 doGet() 或者 doPost()中定义。

Servlet 生命周期就是Servlet从创建直到毁灭的整个过程。Servlet 初始化后调用 init () 方法(只调用一次,Servlet是单例的)。Servlet 调用 service() 方法来处理客户端的请求。Servlet 销毁前调用 destroy() 方法。最后,Servlet 由 JVM 的垃圾回收器进行垃圾回收。具体生命周期分为下面5个步骤:
1、加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例(Tomcat是一个Servlet容器,可以理解成Servlet跑再Tomcat里)。
2、初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象。
3、处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求。
4、销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
5、卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。

ServletConfig和ServletContext对象:
继承HttpServlet的类可通过this.getServletConfig()方法获得ServletConfig对象。可通过this.getServletContext()方法获得ServletContext对象
ServletConfig:通过此对象可以读取web.xml中配置的初始化参数。
ServletContext:这个对象是在Tomcat启动的时候就会创建,代表着当前整个应用。ServletContext既然代表着当前web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。ServletConfig获取的是单个Servlet的参数信息,ServletContext可以获取整个web站点的参数信息。
利用ServletContext还读取web站点的资源文件。利用ServletContext还可以实现Servlet的转发(用ServletContext转发不多,主要用request转发)

Servlet执行原理:

  1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
  3. 如果有,则在找到对应的<servlet-class>全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

Servlet执行时序图:

使用servlet开发步骤
1:创建web(Java EE)项目
2:创建类实现servlet接口
3:实现抽象类中的抽象方法
4:配置servlet(可通过web.xml文件配置,也可以在Servlet的实现类上通过@WebServlet(“访问地址”)注解配置)

web.xml配置:

<servlet><servlet-name>CheckBox</servlet-name><servlet-class>com.runoob.test.CheckBox</servlet-class>
</servlet>
<servlet-mapping><servlet-name>CheckBox</servlet-name><url-pattern>/TomcatTest/CheckBox</url-pattern>
</servlet-mapping>

如果在web.xml文件中配置了<load-on-startup>标签,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象并调用Servlet实例对象的init()方法。

servlet3.0开始支持注解配置,有了注解就不需要配置web.xml了。

Servlet的继承体系
Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。
  • HttpServlet:对http协议的一种封装,简化了操作,可以定义类继承HttpServlet, 复写doGet/doPost方法即可

HTTP:Hyper Text Transfer Protocol(超文本传输协议)。定义了客户端和服务器端通信时发送数据的格式。默认端口是80。所有的www文件都必须遵守这个HTTP协议,它是TCP/IP协议的一个应用层协议。

在浏览器点击一个链接,浏览器就为我打开这个链接的网页,原理:当在浏览器中点击这个链接的时候,浏览器会向服务器发送一段文本,告诉服务器请求打开的是哪一个网页。服务器收到请求后,就返回一段文本给浏览器,浏览器会将该文本解析,然后显示出来。这段"文本"就是遵循HTTP协议规范的。

HTTP1.0和HTTP1.1的区别
HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源(短连接,获取资源后就断开连接)
HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源(长连接)

http请求和响应格式:行 头 空行 体
请求行:(请求方式有8种:GET POST PUT DELETE OPTION HEAD CONNECT TRACE)
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1

常见的请求头:
1、User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息,可以在服务器端获取该头的信息,解决浏览器的兼容性问题。
2、Referer:http://localhost/login.html,告诉服务器,我(当前请求)从哪里来?可以防盗链和用于统计。
3、Accept: text/html,image/* ,浏览器告诉服务器,它支持的数据类型。
4、Accept-Charset: ISO-8859-1,浏览器告诉服务器,它支持哪种字符集。
5、Accept-Encoding: gzip,compress,浏览器告诉服务器,它支持的压缩格式。
6、Accept-Language: en-us,zh-cn,浏览器告诉服务器,它的语言环境。
7、Host: www.it315.org:80,浏览器告诉服务器,它的想访问哪台主机。
8、If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT,浏览器告诉服务器,缓存数据的时间。
9、Cookie:浏览器告诉服务器,带来的Cookie是什么。
10、Connection: close/Keep-Alive,浏览器告诉服务器,请求完后是断开链接还是保持链接。
11、Date: Tue, 11 Jul 2000 18:23:51 GMT,浏览器告诉服务器,请求的时间。

响应行:协议/版本 响应状态码 状态码描述
HTTP/1.1 200 OK
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1xx:服务器收到客户端消息,但没有接受完成,需要客户端继续提交下一个请求才能完成整个处理过程。
2xx:成功。代表:200
3xx:重定向。代表:302(重定向),304(访问缓存)
4xx:客户端错误。404(请求路径没有对应的资源),405:请求方式没有对应的doXxx方法
5xx:服务器端错误。代表:500(服务器内部出现异常)

常见的响应头:
1、Content-Type:text/html; charset=GB2312,服务器告诉客户端本次响应体数据格式以及编码格式。
2、Content-disposition:以什么格式打开响应体数据(in-line:默认值,在当前页面内打开;attachment;filename=xxx:以附件形式打开响应体,用于文件下载)。
3、Location: http//www.it315.org/index.jsp,服务器告诉浏览器要跳转到哪个页面(用于重定向)。
4、Server:apache tomcat,服务器告诉浏览器,服务器的型号是什么。
5、Content-Encoding: gzip,服务器告诉浏览器数据压缩的格式。
6、Content-Length: 80,服务器告诉浏览器回送数据的长度。
7、Content-Language: zh-cn,服务器告诉浏览器,服务器的语言环境。
8、Content-Type: text/html; charset=GB2312,服务器告诉浏览器,回送数据的类型。
9、Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT,服务器告诉浏览器该资源上次更新时间。
10、Refresh: 1;url=http://www.it315.org,服务器告诉浏览器要定时刷新。
11、Transfer-Encoding: chunked,服务器告诉浏览器数据以分块方式回送。
12、Set-Cookie:服务器告诉浏览器要保存Cookie
13、Expires: -1,服务器告诉浏览器不要设置缓存。
14、Cache-Control: no-cache,服务器告诉浏览器不要设置缓存。
15、Pragma: no-cache,服务器告诉浏览器不要设置缓存。
16、Connection: close/Keep-Alive,服务器告诉浏览器连接方式。
17、Date: Tue, 11 Jul 2000 18:23:51 GMT,服务器告诉浏览器回送数据的时间。

Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象和一个代表响应的response对象。
request对象和response对象是由web服务器(Tomcat)创建的。request对象用来获取请求消息,response对象用来设置响应消息。服务器和外界的交互都是通过request和response对象来进行的。

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

HttpServletRequest对象功能
1、获取请求消息数据
(1)获取请求行数据GET /day14/demo1?name=zhangsan HTTP/1.1
       1. 获取请求方式 :GET String getMethod()
       2.获取虚拟目录:/day14 String getContextPath()
       3. 获取Servlet路径: /demo1 String getServletPath()
       4. 获取get方式请求参数:name=zhangsan String getQueryString()
       5. 获取请求URI: String getRequestURI(): /day14/demo1 StringBuffer getRequestURL() :http://localhost/day14/demo1
       6. 获取协议及版本:HTTP/1.1 String getProtocol()
       7. 获取客户机的IP地址 String getRemoteAddr()
(2)获取请求头数据
String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration getHeaderNames():获取所有的请求头名称
(3)获取请求体数据
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
2、其他功能
(1)获取请求参数通用方式
1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
3. Enumeration<`String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
(2)请求转发
先获取请求转发器:getRequestDispatcher(String path)
再转发:forward(ServletRequest request,ServletResponse response)
(3)共享数据( 域对象:一个有作用范围的对象,可以在范围内共享数据。request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据)
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
(4)获取ServletContext:
ServletContext getServletContext()

HttpServletRequest对象可以用于防盗链。原理就是取Referer这个请求头,看是否是从我们想要的页面来的,如果不是就重定向到我们想要的页面。

post方式请求出现乱码原因:Tomcat服务器默认编码是ISO 8859-1,而浏览器使用的是UTF-8编码。浏览器的中文数据提交给服务器,Tomcat以ISO 8859-1编码对中文编码,当我在Servlet读取数据的时候,拿到的当然是乱码。而通过request.setCharacterEncoding(“utf-8”)设置request的编码为UTF-8,乱码就解决了。

tomcat 8 已经将get方式请求中文乱码问题解决了,但tomcat8之前的版本get方式请求还是会出现乱码,设置request.setCharacterEncoding(“utf-8”)也没用,原因是get请求的数据是从消息行带过去的,设置request.setCharacterEncoding(“utf-8”)只对消息体起作用。解决方法有两种:
1、通过反向查ISO 8859-1得到原始的数据,然后再通过原始数据设置正确的码表,构建字符串
byte[] bytes = canshu.getBytes(“ISO8859-1”);
String value = new String(bytes, “UTF-8”);
2、更改Tomcat服务器的配置来解决乱码,但是不推荐使用,不灵活。Tomcat默认的编码是ISO 8859-1,如果在Tomcat服务器的配置下改成是UTF-8的编码,那么就解决服务器在解析数据的时候造成乱码问题了。

为了使乱码问题容易解决,提交数据能用post就用post方式。

http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息。
HttpServletResponse对象功能
1、 设置响应行 setStatus(int sc)
2、 设置响应头:setHeader(String name, String value)
3、 设置响应体:
字符输出流:使用response.getWriter()方法获得PrintWriter对象,然后.write(“asdfgh”)向浏览器输出字符数据。
字节输出流:使用response.getOutputStream()方法获得ServletOutputStream对象,然后.print或.write(“asdfgh”)向浏览器输出二进制数据。
getWriter()和getOutputStream()两个方法不能同时调用,如果同时调用就会出现异常。

使用response.setContentType(“text/html;charset=UTF-8”);不仅设置浏览器用UTF-8显示数据,内部还把中文转码的码表设置成UTF-8了。
Servlet的service()方法结束后(也就是doPost()或者doGet()结束后),Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

重定向redirect:发生在浏览器,由浏览器进行跳转,由response的状态码和Location头组合而实现,使用response的sendRedirect()实现,地址栏发生变化,重定向可以访问其他服务器上的资源。重定向是两次请求,request域对象对象不是同一个对象,不能使用request对象来共享数据。
请求转发forward:发生在服务器,由服务器进行跳转,浏览器不知道发生了转发的动作。使用request的getRequestDispatcher.forward(request,response)实现,浏览器地址栏路径不会发生变化,只能转发到当前服务器内部资源中,转发是一次请求不是两次请求,一次转发中request和response对象都是同一个。可以使用request对象来共享数据。

请求转发的时序图

以/开头的路径是绝对路径,以.开头路径是相对路径。
JSP页面推荐使用绝对路径。
绝对路径给客户端浏览器使用(或者重定向)时需要加虚拟目录,给服务器使用时不需要加虚拟目录。
request.getContextPath()可以动态获取虚拟目录

ServletContext对象获取方式:
通过request对象获取 request.getServletContext();
通过HttpServlet获取 this.getServletContext();

ServletContext功能:
1、获取MIME类型:String getMimeType(String file)
2、作为域对象共享数据(作用范围是所有用户所有请求的数据):
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
3、获取文件的真实(服务器)路径
String getRealPath(String path)
String b = context.getRealPath("/b.txt"); //web目录下资源访问
String c = context.getRealPath("/WEB-INF/c.txt"); //WEB-INF目录下的资源访问
String a = context.getRealPath("/WEB-INF/classes/a.txt"); //src目录下的资源访问

request对象代表一次请求,ServletContext上下文对象代表整个web工程。
MIME类型格式就是 大类型/小类型 如:text/html和image/jpeg

我们可以使用ServletContext和request实现Servlet之间的通讯,那么我们用哪一种呢?一般原则是:可以使用request就尽可能使用request。因为ServletContext代表着整个web应用,使用ServletContext会消耗大量的资源,而request对象会随着请求的结束而结束,资源会被回收。

会话:用户开一个浏览器访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话。

Cookie是检查用户身上的"通行证"来确认用户的身份,Session就是通过检查服务器上的"客户明细表"来确认用户的身份的。Session相当于在服务器中建立了一份"客户明细表"。

Cookie是客户端会话技术,用于将数据保存到客户端。浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。
使用步骤:
1、服务器端创建Cookie对象,绑定数据 new Cookie(String name, String value)
2、服务器端发送Cookie对象 response.addCookie(Cookie cookie)
3、浏览器端保存Cookie
4、下一次访问浏览器端传Cookie给服务器端
5、服务器端获取Cookie,拿到数据 Cookie[] request.getCookies()
(第一次请求做1、2步,第5步是以后请求做的)

Cookie一般用于存储少量的不太敏感的数据,在不登录的情况下,完成服务器对客户端的身份识别 。

Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。使用cookie.setDomain(".baidu.com");就可以设置Cookie使用的域名,这样www.baidu.com和www.news.baidu.com可以使用相同的Cookie。

使用cookie.setPath("/Servlet1");可以设置使用Cookie的路径。

Cookie使用Unicode字符(中文字符)时需要对Unicode字符进行编码。使用时还需要解码。
Cookie cookie = new Cookie(“country”, URLEncoder.encode(“中文”, “UTF-8”));
String value = URLDecoder.decode(cookies[i].getValue(), “UTF-8”);

Cookie通过setMaxAge()来设置有效期:如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效(不论关闭了浏览器还是电脑);如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie默认MaxAge就是-1;如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie。

服务器端发一个浏览器端已保存的Cookie过来,就会把已有的Cookie覆盖掉了,达到修改Cookie的目的。

Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。Session比Cookie使用方便,Session可以解决Cookie解决不了的事情(Session可以存储对象,可以存储任意类型,任意大小的数据,Cookie只能存储字符串)。

其实Session和request、ServletContext类似也是一个域对象。Session作为一种记录浏览器状态的机制,只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯。

在用户第一次访问服务器Servlet、jsp等动态资源时,Session对象就会被自动创建,保存在内存里。访问HTML等静态资源时Session不会被创建。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,无论是否对Session进行读写,服务器都会认为Session活跃了一次。

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为了防止内存溢出,服务器会把长时间没有活跃的Session从内存中删除,这个时间也就是Session的超时时间(默认30分钟),可以在tomcat/conf/web.xml中、在项目的web.xml文件中、在代码中通过setMaxInactiveInterval()三种方式来修改。

HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户打开同一个浏览器。于是,服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。所以说Session的实现还依赖于Cookie,Session依据Cookie来识别是否是同一个用户。

禁用掉Cookie后,没有Cookie传递给服务器,服务器每次创建的时候都是新的Session,Session也就不能用了,可以通过重写URL地址来解决这个问题,URL地址重写的原理:将Session的id信息重写到URL地址中。服务器解析重写后URL,获取到Session的id。这样一来,即使浏览器禁用掉了Cookie,但Session的id通过服务器端传递,还是可以使用Session来记录用户的状态。
String url = “/ouzicheng/Servlet7”;
response.sendRedirect(response.encodeURL(url));

Session使用步骤
1、获取HttpSession对象 HttpSession session = request.getSession();
2、使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)

JSP:Java Server Page(java服务器端页面)。可以理解为一个特殊的页面,既可以指定定义html标签,又可以定义java代码,用于简化书写。本质上就是一个Servlet。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

jsp的内置对象out是字符输出流对象。可以将数据输出到页面上。和response.getWriter()作用一样。
JSP有三种写java代码的写法
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
JSP的指令有三种,用于配置JSP页面,导入资源文件。格式 <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %>
1. page : 配置JSP页面
2. include : 页面包含的。导入页面的资源文件(如共用的页面头)
3. taglib : 导入资源<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> prefix前缀可以自定义。

EL:Expression Language(表达式语言)。用于替换和简化jsp页面中java代码编写。格式就是 ${表达式}
JSTL:JavaServer Pages Tag Library(JSP标准标签库)。由Apache组织提供的开源的免费的jsp标签 。用于简化和替换jsp页面上的java代码
三个重要标签:
<c:if>
<c:forEach>
<c:choose>
      <c:when>
      <c:otherwise>

MVC是一种设计思想
M:Model,模型, javabean。完成具体的业务操作,如:查询数据库,封装对象
V:View,视图,JSP。完成数据展示
C:Controller,控制器,servlet。获取用户的输入,调用模型,将数据交给视图进行展示

三层架构是一种软件设计架构
界面层(表示层)(web层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互。包括MVC中的C和V。
业务逻辑层(service层):处理业务逻辑的。
数据访问层(dao层):操作数据存储文件。数据访问层与业务逻辑层共同组成了MVC中的M。

Filter与Listener与servlet称为Java web三大组件

过滤器可以看作只是实现Filter接口的Java类。只要Java类实现了Filter接口就可以称为过滤器。

当访问服务器的资源时,Filter可以将请求拦截下来,完成一些特殊的功能(登录验证、统一编码处理、敏感字符过滤)。

当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。如下图

Filter使用步骤:

  1. 定义一个类,实现接口Filter
  2. 复写方法(init、doFilter、destroy)
  3. 注册过滤器,配置拦截资源(web.xml或注解)
    注册过滤器使用<filter>标签,<filter-name> 用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class> 用于指定过滤器的完整的限定类名。<init-param> 用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。<init-param>可不配置。
<filter><filter-name>FilterDemo1</filter-name><filter-class>FilterDemo1</filter-class><init-param><param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</param-value></init-param>
</filter>

<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径。<filter-name>子元素用于设置filter的注册名称,该值必须是在<filter>元素中声明过的过滤器的名字。<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)。<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST,用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

<filter-mapping><filter-name>FilterDemo1</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

<servlet-name>指定过滤器所拦截的Servlet名称。

<filter-mapping>
<filter-name>loggerfilter</filter-name>
<servlet-name>loggerservlet</servlet-name>
</filter-mapping>

doFilter方法里有一个FilterChain参数,可以理解为过滤器不单单只有一个,那么我们怎么管理这些过滤器呢?在Java中就使用了链式结构。把所有的过滤器都放在FilterChain里边,如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。

过滤器之间的执行顺序看web.xml文件中mapping的先后顺序的,如果放在前面就先执行,放在后面就后执行!如果是通过注解的方式配置,就比较urlPatterns的字符串优先级。

Filter生命周期方法

  1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,用于加载资源。
  2. doFilter:每一次请求被拦截资源时会执行,执行多次。
  3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法,只执行一次。用于释放资源。

过滤器拦截路径配置:

  1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
  3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
  4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

监听器就是一个实现特定接口的普通Java程序,这个程序专门用于监听一个Java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。在Servlet层面上,我们更多的监听的是Session、Request、ServletContext这几个对象的创建/销毁/属性内的变化。

监听器可以用来检测网站的在线人数,统计网站的访问量等等.

通俗来讲,A发生了变化,B需要依赖A发生的变化做出处理,这就是监听器。可以理解为事件驱动。

监听器涉及三个组件:事件源,事件对象,事件监听器。当事件源发生某个动作的时候,它会调用事件监听器的方法,并在调用事件监听器方法的时候把事件对象传递进去。我们在监听器中就可以通过事件对象获取得到事件源,从而对事件源进行操作!

在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别 ServletContext, HttpSession和ServletRequest这三个域对象。

HttpSessionListener、ServletContextListener、ServletRequestListener分别监控着Session、Context、Request对象的创建和销毁。
ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener分别监听着Context、Session、Request对象属性的变化。
实现HttpSessionBindingListener接口,JavaBean 对象可以感知自己被绑定到 Session 中和从 Session 中删除的事件。
实现HttpSessionActivationListener接口,JavaBean 对象可以感知自己被活化和钝化的事件。当服务器关闭时,会将Session的内容保存在硬盘上(钝化),当服务器开启时,会将Session的内容在硬盘式重新加载(活化)。

listener使用步骤:

  1. 定义一个类,实现ServletContextListener接口
  2. 复写方法
  3. 配置监听(web.xml和注解)

    Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面,而Ajax通过在后台与服务器进行少量数据交换,可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    JSON:JavaScript Object Notation(JavaScript对象表示法)。是存储和交换文本信息的语法,比 XML 更小、更快,更易解析。

json数据是由键值对构成的,键用引号(单双都行)引起来,也可以不使用引号。值的取值类型可以是 数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在方括号中){“persons”:[{},{}]}、对象(在花括号中) {“address”:{“province”:“陕西”…}}、null。

常见的JSON解析器有Jsonlib,Gson,fastjson,jackson。jackson是SpringMVC内部集成的JSON解析器。

NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。关系型数据库有统一的标准,学会SQL语句就会操作所有的关系型数据库。NOSQL无统一标准,学会redis其他数据库(如hbase)也不会用。

Redis是用C语言开发的,一共只有3万行代码。

redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构:字符串类型 string,哈希类型 hash(map格式),列表类型 list(linkedlist格式,支持重复元素),集合类型 set(不允许重复元素),有序集合类型 sortedset(不允许重复元素,且元素有顺序)

字符串类型 string

  1. 存储: set key value
  2. 获取: get key
  3. 删除: del key

哈希类型 hash

  1. 存储: hset key field value
  2. 获取:hget key field: 获取指定的field对应的值
    hgetall key:获取所有的field和value
  3. 删除: hdel key field

列表类型 list:允许重复元素,有序

  1. 添加:lpush key value: 将元素加入列表左边
    rpush key value:将元素加入列表右边
  2. 获取:lrange key start end :范围获取,(0 -1)就是获取所有
  3. 删除:lpop key: 删除列表最左边的元素,并将元素返回
    rpop key: 删除列表最右边的元素,并将元素返回

集合类型 set : 不允许重复元素,无序

  1. 存储:sadd key value
  2. 获取:smembers key:获取set集合中所有元素
  3. 删除:srem key value:删除set集合中的某个元素

有序集合类型 sortedset:不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数。redis
正是通过分数来为集合中的成员进行从小到大的排序。

  1. 存储:zadd key score value
  2. 获取:zrange key start end 最后面带withscores就表示把分数也拿出来
  3. 删除:zrem key value

redis持久化机制有两种:

  1. RDB:默认方式,不需要进行配置,默认就使用这种机制, 在一定的间隔时间中,检测key的变化情况,然后持久化数据。
  2. AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据。

Jedis是一款java操作redis数据库的工具
jedis.setex(“activecode”,20,“hehe”);//将activecode:hehe键值对存入redis,并且20秒后自动删除该键值对

1、JAVA web学习笔记相关推荐

  1. 2019年Java Web学习笔记目录

    Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...

  2. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  3. [原创]java WEB学习笔记02:javaWeb开发的目录结构

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. [原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. [原创]java WEB学习笔记86:Hibernate学习之路-- -映射 n-n 关系,单向n-n,双向n-n

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记54:Struts2学习之路--- 编写Struts2 的第一个程序,HelloWord,简述 package ,action,result...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. [原创]java WEB学习笔记18:java EE 中的MVC 设计模式(理论)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

最新文章

  1. fprintf()中的stderr解析
  2. 编译osdrv的uboot 内核 文件系统(Hi3516a)
  3. 在Forge Viewer上显示自订义属性
  4. 股价相对于转股价溢价的时候,可转债就是折价状态。这就意味着只要正股保持目前的价格,赚钱的概率较高。...
  5. DevExpress的进度条控件ProgressBarControl的使用-以ZedGraph添加曲线进度为例
  6. c# 读取txt方法
  7. [转]半角全角互转函数[JS版 VBS版]
  8. 阿里P8架构师谈:Restful、SOAP、RPC、SOA、微服务之间的区别
  9. opencv基于DNN的人脸检测
  10. JavaScript和Chrome中的SSDP发现
  11. java xml 字符串转对象_java读取xml文件并转换成对象,并进行修改
  12. 逛街游戏html5,HTML5购物商城app源码
  13. Sublime text3 安装PyV8
  14. 说课稿模板计算机,计算机系统的组成说课稿1模板.doc
  15. Android记录18-集成极光推送的一点说明
  16. 计算机不断重启 病毒,电脑中病毒后一直自动重启怎么样解决
  17. 前端开发 HTML一篇就够了(七七)
  18. 工程化框架之feather
  19. ArcGIS中拓扑规则英文对照说明
  20. 中金看海外:海外银行IT公司为何能有5年牛市?

热门文章

  1. 基于nginx的rtmp直播服务器实现OBS直播
  2. arcsde for java,java arcsde 联接oracle
  3. 计算机专业英语词汇缩写大全(J-Z)
  4. 兔子胆小,极兔胆大?
  5. IDEA 报错These modules have been removed from Maven stucture
  6. L0Smoothing学习笔记
  7. excel的一些操作
  8. M1 Mac mini 使用半年体验 - Mac的新未来
  9. 使用泰勒公式计算Cos值
  10. ubuntu18.04 桌面卡死解决方法