自用JAVAweb笔记

实现Servlet服务器

一般使用继承HttpServlet 类的方式去实现Servlet程序

1.编写一个类去继承HttpServlet 类
2.根据业务需要重写doGet或doPost方法
doGet在get请求时调用
doPost在Post请求时调用
3.到Web.xml中的配置Servlet程序的访问地址
和之前一个
自定义的类继承 Class HttpServlet
Class HttpServlet 继承 Class GenericServlet
Class GenericServlet(实现了接口 有很多空接口) 实现了Interface Servlet(负责定义Serblet程序的访问规范) 接口

ServletConfig 类

作用
1.可以获取Servlet程序别名 Servlet-name的值 servletConfig.getservletname()
2.获取初始化参数 ini-param(初始化参数在xml文件里配置)
<init -param>
username //参数名
root //参数值

servletconfig.getInitParamter(name: );

3.获取ServiceContext对象(get)

每个ServletConfig只能获取自己那个初始化的值

4. ServletContext 类 (视频里是从doGet方法里使用的) 可以理解为一个工程只有一个 地址也相同 存的数据也相同
是一个接口,表示Servlet上下文对象
一个工程只有一个,是一个域对象
域对象,是可以像Map一样存取数据的对象,叫域对象
这里的域指的是存取数据的操作范围
存数据 取数据 删除数据

Map put() get() remove()
域对象 setAttribute getAttribute() removeAttribute()

四个作用
1.获取Web.xml配置中上下文参数 getInitParameter()
2.获取当前的工程路径getContextPath()
3.获取工程部署后在服务器磁盘上的绝对路径getRealPath(“/”)

4.像map一样存取数据 操作范围 整个Web工程 在部署的时候生成 停止的时候销毁
获取ServletConntext对象 getServletContext();]

Http 协议

什么是协议? 协议是指双方或多方相互约定好,互相遵守的规则

Http协议 指客户端和服务器之间通信时,发送的数据,需要遵守的规则
其中的数据叫报文

客户端给服务器发送的叫请求
服务器给客户端返回叫响应
请求分为 Get 和Post

Get
1.请求行
(1) 请求的方式
(2) 请求的资源路径
3)请求协议的版本号
2.请求头
key : value 组成 不同的键值对,表示不同的含义

Post 请求
1.请求行
2.请求头
空行
3.请求体

常用请求头
1.Accept 表示客户端可以接收的数据类型
2.Accecp-language 表示客户端可以接收的语言类型
3 user-agent表示客户端浏览器的信息
4.Host 表示请求时的服务器的IP和端口号

Get请求有哪些

  1. form 标签 method=get
    2.a 标签
  2. link标签引入css
  3. Script 标签引入js文件
    5.img标签引入图片
    6.iframe 引入 html 页面
    7.在浏览器地址栏输入地址后回车

Post请求有哪些
form 标签 method = post

响应HTTP协议格式
1.相应行
(1)响应的协议和版本号
(2)响应状态码、
常见响应码
200 请求成功
302请求重定向
404请求服务器已经收到了,但你要的数据不存在 (请求地址有误)
500 表示服务器已经收到请求,但是服务器内部错误

(3)响应状态描述符
2.响应头
key: value

空行
3.响应体 - 回传给客户端的数据

MIME 是HTTP协议中的数据类型

HttpServletRequest 类

每次只要有请求进入Tomacat服务器就会把请求过来的HTTP协议解析好封装到Request 对象中 然后传递到Service(doget,dopost 中给我们使用,
我们可以通过HttpServletRequest 对象,获取到所有请求的信息。

常用方法 1.getRequestURI() 获取请求的资源路径
2.getRequestURL() 获取请求的统一资源定位符(绝对路径)
3.getRequestHost( ) 获取客户端的IP
4.getHeader() 获取请求头
5.getParameter() 获取请求的参数 (获取用户输入的账号密码啥的 多选的时候用下面那个)
6.getParameterValues() 获取请求的参数(多个值的时候使用)
7.getMethod() 获取请求的方式GET or POST
8.setAttribute(key,value); 设置域数据
9.getAttribute(key); 获取域数据
10.getRequestDispatcher() 获取请求转发对象

打印数组 Arrays.asList(hobby)

请求转发

服务器收到请求后,从一次资源跳转到另一个资源
特点: 1.浏览器地址栏没有变化
2,是一次请求
3.共享Request域中数据
4.可以转发到WEB-IN目录
5.不可以跳转到工程以外

  public class CheckLoginServlet extends HttpServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("登录成功");
    
    req.getRequestDispatcher("/direct/index").forward(req,resp);
}

