Java Web项目(学了就忘?来实操一下)https://blog.csdn.net/qq_41822345/article/details/104403813
day1–xml&反射
XML(Extensible Markup Language,可扩展标记语言)
1.为了灵活实现不同路径下执行不同的资源,我们需要使用XML进行配置。
2.为了限定XML内容,我们需要使用xml约束(DTD或Schema)。 DTD:文档类型定义
3.为了获得XML的内容,我们需要使用dom4j进行解析。
命名空间:用来处理元素和属性的名称冲突问题。每个元素和属性都有自己的名称空间,就像每一个类都有自己所在的包一样。
XML解析方式:DOM、SAX、PULL → 解析器(比较繁琐的API) → 解析开发包(简化API)
DOM(文档对象模型)、SAX(逐行解析)、PULL(Acdroid内置的,类似于SAX)
解析器即不同解析方式的具体实现。
常用解析开发包:dom4j、JDom、JAXP、jsoup
dom4j常用API:
1.SaxReader对象
read()加载xml文档
2.Document对象
getRootElement()获取根元素
3.Element对象
elements()、element()、getName()、attributeValue()、elementText()、getText()
反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作。
day2–http&tomcat
Http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
用于定义Web浏览器和Web服务器之间交换数据的过程。
Http协议的组成:
Http请求协议:请求行、请求头、请求体
Http响应协议:响应行、响应头、响应体
HTTP消息的组成:
客户端到服务器的请求 服务器到客户端的响应。
B/S架构和C/S架构
Web通信:采用B/S架构,通过Http进行通信。通过在浏览器地址栏编写URL,向服务器发送一个请求,服务器根据请求进行相应的处理,处理完成之后,向浏览器作出一个响应:将服务器端资源发送给浏览器。
URL:互联网上的每一个文件(资源)都有一个唯一的URL。
URL格式:协议://用户名:密码@域名:端口号/资源位置?参数=值#标志
http:192.168.0.116:8080/index.jsp
web资源分为静态资源(比如HTML、CSS、JS、图片等)和动态资源(比如JSP/Servlet、ASP、PHP等。
常见的Web服务器:Tomcat、WebSphere、JBoss、WebLogic
Tomcat:开源免费的轻量级Web应用服务器,用于开发和调试JSP程序的首选。支持Servlet和JSP规范(在java中,规范就是接口。)
apache web服务器和Tomcat web服务器一般整合使用。(前者用于处理html页面。后者主要用于处理servlet和jsp,也可以处理html,但没有前者强大)。
day3–Servlet
JavaWeb三大组件:Servlet、Filter、Listener
Servlet:Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
Servlet的作用:
1.获取请求数据
2.处理请求
3.完成响应
Serlvet的实现类:javax.servlet.http.HttpServlet (doGet()、doPsot())
HttpServlet类的方法
1)init()
2)doGet(HttpServletRequest request,HttpServletResponse response)
3)doPost(HttpServletRequest request,HttpServletResponse response)
4)destroy()
Servlet接口中的方法
1)init(ServletConfig config)
何时执行:servlet对象创建的时候执行
ServletConfig : 代表的是该servlet对象的配置信息
2)service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求,认为ServletRequest 内部封装的是http请求的信息
ServletResponse :代表响应,认为要封装的是响应的信息
3)destroy()
何时执行:servlet销毁的时候执行
Servlet的生命周期(面试题)
1)Servlet何时创建
默认第一次访问servlet时创建该对象。当在servlet的配置时加上一个配置 servlet对象在服务器启动时就创建。
2)Servlet何时销毁
服务器关闭servlet就销毁了
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法。
问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost()一共执行力多少次?request对象创建几个?response创建几个?
Servlet的生命周期:用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中的init()方法就会执行,任何一次请求服务器都会创建一个新的线程访问Servlet中的service方法,在service方法内部根据请求的方式不同调用doGet()或者doPost()方法。当Servlet中服务器中移除掉或者关闭服务器时,Servlet的实例就会被销毁,destroy()方法就会执行。
Servlet配置示例:
<!---------servlet的类的配置--------->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.liuwen.servlet.QuickStartServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///myDB
</init-param>
</servlet>
<!---------servlet的虚拟路径的配置--------->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<servlet-pattern>/quickStartServlet</servlet-pattern>
</servlet-mapping>
ServletContext对象:
1.什么是ServletContext对象
ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,一个web应用只有一个ServletContext对象。
问题:一个web应用有几个servlet对象?----多个
ServletContext对象的生命周期?
创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态))
销毁:web应用被卸载(服务器关闭,移除该web应用)
怎样获得ServletContext对象
1)ServletContext servletContext = config.getServletContext();
2)ServletContext servletContext = this.getServletContext();
ServletContext的作用
(1)获得web应用全局的初始化参数
(2)获得web应用中任何资源的绝对路径(重要 重要 重要)
方法:String path = context.getRealPath(相对于该web应用的相对地址);
(3)ServletContext是一个域对象(重要 重要 重要)
什么是域对象?什么是域?存储数据的区域就是域对象
ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
Servlet是线程安全的么?
Servlet 默认是单例模式,在web 容器中只创建一个实例,所以多个线程同时访问servlet的时候,Servlet是线程不安全的。 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。
当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。
上图中的Thread1和Thread2调用了同一个Servlet1,所以此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。多线程并不共享局部变量,所以要尽可能地在servlet中使用局部变量。
day4–response
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应的response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
响应状态码的方法:setStatus(int status)、sendError(int sc)
响应消息头的方法:addHeader()\setHeader()、addIntHeader()\setIntHeader()、setContentLength()、setContentType()、setLocale()、setCharacterEncoding()(后面几个方法用于解决乱码问题)
响应消息体的方法:getOutPutStream()(用于输出二进制字节数组)、getWriter()(输出字符文本)
实例1、文件下载 必须设置Content-Type(实体内容的MIME类型)头、必须设置Content-Disposition(接收程序处理数据的方式)头
原理:当点击下载超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。
IE浏览器下载中文文件的时候采用URL编码,Firefox浏览器下载中文文件采用Base64编码。
乱码问题:respose对象(HttpServletResponse)的字符输出流采用ISO-8859-1编码,IE浏览器默认使用GB2312编码。
乱码解决思路:第一种:HttpServletResponse对象使用utf-8编码(response.setCharacterEncoding(“utf-8”)),通知浏览器使用utf-8解码。(response.setHeader(“utf-8”))
第二种:response.setContentType(“utf-8”)
实例2、验证码的生成(伪代码如下)
VerfyCodeServlet{
1.使用BufferedImage创建图片
2.使用Graphics绘制内容
绘制显示区域
绘制随机字符(随机颜色)
绘制干扰线
3.使用ImageIO将BufferedImage写到浏览器
必须使用response.OutPutStream()
}
day5–request
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。HttpServletRequset接口中定义了获取请求行、请求头、请求消息体的方法。
获取请求行的相关方法:getMethod()(获取请求方式)、getContextPath()(获取web应用程序路径)、getRemoteAddr()(获取IP地址)
获取请求头的相关方法:getHeader()、getContentType()、getCharacterEncoding()
获取请求参数的相关方法:getParameter()、getParameterValues()、getParameterNames()、getParameterMap()
重定向和转发的区别(redirect/forward):
1.重定向的地址栏会发生变化,而转发不会;
2.重定向是两次请求两次响应,转发是一次请求一次响应;
3.重定向可以跳转到任意网站,转发只能在服务器内部进行转发;
4.重定向路径需要加工程名,转发路径不用加工程名。
day6–Cookie和Session
会话:指的是一个客户端(浏览器)与Web服务器之间里连续发生的一系列请求和响应过程。eg:一次整个购物过程就是一个会话。
因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)
为什么要用Cookie和Session来保存会话中产生的数据?而不用HttpServletRequest对象或者Servlet对象?
HttpServletRequest对象或者Servlet对象都可以都数据进行保存。但是:
①使用HttpServletRequest:Web服务器端针对客户端的每次Http请求,都会创建一个HttpServletRequest请求,该对象只保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,购买请求中的数据将会丢失。
②使用ServletContext:由于同一个Web应用共享一个ServletContext对象,因此,结账时无法分辨哪些商品是哪些用户购买的,而会将所有用户所购买的商品进行结算,这显然也是不行的。
Cookie:Cokie是将用户的信息保存到客户端浏览器的一个技术,当下次访问的时候,浏览器会自动携带Cookie(在请求头携带)的信息过来到服务器端。
Cookie执行流程:当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息以Cookie的形式发送给浏览器,一旦用户浏览器接收到该信息,就会把它保存在浏览器额缓冲区中,当需要再次访问服务器的时候,就会在请求消息中将用户信息以Cookie的形式发送给Web服务器,从而使服务器分辨出当前请求是哪个用户发送的。
Cookie的使用:
服务器创建Cookie:new Cookie(name,value)
将Cookie发送给浏览器:HTTPServletResponse.addCookie(Cookie cookie)
接收浏览器所携带的Cookie:HTTPServletRequest.getCookies()
Session:Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSessionId。
Session执流程:甲乙两个用户购买东西。当甲访问购物网站时,服务器会为甲创建一个Session对象(存在服务器端),该对象会存放甲所购买的商品的信息。同时,服务器将甲用户Session对象的ID属性
以Cookie(Set-Cookie:JSessionId)形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,服务器端会根据浏览器发送的请求消息头中Cookie的信息,即ID属性找到为甲所创建的Session对象,并由该对象所存放的商品信息进行结算。
1.怎样获得属于本客户端的session对象(内存区域)?
HttpSession session = request.getSession();
2.怎样向session中存取数据(session也是一个域对象)?
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3.session对象的生命周期?
创建:第一次执行request.getSession();
销毁:服务器关闭、session失效/过期(默认30分钟)、手动销毁session.invalidate();
session作用范围:默认一次会话中
Cookie和Session的区别?(或者这样提问:有了Cookie为什么还要用Session?)
Cookie是存到客户端的技术,有大小和个数的限制的,Session是存到服务器端的技术,没有大小和个数的限制。另外,Cookie相对于Session来说不安全。
Sevlet三个作用域总结对比:ServletContext、HttpSession、HttpServletRequest
Day7–JSP
JSP:(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术。JSP文件中,Html代码和Java代码共存(Html代码用于实现网页的静态内容显示,Java代码用于实现网页的动态内容显示)。
JSP技术所开发的Web应用程序是基于Java的,它以一种简洁而快捷的方法从Java程序生成Web页面。它有:
跨平台、业务代码相分离、组件重用、预编译。
JSP页面和HTML页面没有什么区别,在页面代码最上方多了一条page指令。
<%@ page language=“java” contentType=“text/html”;charset=“UTF-8” pageEncoding=“UTF-8”%>
Servlet:在Java代码中嵌入html(擅长编写Java代码); jsp:在html中嵌入Java代码(擅长页面显示)。
JSP的工作模式是请求/响应模式,其运行过程如下:(JSP文件→Servlet文件→.class文件)
①客户端发出请求,请求访问JSP文件;
②JSP容器会先将Jsp文件转换成一个Java Servlet源程序(并检查有无错误?有错则返回错误信息)
③JSP容器将转换成功的Java Servlet文件编译为字节码文件(.class文件)。该文件就是一个Servlet。
总结:JSP就是Servlet。
JSP脚本元素(是指嵌套在<% 和 %>之间的一条或多条Java程序代码。)主要包含三种:
JSP Scriptlets:<% java代码 %>
JSP声明语句:<% 定义变量或方法 %>
JSP表达式:<%=expression %>
JSP指令主要包含三种:
page指令:<% page 属性名=“属性值1” 属性名=“属性值2” …%> 用于描述JSP页面特性
include指令:<%@ include file=“被包含的文件地址”%> 用于JSP页面包含一个文件(静态包含)
taglib指令:<%@ taglib uri=“标签库地址” prefix=“前缀”%> 用于引入(jstl、struts2)标签库
静态包含和动态包含的区别:
静态包含:<%@ include file=""%> 当前页面和被包含的页面,合并后生成一个Servlet源码。
动态包含:
JSP内置对象(9个):
out 用于页面输出
request 得到用户请求信息
response 服务器向客户端的响应信息
config 服务器配置初始化参数
session 保存用户信息
application 保存所有用户的共享信息
page 当前页面转换后的Servlet类的实例
pageContext JSP页面容器
exception 异常
pageContext对象:它不仅提供了获取其它8个隐式对象的方法,还提供了存储数据的功能(通过操作属性)
它的作用范围有4个值: 描述 作用域名称 域对象类型
pageContext.PAGE_SCOPE 表示页面范围 pageContext PageContext
pageContext.REQUEST_SCOPE 表示请求范围 request HttpServletRequest
pageContext.SESSION_SCOPE 表示会话范围 session HttpSession
pageContext.APPLICATION_SCOPE 表示Web应用程序范围 application ServletContext
day8–JSP模式&EL&jstl
EL(Express Lanuage):一种简单的数据访问语言。目的:为了使JSP写起来更加简单。
EL最主要的作用是获得四大域中的数据,格式: 表 达 式 E L 获 得 p a g e C o n t e x t 域 中 的 值 : { 表达式 } EL获得pageContext域中的值: 表达式EL获得pageContext域中的值:{pageScope.key};
EL获得request域中的值: r e q u e s t S c o p e . k e y ; E L 获 得 s e s s i o n 域 中 的 值 : {requestScope.key}; EL获得session域中的值: requestScope.key;EL获得session域中的值:{sessionScope.key};
EL获得application域中的值:${applicationScope.key};
EL内置对象(11个)
pageScope,requestScope,sessionScope,applicationScope ---- 获取JSP中域中的数据
param,paramValues ---- 接收参数。相当于request.getParameter()、request.getParameterValues()
header,headerValues ---- 获取请求头信息。相当于request.getHeader(name)
initParam — 获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)
cookie ---- WEB开发中cookie。相当于request.getCookies()、cookie.getName()、cookie.getValue()
pageContext ---- WEB开发中的pageContext。 pageContext获得其他八大对象
jstl(JSP Standard Tag Library)JSP标准标签库,可以嵌入在jsp页面中使用标签形式完成业务逻辑等功能。
使用taglib指令导入Core(核心)标签库:
<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
在JSP文件中使用这个标签库某个标签时,都必须加这个前缀。eg:
Core标签库:if标签
body cntent
Core标签库:forEach标签
body cntent
MVC设计模式:一种软件架构模式,是一种分离业务逻辑与现实界面的设计方法。
Controller控制器(Servlet):对请求进行处理,负责请求转发。
View视图(JSP):图形界面设计。
Model模型(JavaBean):编写程序应用功能、实现算法、数据库管理等。
(MVC是理论基础,实际开发用如下分层模式)
经典三层体系架构:表示层(web)、业务逻辑层(service)、数据访问层(dao)
表示层:又称web层,与浏览器进行数据交互。
业务逻辑层:又称service层,专门用于处理业务数据。
数据访问层:又称dao层,与数据库进行数据交换。(负责将数据库的一条记录与JavaBean进行对应)
day9–JDBC案例-条件&分页
条件查询原理: web层 service层 dao层
1.获取用户输入的数据; 1.接收wen层的实体对象 1.接收service层的数据
2.将输入数据封装为实体Bean; 2.完成业务查询 2.sql拼写,完成DB查询
3.传递实体对象给service层; 3.将数据传给dao层 (难点:sql怎么写.因为条件不固定)
分页查询sql:格式:select * from table limit ?,?;
参数1:startIndex
参数2:pageSize 其中:startIndex = (pageNumber-1)*pageSize
eg:select * from table limit 10,5; //第3页,每页显示5条。
day10–监听器
监听器(listener)就是监听某个对象的的状态变化的组件。
8个监听器(6+2):
ServletContext域 HttpSession域 ServletRequest域 (6个)
域对象的创建与销毁 xxxxxxxListener
域对象的属性变化 xxxxxxxxxxxxxxxAttributeListener
生命周期 ServletContext域 HttpSession域 ServletRequest域
何时创建 服务器启动创建 第一次调用request.getSession时创建 每一次请求都会创建
何时销毁 服务器关闭销毁 服务器关闭销毁;session过期;手动销毁 请求结束
监听器的编写步骤(重点):
a、编写一个监听器类实现listener接口
b、覆盖监听器的方法
c、需要在web.xml中进行配置—注册
另外两个特殊监听器(无需配置web.xml)
绑定与解绑的监听器HttpSessionBindingListener;钝化与活化的监听器HttpSessionActivationListener
邮箱服务器:
接受邮件的协议:POP3(110) IMAP
发送邮件的协议:SMTP(25)
day11–过滤器
过滤器(filter)是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理。(实现对请求资源的过滤功能。可以检查请求信息,也可以处理响应信息)
Filter的作用? 应用场景:自动登录、解决全站乱码、屏蔽非法文件、进行响应数据压缩等
1)公共代码的提取
2)可以对request和response中的方法进行增强(装饰者模式/动态代理)
3)进行权限控制
eg:自动登录原理:
①用户登录成功后,如果之前勾选了自动登录,则会使用cookie记录用户信息(以“用户名@密码”形式);
②当用户第二次访问首页时,编写的过滤器来处理浏览器中cookie记录的用户信息,实现自动登录。
eg:解决乱码问题原理:
过滤器Filter
执行前处理请求(定义编码形式)
放行
执行前处理响应数据
过滤器的编写步骤(重点):
a、编写一个过滤器类实现Filter接口
b、实现接口中尚未实现的方法(着重实现doFilter方法)
c、在web.xml中进行配置(主要是配置要对哪些资源进行过滤)
Filter的API
1)init(FilterConfig) 2)destory()方法 3)doFilter方法
Filter对象的生命周期:
Filter何时创建:服务器启动时就创建该filter对象
Filter何时销毁:服务器关闭时filter销毁