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