一般base标签放在 <1tittle><1/ittle>标签下面 1是后加的不显示QAQ
在这里插入图片描述

Web中/斜杠的不同意义

/斜杠 如果被浏览器解析 ,得到的地址是 : http://ip:port/
<1a href =“/”>
以下是为什么使用base标签
在这里插入图片描述

/斜杠如果被服务器解析,得到的是: http://ip:poor/工程路径
映射到 WEB目录下

HttpServletResponse类

HttpServletResponse类每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,HttpServletRequest表示请求过来的
信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。

两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWrite(); 常用于回传字符串(常用)
两个不能同时使用,否则出错

如何往客户端返回字符串
PrintWriter w = resp.getWriter();
w.wwrite(“aaa”);
返回中文可能乱码 默认ISO-8859-1
resp.setCharacterEncoding(“UTF-8”)
这样还不正常 浏览器默认编码GBK
设置响应头 该浏览器编码

     resp.setHeader("Content-Type","text/html;charset=UTF-8" );

第二种方法
resp.setContentType("text/html;charset=UTF-8")//此方法必须在获取流之前才有效

请求重定向

指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些新地址,你去新地址访问,叫请求重定向
(因为之前的地址可能已经废弃了)
设置相应码302,表示重定向
resp.setStatus(302);
//设置响应头说明新的地址
resp.setHeader(“Location”,“新的地址”)

请求重定向特点

客户端行为。一般用于避免用户的非正常访问。例如:用户在没用登录的情况下访问后台资源,servlet可以将该http请求重定向到登录页面,让用户登陆后再访问。通过调用response.sendRedirect(arg0)实现,从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的url会改变。
1.浏览器地址会发生变化
2.两次请求
3.不共享域数据
4.不能进入WEB-INF下的资源
5.可以访问外站地址,工程外的资源
请求重定向第二种 方法 推荐使用
resp.sendReadirect(“新的地址”);

JSP
page 指令
1.language 表示支持什么语言
2 contentType 表示返回的数据类型
3.pageEncoding 当前页面本身的字符集
4.import 用于导包
以下两个属性给OUT输出流
5.autFlush 当out缓存区满了后,是否自动刷新缓冲区
6.buffer 设置缓存区大小
7.errorPage 当出现页面错误后自动跳转的路径 一般以/打头
8.isErrorPage 设置当前JSP页面是否是错误信息页面
9.session 设置访问当前JSP页面
10.extends. 设置JSP翻译出来的JAVA类默认继承谁

<%!%> 声明脚本
<%=“”%>可以打印在页面 表达式脚本
<%%> 代码脚本 写JAVA语句

JSP九大内置对象

1.request 请求对象
2.response 响应对象
3.pageContext JSP的上下文对象
4.session 会话对象
5.application ServletContext对象
6.config ServletConfig对象
7.out jsp输出流对象
8.page 指向当前的JSP对象
9.exception 异常对象

jsp 四大域对象

1.pageContext(PageContextimpl类) 当前JSP页面有效pageContext.setAttribute(“key”,“数据”);
2.request (HttpServletRequest类) 一次请求有效
3.session (HttpSession类) 一个会话范围内有效(打开浏览器,直到关闭浏览器)
4.application(ServletContext类)整个WEB工程范内都有效(只要WEB工程不停止,数据都在)
在jsp页面可以直接使用application对象, 在servlet中却不能直接使用,

这如何是好呢?在servlet 中使用application方法如下:

this.getServletContext().setAttribute(“user”,“123456”);


域对象是可以像MAP一样存取数据的对象,功能一样,存取范围不一样

虽然四个域对象都可存取数据,在使用上它们是由优先顺序的,
四个域在使用的时候,优先顺序分别是,他们从小到大的范围顺序 一个不能用换一个
占用内存

