JavaWeb笔记
1、JavaWeb
Java Web,是用Java技术来解决相关web互联网领域的技术栈。
2、Tomcat
2.1、Tomcat是什么
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
下载地址:https://tomcat.apache.org/
2.2、Tomcat文件夹
几个重要的文件夹
- bin文件夹:主要存放开启Tomcat和关闭服务的文件(windows:.bat文件,linux:.sh文件)
- conf文件夹:放置Tomcat配置文件
- lib文件夹:依赖库文件夹
- webapps文件夹:放置网站
- work文件夹:Tomcat服务器工作的目录
2.3、启动
windows:执行bin目录下的startup.bat文件
linux:执行bin目录下的startup.sh文件
2.3.1、可能出现问题
闪退:查看8080端口是否被其他程序占用
乱码:解码问题,并无大影响
解决方法:修改conf/logging.properties中的java.util.logging.ConsoleHandler.encoding = UTF-8改为GBK
2.4、关闭
windows:关闭窗口
linux:执行shutdown.sh
3、Maven
3.1、Maven是什么
百度百科:
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
简单点讲就是管理jar包的工具。
3.2、约定大于配置
3.3、Maven下载
官网地址:https://maven.apache.org/
3.4、配置
3.4.1、环境变量(windows)
此电脑右键-》属性-》高级系统设置-》环境变量-》系统变量中
新建俩条系统变量:
1 | 变量名:M2_HOME |
在系统变量Path中添加
1 | %MAVEN_HOME%\bin |
3.5、Maven仓库
3.5.1、网址
找下载量多的下载,若更新年份较为久远可选新一些的下载量较多的版本。
3.5.2、pom.xml
1 |
|
有与Maven约定大于配置,资源文件有可能无法导出,可在pom.xml中加入
1 | <build> |
3.5.3、导入
例子:
1 | <dependencies> |
这也是servlet和jsp需要的jar包
4、Servlet
4.1、Servlet是什么
Servlet是一个java接口,用于处理网络的接口
俩个子类:
- HttpServlet
- GenericServlet
4.2、HttpServlet
UML关系图:
4.3、Servlet原理
Servlet由web服务器(Tomcat)调用,web服务器在收到浏览器请求:
4.4、servlet-mapping
将servlet的class路径映射到url中。
4.4.1、一个servlet-mapping映射一个路径
1 | <servlet-mapping> |
4.4.2、一个servlet-mapping映射多个路径
1 | <servlet-mapping> |
4.4.3、一个servlet-mapping映射通用路径
1 | <servlet-mapping> |
4.4.4、默认映射设置
1 | <servlet-mapping> |
4.4.5、后缀实现
1 | <servlet-mapping> |
4.4.6、优先级问题
指定固有路径的映射优先级最高,如果找不到会前往默认的请求。
4.5、HttpServlet几个方法
4.5.1、方法
1 | //getServletConfig() 获取Servlet配置 |
4.5.2、web.xml参数
全局参数:
1 | <!--全局上下文参数--> |
servlet参数:
1 | <!--servlet的参数--> |
4.6、ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
多个servlet可以访问共同的ServletContext以达到以下几个目的:
4.6.1、共享数据
web.xml映射配置块
1 | <servlet> |
可以看成servlet1(作为写入上下文节点的Servlet类):
1 | public class HelloServlet extends HttpServlet { |
可以看成Servlet(作为读取上下文节点的servlet类)
1 | public class GetUserNameContextServlet extends HttpServlet { |
结果:在/getName中看到(姓名:久曌),说明多个Servlet共享同一个ServletContext,并且ServletContext可以进行数据共享。
4.6.2、获取初始化参数
创建getContextParam类:
1 | public class getContextParam extends HttpServlet { |
web.xml配置,让getContextParam可以读取
1 | <!--配置参数--> |
4.6.3、请求转发
4.6.3.1、重定向与请求转发
请求转发:
重定向:
请求转发不需要知道C,重定向需要知道。请求转发的url不变,重定向的url变为C的url。
4.6.3.2、例子
1 | public class requestDispatcherServlet extends HttpServlet { |
4.6.4、读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现:文件都打包到同一路径下:classes,这个路径称之为classpath。
/代表当前web应用
1 | username=root |
1 | public class servletDemo05 extends HttpServlet { |
4.7、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletReques,一个代表响应的HttpServletRequest。
4.7.1、简单分类
负责向浏览器发送数据的方法:
1 | ServletOutputStream getOutputStream() throws IOException; |
负责向浏览器发送响应头的方法:
1 | void setDateHeader(String var1, long var2); |
响应的状态码常量:
1 | int SC_CONTINUE = 100; |
4.7.2、下载文件
1 | protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { |
4.7.3、验证码的简单实现
1 | public class ImageServlet extends HttpServlet { |
4.7.4、实现重定向
A向B发送请求,B通知A去访问另外一个web资源C
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 |
|
4.8、HttpServletRequest
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | public class requestServlet extends HttpServlet { |
getParameter()、getParameterValues()方法来获取参数和参数数组。
getRequestDispatcher()方法请求转发。
${pageContext.request.contextPath}获取路径。
重定向与转发的区别:
相同点:
- 页面都会实现跳转
不同点:
- 请求转发时,url不会发生改变;307
- 重定向时,url会发生变化;302
5、Cookie、Session
5.1、会话
会话:用户打开一个浏览器,点击很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:类似一个专有服务员一直服务与你,直至你离开餐馆。
5.2、保存会话的两种技术
1、Cookie
cookie
- 客户端技术
session
- 服务器技术,利用这个技术,可以保存用户的会话信息。我们可以把信息或者数据放在Session中!
常见场景:网站登入之后,你下次不用在登陆,第二次访问直接就登入了。
1 | public class CookieDemo01 extends HttpServlet { |
注:PrintWriter在使用时,setCharacterEncoding是无用的,响应时会自动使用ISO-8859-1,这时我们应该使用OutputStream out = resp.getOutputStream();
2、Session
Session方法:
Session与Cookie的区别:
- Cookie是把用户的数据写给用户浏览器,由浏览器保存(可以多个)
- Session把用户的数据写到独占Session中,服务端保存(保存重要信息,减少服务器资源的浪费)
- Session对象由服务创建。
session存活时间
1 | <session-config> |
1 |
|
使用场景:
- 保存登入用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中。
6、JSP
6.1、什么是JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术。
6.2、JSP原理
方法:
1 | //初始化 |
JSP内置对象:
1 | PageContext pageContext; //页面上下文 |
6.3、JSP基础语法
1 | <%--导包--%> |
局部变量生成在try块中
1 | <%--全局变量--%> |
全局变量生成在类中
EL表达式
1 | ${x} |
${xx} 意思是取出某一范围中名称为xx的变量,取值范围Page,Request,Session,Application。
${param.xx} 意思是获取请求的元素,相当于 request.getParameter(“xx”)。
6.4、注释
1 | <!--html注释--> |
html注释会出现在页面上,另外俩个不会
6.5、指令用法
6.5.1、错误页面跳转
(JSP、web.xml):
1 | <%@ page errorPage="Error/404.jsp" %> |
1 | <error-page> |
6.5.2、导入其他页面
1 | <%@ include file="header.jsp" %> |
标签:
1 | <jsp:include page="/header.jsp"></jsp:include> |
@include:会将俩个页面合二为一。
缺点:如果合并的文件繁多,会因此占了过多的本地存储空间。
优点:因为已经生成了jsp文件,不需要在去拼接,提高运行效率。
jsp:include:仍是三个页面。
缺点:每次用户请求都需要进行拼接,消耗事件,用户体验差上些许。
优点:占用空间小。
6.6、九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Application ServletContext 存东西
- Session 存东西
- Config SerlvetConfig
- out
- Page
- Exception
源码:
1 | final javax.servlet.jsp.PageContext pageContext; |
从pageContext取出,我们通过的寻找方式:
从底层到高层(作用域):page->request->session->application->null
1 | <% pageContext.findAttribute("name"); %> |
1 | <% |
resquest:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完就没用了。
session:客户端向服务器发送请求,产生的数据,用户用完还有用,比如购物车。
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如聊天数据。
6.7、JSP标签、JSTL标签、EL表达式
导包
1 | <dependency> |
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
调用java方法
JSP标签:
1 | <jsp:include page="Error/404.jsp"></jsp:include> |
JSTL表达式:
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
简单来说,JSTL就是弥补Html的不足,也是一种标签。
- 核心标签
- 格式化标签
- SQL标签
- XML标签
- JSTL函数
核心标签:
导入:
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
核心标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= … > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose>, <c:when>, <c:otherwise> | 循环 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach>, <c:forTokens> | 迭代 |
<c:redirect> | 跳转 |
<c:url> | 使用可选的查询参数来创造一个URL |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> |
7、JavaBean
maven依赖:
1 | <!--导入mysql驱动--> |
实体类例子:
1 | public class Address { |
JavaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM
ORM:对象关系映射
- 表–>类
- 字段–>属性
- 行记录–>对象
1 | <jsp:useBean id="address" class="com.jiuzhao73.entity.Address" scope="page"/> |
8、三层架构与MVC
MVC:
三层架构:
三层架构和MVC的目标都是一致的:为了解耦合、提高代码的复用。
不同:三层架构是软件架构,MVC是设计模式
对应关系
Filter(过滤器):对用户的读取进行拦截
功能:
- 在request到达servlet之前,检查或修改resquest。
- 在reponse到达web服务器之前,检查或修改reponse。
可能有多个过滤器一起过滤
1 | //在服务器关闭时,销毁过滤器 |
web.xml:
1 | <filter> |
10、Listener
(监听器):
注册监听器(web.xml):
1 | <listener> |
11、Junit单元测试
依赖导入:
1 | <dependency> |
@Test只有在方法上有效