JavaWeb
学习完这一个阶段,我们应该是能够完成一个简单的javaEE企业级开发项目了。后来的那些技术都是对JavaWeb技术的一个再封装,继而使得操作系更强,对开发者更加友好。
JavaWeb是走向外来的关键一步。我由于总总原因直接上手了SSM,最开始感觉还是有些许吃力的,毕竟东西学起来容易,但是思维转变起来却很难。JavaWeb是java进阶到SSM框架的一个过渡阶段,如果你在javaWeb阶段的很多概念性的东西学懂了,后面学起来很轻松。千万不要保有JavaWeb可以不学的想法,很危险!!!
文章目录
1、概述
1.1、web应用程序简介
什么是web应用程序?
可以供浏览器访问的程序就是web程序
我们在网上浏览能够浏览到的任何信息都是存在于这个世界的某个角落的计算机中的。这些信息被放在指定的文件目录下。一个web应用程序由静态web和动态web组成,里面常常由含有很多的资源比如:html、css、js、jsp、servlet、java程序、jar包、配置文件。
1.2、静态web、动态web
提供给所有人看的数据始终不会发生变化的就是静态网页。提供给所有人看的数据始终会发生变化,每个人看到的不一样,那就是动态网页。
静态web的请求:客户端发出一次请求以后,由于这是静态web,webService就将请求传至服务器然后获取到对应的资源,然后返回给客户端。
动态web的请求:客户端发出一次请求后,获取到对应的动态web资源,有可能还会调用底层的数据库,然后将资源进行返回。
2、Tomcat服务器
一个用装载servlet资源的容器
我们的window自带的是IIS服务器,我们在JavaWeb阶段学习的时候使用的主要是tomcat服务器。当然,你的未来也会接触到各种各样的服务器,比如nginx、apache、Jetty、Undertow,后面两个再加上Tomcat都是SpringBoot内置的服务器,如果还没有学习SpringBoot的,你可以在这里埋一个种子。
使用tomcat的注意事项:
- 要能够识别tomcat中主目录下的每个文件夹的功能
- 会使用脚本文件进行启动服务器
- 我们可以修改tomcat的端口号,默认的是8080,在配置文件目录下的server.xml文件中
请你谈谈网站是如何进行访问的?
当我们输入我们需要访问的网址的以后,系统会首先去检查本机的配置文件下的域名映射(即我们电脑的本地配置文件,默认情况下里面是有localhost 127.0.0.1这样的配置)如果我们访问你的对应的地址在我们的配置文件中拥有对应的映射路径,那么他就会按照配置文件的信息进行跳转。如果没有对应的映射,那么他就会去DNS服务器上面寻找对应的资源,找到了就返回,找不到就返回404。
3、HTTP
HTTP是一个简单的请求-相应协议,通常运行在tcp之上,发展至今,已经到了http2.0。
在http1.0中,客户端与web服务器连接后只能获得一个web资源,然后就端口了连接
在http2.0时代,客户端与web服务器连接后可以得到多个web资源
http的请求方式用GET、POST、HEAD、DELETE、PUT、TRACT…
不过我们常用的只有GET和POST,这些方式一定要有一个概念,因为后期我们要学Restful风格的编程,我们同一个路径就会因为请求方式的不同,导致出现不同得结果
相应状态码:
- 200:请求成功
- 3XX:请求重定向
- 404:找不到对应的资源
- 500:服务器代码错误
- 502:网关错误
4、Maven
约定大于配置
后面学习SpringBoot的时候也会出现这个名词。maven帮你设置好的东西,要比你自己配置的地位要高,因为maven对于我们每个文件的放置位置都有着严格的要求,这也就是后面我们需要使用资源过滤器的原因,因为我们的自己没有按照规则放置的位置maven帮我们自动过滤了(Mybatis的mapper接口与mapper.xml的位置)
使用步骤:
- 官网下载相应的版本
- 配置对应的环境变量
- 由于他默认的下载位置是使用国外的,所以我们需要在配置中的settings.xml中修改他的镜像,为的就是提高下载速度(我们没添加一个依赖就会去下载对应的jar文件)
- 然后我们需要自己新建一个仓库,这样我们才能将我们每次引入的jar依赖放在一个指定的位置,他默认的位置是C盘,你应该不喜欢将文件放在C盘吧
- 修改IDEA的maven的仓库位置,修改为我们新建的仓库,这样每次下载的内容才能够存放进去
- 第一次使用maven,会下载很多的依赖,请耐心等待。当然也有可能出现IDEA与maven版本不兼容的问题,可以尝试换版本试一试。
5、Servlet(重点)
5.1、Servlet程序
使用maven工具,创建一个web项目步骤:
- 添加对应的web支持
- 编写一个普通的类,继承HttpServlet类,并且重写里面的doGet、doPost方法
- 我们可以将doPost方法的方法体写成调用doGet方法,这样我们无论如何都能够访问到我们的doGet方法中
- 将我们编写的类注册到对应的web.xml文件中,并且配置对应的映射。即我们访问映射,程序自动帮我们转移到我们的类上
- 配置Tomcat
- 访问测试
5.2、Servlet原理
当浏览器访问web容器中的对应资源时,对应的资源会根据Request、Response这两个参数,传递相应的信息,再跳转到Servlet中的service方法,根据我们自己编写的类,处理相应的请求,最终将信息返回。
5.3、Mapping
将这个理解成映射即可。在我们的web.xml配置文件中,servlet中的配置我们自己编写的处理类,servlet-mapping中配置我们的访问的时候的url路劲
5.4、ServletContext
ServletContext类想一个大容器,他可以用来存放每一个Servlet中的数据。我们只需要使用 .setAttribute(“xx”,xx) 就可以手动的将我们Servlet中的数据放置进那个大容器。
5.5、重定向和请求转发(重点)
重定向:
请求转发:.forward()
两者的区别:
- 请求转发,当A请求C的资源,但是A无法直接访问到,但是B能访问到,所以我们就访问B,以此来达到A访问C的目的
- 重定向,当A需要访问某资源的时候,先去访问B,但是B没有对应的资源,不过B却告诉A应该访问A,于是就去A再去访问C,继而拿到了对应的资源
5.6、HttpServletRequest、HttpServletResponse
由于web服务器会收到客户端的http请求,基于此出现了HttpServletRequest、HttpServletResponse两个类,分别用来创建接受数据和返回数据的对象,也就是我们doGet方法的参数req与resp。
resp:
我们在浏览器中能够看到的请求效果比如编码、状态码、请求头…都是利用resp实现的。当我们将数据进行处理以后,需要返回到对应的前端页面时,就可以用resp来返回对应的信息
//设置字符便阿门
resp.setCharacterEncoding("utf-8");
//设置内容类型
resp.setContentType("text/html");
req:
获取前端传来的参数,比如我们可以对传入的数据进行字符编码编码的设置(当然我们也可以对返回的数据进行字符的设置)。我们使用这个参数能够获取到前端的参数信息,然后将参数信息进行对应的逻辑转换,记得实现我们想要的操作。
//设置返回的类型
req.setCharacterEncoding("utf-8");
//使用请求转发
req.getRequestDispatcher("/success.jsp").forward(req, resp);
//此时使用的是重定向的形式
resp.sendRedirect("success.jsp");
5.7、Cookie、Session(重点)
Cookie、Session是两种保存会话的技术
明白会话的概念:
- 用户打开一个浏览器,访问了多个web资源,再关闭浏览器。这个过程称为会话
- 如果我们之前访问过某个web资源,当我们再次访问的时候,服务端能够知道我们曾经访问过,那么这个就称为有状态会话
一个网站如何证明你来过?
cookie:服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了(带上指定的信物去拜访某人)客户端为主导
session:服务器登记你来过,下次你来的时候来匹配你(回到你的宿舍,宿舍的门禁会来匹配你)服务端为主导
Cookie
Cookie对象的创建:我们从客户端的req中获取对应的Cookie信息
Cookie[] cookies = req.getCookies();
Cookie一般保存在本地的用户目录或者AppData下
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小限制4kb
- 浏览器上限300个cookie
Session
获取对应的Session信息:登记以后的用户拿到的是SessionID,每个用户唯一,我们拿着SessionID去与服务器进行判定比对
HttpSession session = req.getSession();
Session和Cookie的区别:
- Cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务器创建
6、JSP
都2020了,我在三年前就有人叫我不要学习JSP。JSP技术是一种模板引擎,它给定了我们的页面数据一种格式,让我们的数据按照它的语法来进行显示,我们未来还会学习很多,比如SpringBoot推荐的Thymeleaf,他们都是一种模板引擎。但是由于JSP强大的耦合性,使得如今除了少数的政府项目还在使用外(毕竟项目已经很多年了,重构花费太大,没必要)其他的公司都是摒弃了JSP的,特别是前后端分离时代,JSP已经没有了市场。所以我们只需要了解即可
6.1、JSP对应的命令
JSP表达式:
<%--JSP表达式
作用:将程序输出到客户端
<%= 表达式或者变量%>--%>
<%= new java.util.Date%>
JSP脚本:
<html>
<body>
<h2>Hello World!</h2>
<%= new java.util.Date() %>
<%
int sum= 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
out.print("<h1>sun:"+sum+"<h1>");
%>
</body>
</html>
JSP指令:
//此用法类似于java种的导入包
<%@page import="java.util.Date" %>
//此用法表示,如果当前页面有错误,则跳转到相应的界面
<%@page errorPage="xxx.jsp" %>
//此用法表示,设置该页面为错误页面,可在自定义的404等错误中设置
<%@page isErrorPage="true" %>
//两种方式可以引入新的页面,可以将引入的新的界面当作头部或者尾部
<%@include file="xxx.jsp"%>//此方式是将两个界面合二为一(变成java代码)
<jsp:include page="xxx.jsp"></jsp:include>//此方法是将界面进行拼接(类似于链接,建议使用此种方法)
6.2、JSTL表达式
这在我们的前端页面的编写起着十分重要的作用。当我们的后端数据传到前端时,前端通过JSTL表达式,对数据进行遍历,循环,继而进行相应的输出。我们也可以理解成JSTL是为了弥补HTML标签无法遍历的弱点引入的。
对应的标签:
- c:if
- c:choose
- c:forEach(重要,很多的遍历都需使用它)
7、JavaBean
这是一个实体类,我们在使用java连接数据库操作的时候,我们的每一个属性都是需要和数据库的每一个字段进行匹配的,所以如果我们能在最开始编写JavaBean的时候就考虑到这一点,那么可以为接下来的工作节省很多的成本。
其实我们在这里也不难发现一个点,那就是我们怎么编写实体类?这就得根据数据库的字段来了,所以我们也就可以得出一个结论,那就是在程序的设计开始之初,我们应该设计一个好的数据库。
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
8、MVC三层架构
MVC是一种架构模式,记住这个词。我在很多地方看到有人把它和设计模式弄混淆了。GOF23是为了我们的业务代码更加的灵活多变以及更富有扩展性继而引入的代码的编写方式,架构模式则是我们的程序设计的一个纲领,它给出一个规范,告诉我们的程序架构应该使用怎么的一种方式。不恰当的类比一下,就是一个是架构师考虑的问题,一个师是CURD工程师考虑的,前者明显站在了一个更高的角度。
我们这里使用的是MVC架构模式,未来你在前端还会学到MVVM架构模式,以及SpringCloud的微服务架构模式
MVC = Modul + View + Controller
Model:对应我们后端的server、pojo、dao等包组织起来的一个个模块
View:对应我们编写的前端资源
Controller:对应我们后端的controller包
换句话说就是,我们不再是我发出指令,然后就直接返回我们的请求。而是在这之间填了一层,我们的发出请求以后,请求集中到了对应的Controller包下,然后Controller包下的类,再将我们的请求转发到对应的处理模块下,然后将处理完的信息进行返回。最终,前端视图代码与后端的业务代码,因为多出来的这一层,大大的降低了耦合性
MVC一定要理解明白,我们后面学习SpringMVC框架时,如果你对这个概念已经烂熟于心,那么我相信你很快就能上手那个框架
9、Filter(重点)
在学习JavaWeb这个板块知识的时候,它是一个重点,但是我们后面真实的代码中,基本不会再去写它,而是使用其他的方式(封装了Filter)进行资源的过滤,所以我们学习的时候有时间就学习代码编写,没时间就理解思路
我们之前在学习HttpServletRequest、HttpServletResponse的时候,说到了它可以对我们客户端请求过来的数据进行字符编码以及其他的一系列的操作,但是如果我们每次都去编写这样的业务代码,那肯定是不大符合我们java语言的特性。对于这类代码,我们将它提取出来,就成了我们的Filter类。当然我们更多的时候,是将它用作一种权限的拦截器。
注意在使用的时候,需要使用过滤的这个链
chain.doFilter(request, response);//让我们的请求继续走,如果不写,程序到这里就会被拦截停止
Filter开发步骤:
-
导入对应的包
-
编写对应的过滤器
-
编写测试类
-
在web.xml中编写对应的注册
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>pers.mobian.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
-
测试即可
10、监听器
这个类使用来监听我们的程序的状态,比如可以获取对应的Session,以此来获取我们的在线人数。
配置的映射形式:
<listener>
<listener-class>xxx</listener-class>
</listener>
11、文件上传、邮件发送
个人理解,这两个不需要深究,学习的方式可以与前面的过滤器、监听器一样。因为我们真正的使用这些功能的时候,都是都他们进行了封装,继而使得功能的操作性更强。
其实我们不难发现,JavaWeb阶段的这些东西,已经是对java基础的一些封装了,比如文件的IO封装,引出的文件上传下载,或许我们不会使用这些底层的技术,但是我们对它的来龙去脉一定要有一个认识,不然,我们在学习封装技术的底层源码的时候,就会出现全是看不懂的代码