jsp 中的out 输出和 response.getWriter输出的区别
response 中表示响应。常用于设置返回爱给客户端的内容 response.getWrite().write()
out 也是给用户做输出使用的
同时在的时候先执行response
执行out.flush()操作时会把out缓冲区的数据追加写入response缓冲区末尾
2.会执行response的刷新操作,把全部数据写给客户端

在JSP页面一般情况下out输出
out.write()输出字符串没有问题 输出整型有问题
out.print()输出任何没有问题 因为 全都转成了字符串调用write

jsp静态标签

一个单独的JSP页面 只维护一份,改一处,其他都改变
<%@ include file"/"!%> file 属性指定你要包含的JSP页面路径 到 /映射到代码的WEB目录

特点
1.静态包含不会翻译被包含的JSP页面
2.静态包含其实是把被包含的JSP页面的代码拷贝到包含的位置执行输出

动态包含 <jsp:include page=“”></jsp:include> 和静态包含效果一样 底层原理不同
动态包含可以传递参数

请求转发

<jsp:forward page=“”></jsp:forward> 请求转发标签

ServletContextListener 它可以监听 ServletContext对象的创建和销毁
ServletContext对象在Web工程启动的时候创建,在WEb工程停止的时候销毁
监听到创建和销毁之后都会分别调用ServletContextListener监听器方法反馈
两个方法分别是

在ServletContext对象创建之后马上调用 做初始化
public interface ServletContextListener extends EventListener{}

在ServletContext对象销毁之后调用
public void contextInitialized(ServletContextEvent sce);

使用步骤 1.编写一个类去实现SServletContext接口
2.实现其两个回调方法
3.到WEB.xml去配置

EL表达式

主要是用来输出数据(域对象中的数据)

全称 :Expression Language 。是表达式语言
作用:代替jsp页面中的表达式脚本在jsp页面中进行数据的输出
EL更简洁
输出表的表达式 ${表达式 } 输出为null的时候输出空 对用户更加友好
当四个域中都有相同key的数据的时候,EL表达式会按照四个域的从小到大的顺序去搜索 找到就输出

  输出类中的值没有get方法无法输出   

EL表达式运算 截图了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

empty 运算 判断一个数据是否为空,如果为空 输出true 不空 fakse
一下情况为空
1.值为null值的时候为空
2.值为空串的时候为空
3.值是Object类型数组,长度为零的时候
4.list集合,元素个数为零
5.map集合 ,元素个数为零
三元运算支持

EL表达式中11 个隐含对象 可以直接使用
变量 类型 作用
pageContext PageContextlmpl 可以获取jsp九大内置对象

pageScope MAP<String,Object> 可以获取pageContext域中数据

requestScope MAP<String,Object> 可以获取Request域中数据

sessionScope MAP<String,Object> 可以获取session域中数据

applicationScope MAP<String,Object> 可以获取servletContext域中数据

param MAP<String,Object> 可以获取请求参数的值

paramValues MAP<String,Object> 可以获取请求参数的值,获取多个值的时候使用

header MAP<String,Object> 可以获取请求头的信息

headerValues MAP<String,Objec> 可以获取请求头的信息,可以获取多个值的情况

cookie MAP<String,Object> 可以获取当前请求的Cookie信息

initParm MAP<String,Object> 它可以获取在web.xml中配置的<context_param>上下文参数他
在这里插入图片描述
在这里插入图片描述

第二到第五主要用于域中关键词一样的情况下 例如${requestScope.key}
本来都是用request实现的 如 <%=request.getSererName()%>
pageContext
1.协议 p a g e C o n t e x t . r e q u e s t . s c h e m 2. 服 务 器 {pageContext.request.schem} 2.服务器 pageContext.request.schem2.{pageContext.request.serverName}
3.服务器端口 p a g e C o n t e x t . r e q u e s t . S e r v e r P o r t 4. 获 取 工 程 路 径 {pageContext.request.ServerPort} 4.获取工程路径 pageContext.request.ServerPort4.{pageContext.request.contexPath}
5.获取请求方法 p a g e C o n t e x t . r e q u e s t . M e t h o o d 6 获 取 客 户 端 i p 地 址 {pageContext.request.Methood} 6获取客户端ip地址 pageContext.request.Methood6ip{pageContext.request.remoteHost}
7获取会话的id编号${pageContext.session.id} 本来是<%= session.getID()%>

简洁写法 PageContext.setAttrbute(“req”,rquest);
直接 ${req.scheme }

注意:EL表达式默认调用方法的get方法

**JSTL标签库**
使用步骤
1.先导入JSP标签库的jar包
2.使用taglib指令引入标签库                  
 scope 表示保存到哪个域     不写默认page域  var 表示设置key是多少 value 值是多少
<c:set/> 作用set 标签可以往域中保存数据 <c:set scope="page" var="key" value="abcd"/>
输出的时候分别是   requestScope.   pageScope.      sessionScope.       

在这里插入图片描述

<c:if>标签   用来做if判断   test属性表示判断的条件(使用EL表达式输出)
  <c:if test "${12!=12}">      判断为真输出 否则不输出
    <h1>12等于12<h1>
    </c:if> 
       
  <c:choose>   <c:when>    <c:otherwise> 标签 跟JAVA中switch case 很相似
  
 <c:choose>
 <c:when test=${requestScope.key}>190}>
   <h2>小巨人</h2>
   </c:when>
 <c:otherwise>
   <h2>其他情况</h2>
  </c:otherwise>
 </c:choose>

注意: 标签里不能有html注释 可以使用jsp注释
when 标签想在otherwise里面继续用的话必须加 在choose标签里面

  <c:forEach>   遍历循环输出  

例子 输出1-10 <c:forEach begin=“1” end=“10” var=“i’> i < / c : f o r E a c h > 遍 历 数 组 中 的 值 域 中 已 有 数 组 域 中 存 数 组 < < c : f o r E a c h i t e m s = " {i} </c:forEach> 遍历数组中的值 域中已有数组 域中存数组 <% request.setAttribute("key",new String[]{"1","2","3"}) %> <c:forEach items =" i</c:forEach><<c:forEachitems="{requestScope.arr}” var=“i”></c:forEach>

文件的上传和下载 (重点)。
1.要有一个form标签,method=post请求
2 form标签属性 encType 属性值必须为multipart/form-data值
3.在form标签中使用input type= file 添加上传的文件
4.编写服务器代码(暂时使用Servlet)接收,处理上传的数据
服务器只能以流的形式接收 那个getParamter 就不行了
接收 ServletInputStream s= req.getInputStream();
byte[] buffer = new byte[1024];
int read = s.read(buffer);
System.out.println(new String(buffer,0,read));
解析
1.导入两个包 包中的类
ServletFileUpload类,用于解析上传的数据
Fileltem类,表示每一个表单项
boolean Servlet FileUpload.isMultipartContent(HttpServletRequest request);
判断当前上传的数据格式是否是多段的格式。
public ListparseRequest(HttpServletRequest,request)
解析上传的数据
boolean FileItem.isFormFiled()
判断当前这个表单项,是否是普通的表单项还是上传的文件类型。
true 表示普通的表单项
false 表示上传的文件类型
String FileItem.getFieldName() 获取表单项的name 属性值

String FileItem.getString(); 获取当前表单项的值
String FileItem.getName(); 获取上传的文件名
void FileItem,write(file); 将上传的文件写到 参数file所指向磁盘的位置
解析 上传文件

1.判断上传的数据是否是多段数据 (只有是多段的数据,才是文件上传的)
成功了 但是非常复杂 再次做的时候看看b站的视频
//判断上传的数据是否为多段
if(ServletFileUpload.isMultipartContent(req)){
//创建工厂实现类
FileItemFactory fileItemFactory =new DiskFileItemFactory();
//创建用于解析上传数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload =new ServletFileUpload(fileItemFactory);
servletFileUpload.setHeaderEncoding(“UTF-8”);
req.setCharacterEncoding(“UTF-8”);
try {//解析上传的数据 得到每一个表单项FileItem
List list =servletFileUpload.parseRequest(req);

	for(FileItem fileItem:list)
	{//循环判断,每一个表单项 是普通类型,还是上传的文件
		 if(fileItem.isFormField())
		 {
			 System.out.println("表单项的name属性值"+fileItem.getFieldName());
			 System.out.println("表单项的value属性值"+fileItem.getString("UTF-8"));
		 }
		 else{//上传的文件
			System.out.println("上传的文件名"+fileItem.getName());
			fileItem.write(new File("d:/666/"+fileItem.getName()));				 
		 }

下载文件
1,客户端发请求,告诉服务器我要下载什么文件,
2,服务器获取要下载的文件名
3,读取要下载的文件内容
4.再回传前 通过响应头告诉客户端返回的数据类型
5.还要告诉护短收到的数据是用于下载使用(还是使用响应头)

cookie

1.cookie 是服务器通知客户端保存键值对的一种技术
2.客户端有了cookie 后 每次请求都发送给服务器
3.每个cookie的大小不能超过4kb

Filte过滤器

总结的很详细
是JAVAWEB三大组件之一 三大组件分别是 Servlet程序 Listener监听器 Filter过滤器
2 Filter是javaee的规范 也就是接口
3.作用是 拦截请求,过滤响应
拦截请求常见的应用场景
1.权限检查
2.日记操作
3.事务管理
例如 : 要求在你的WEB工程目录下 有一个admin目录,这个目录下的资源必须用户登录才能访问

用户登录后会把信息保存到Session域中,检查用户是否登录,可以判断Session中是否包含有用户登录的信息即可。
//专门用于拦截请求过滤访问
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
HttpServletRequest h =(HttpServletRequest) arg0;
HttpSession s=h.getSession();
Object user =s.getAttribute(“user”);
//说明还没有登录
if(user==null)
{
arg0.getRequestDispatcher(“”).forward(arg0, arg1);
return ;
}
else{
//让程序继续运行
arg2.doFilter(arg0, arg1);
}
}

用户访问资源前 Filter可以检查权限
1.写一个类实现Filter接口
2.实现doFilter 拦截方法
3.到web.xml配置拦截路径

名称
哪个个包下哪个实现接口类


给哪个filter配置拦截路径
/ 拦截哪个

Filter 的生命周期包含几个方法
1.构造器方法
2.init初始化方法
第一第二部在 web工程启动的时候执行
3.doDilter 方法
在每次拦截到请求的时候执行
4.destroy销毁
停止web工程的时候,就会执行(停止WEB工程,也会销毁Filter过滤器)

FilterConfig 类
见名知义,它是Filter 过滤器的配置文件夹
Tomacat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息
FilterConfig类的作用是获取filter过滤器的配置内容
1,获取Filter的名称 filter-name 的内容 filterConfig.getfiltername() 在init方法里

public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
filterConfig.getFilterName();
}
也就是获取的WEB.xml里配置的信息
2.获取在web.xml中配置的init-param初始化参数


root</para,-value>

filterConfig.getInitParamter(“想要获取的参数名”);

3.获取ServletContext对象
filterConfig.getServletContext()

FilterChain 过滤器 是让程序往下走的不是停止的意思
Filter 过滤 Chain 链条 FilterChain 过滤器链(多个过滤器怎么同时工作)
FilterChain.doFilter()方法的作用
1.执行下一个Filter过滤器(如果有的话)
2.执行目标资源(如果没有Filter的话)

在这里插入图片描述
filterChain.doFilter 方法前的是前置 方法后面的是后置

在多个Filter过滤器执行的时候,它们的优先数序是他们在WEB.xml中从上到下配置的顺序决定。
多个Filter过滤器执行的特点
1.所有filter过滤器和目标资源都执行在同一个线程中
2.多个Filter 共同执行的时候,他们都是用同一个request对象。(一次请求,一次响应),所以request里面的数据相同
在这里插入图片描述
在这里插入图片描述
FIlter 拦截匹配

在这里插入图片描述
在这里插入图片描述
后缀名匹配不能以/开头
Filter过滤只关系请求的地址是否匹配,不关系请求的资源是否存在

Cookie

Cookie 是服务器通知客户端保存键值对的一种技术
客户端有了Cookie后 每次请求都发给服务器
每个Cookie的大小不能超过4kb

Cookie的创建
1.创建Cookie对象
Cookie cookie = new Cookie(“key1”,“value1”);
2.通知客户端保存Cookie
response.addCookie(cookie);

服务器获取客户端的Cookie 只需一行代码: req.getCookies():

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值