一、Servlet

1.1 简介


1.2 HelloServlet




package com.zhu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {//设置响应类型response.setContentType("text/html");//获取响应的输出流PrintWriter out = response.getWriter();out.println("<html>");out.println("<head>");out.println("<title>Hello World!</title>");out.println("</head>");out.println("<body>");out.println("<h1>Hello World!</h1>");out.println("</body>");out.println("</html>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}![在这里插入图片描述](https://img-blog.csdnimg.cn/69a8f59bb9b44ec99315a7677e336e17.png)

二、GenericServlet

直接实现Servlet的缺点:要实现很多无用方法

三、ServletConfig




四、ServletContext




package com.zhu.config;import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;public class ContextTest extends GenericServlet {@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {res.setContentType("text/html");res.setCharacterEncoding("utf-8");PrintWriter writer = res.getWriter();//获取ServletContext对象ServletContext application = this.getServletContext();writer.print("servletContext对象为:" + application + "<br>");//获取上下文的初始化参数Enumeration<String> initParameterNames = application.getInitParameterNames();while (initParameterNames.hasMoreElements()){String name = initParameterNames.nextElement();writer.print("ServletContext初始化参数" + name + "值为" + application.getInitParameter(name) + "<br>");}//获取应用根路径,此处为/s3,既application contextString contextPath = application.getContextPath();writer.print("应用根路径为:" + contextPath + "<br>");//获取文件绝对路径,入参为相对web根的相对路径;其实就是把web根的绝对路径和入参进行拼接String realPath = application.getRealPath("/index.jsp");writer.print("文件绝对路径为:" + realPath + "<br>");}
}


五、HttpServlet




六、HttservletRequest



请求转发

其他常用方法

// 获取客户端的IP地址
String remoteAddr = request.getRemoteAddr();// get请求在请求行上提交数据。
// post请求在请求体中提交数据。
// 设置请求体的字符集。(显然这个方法是处理POST请求的乱码问题。这种方式并不能解决get请求的乱码问题。)
// Tomcat10之后,request请求体当中的字符集默认就是UTF-8,不需要设置字符集,不会出现乱码问题。
// Tomcat9前(包括9在内),如果前端请求体提交的是中文,后端获取之后出现乱码,怎么解决这个乱码?执行以下代码。
request.setCharacterEncoding("UTF-8");// 在Tomcat9之前(包括9),响应中文也是有乱码的,怎么解决这个响应的乱码?
response.setContentType("text/html;charset=UTF-8");
// 在Tomcat10之后,包括10在内,响应中文的时候就不在出现乱码问题了。以上代码就不需要设置UTF-8了。// 注意一个细节
// 在Tomcat10包括10在内之后的版本,中文将不再出现乱码。(这也体现了中文地位的提升。)// get请求乱码问题怎么解决?
// get请求发送的时候,数据是在请求行上提交的,不是在请求体当中提交的。
// get请求乱码怎么解决
// 方案:修改CATALINA_HOME/conf/server.xml配置文件
<Connector URIEncoding="UTF-8" />
// 注意:从Tomcat8之后,URIEncoding的默认值就是UTF-8,所以GET请求也没有乱码问题了。// 获取应用的根路径
String contextPath = request.getContextPath();// 获取请求方式
String method = request.getMethod();// 获取请求的URI
String uri = request.getRequestURI();  // /aaa/testRequest// 获取servlet path
String servletPath = request.getServletPath(); //   /testRequest


转发和重定向





注解式开发


七、JSP



JSP基础语法




八、Session机制

  • 什么是会话?

    • 会话对应的英语单词:session
    • 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。会话在服务器端也有一个对应的java对象,这个java对象叫做:session。
    • 什么是一次请求:用户在浏览器上点击了一下,然后到页面停下来,可以粗略认为是一次请求。请求对应的服务器端的java对象是:request。
    • 一个会话当中包含多次请求。(一次会话对应N次请求。)
  • 在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)

  • session机制属于B/S结构的一部分。如果使用php语言开发WEB项目,同样也是有session这种机制的。session机制实际上是一个规范。然后不同的语言对这种会话机制都有实现。

  • session对象最主要的作用是:保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)

  • 为什么需要session对象来保存会话状态呢?

    • 因为HTTP协议是一种无状态协议。
    • 什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就断了。为什么要这么做?HTTP协议为什么要设计成这样?因为这样的无状态协议,可以降低服务器的压力。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。
    • 只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?
      • 不知道。服务器是不知道浏览器关闭的。
  • 张三打开一个浏览器A,李四打开一个浏览器B,访问服务器之后,在服务器端会生成:

    • 张三专属的session对象
    • 李四专属的session对象
  • 为什么不使用request对象保存会话状态?为什么不使用ServletContext对象保存会话状态?

    • request.setAttribute()存,request.getAttribute()取,ServletContext也有这个方法。request是请求域。ServletContext是应用域。
    • request是一次请求一个对象。
    • ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个。
    • ServletContext对象的域太大。
    • request请求域(HttpServletRequest)、session会话域(HttpSession)、application域(ServletContext)
    • request < session < application
  • 思考一下:session对象的实现原理。

    • HttpSession session = request.getSession();
    • 这行代码很神奇。张三访问的时候获取的session对象就是张三的。李四访问的时候获取的session对象就是李四的。
  • session的实现原理:

    • JSESSIONID=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的。浏览器只要关闭。这个cookie就没有了。
    • session列表是一个Map,map的key是sessionid,map的value是session对象。
    • 用户第一次请求,服务器生成session对象,同时生成id,将id发送给浏览器。
    • 用户第二次请求,自动将浏览器内存中的id发送给服务器,服务器根据id查找session对象。
    • 关闭浏览器,内存消失,cookie消失,sessionid消失,会话等同于结束。
  • Cookie禁用了,session还能找到吗?

    • cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要了。拒收了。并不是服务器不发了。
    • 找不到了。每一次请求都会获取到新的session对象。
    • cookie禁用了,session机制还能实现吗?
      • 可以。需要使用URL重写机制。
      • http://localhost:8080/servlet12/test/session;jsessionid=19D1C99560DCBF84839FA43D58F56E16
      • URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分的网站都是这样设计的:你要是禁用cookie,你就别用了。

        jsp会自动创建session对象,可以手动禁用

九、Cookie机制





package com.zhu.javaweb.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/cookie/receive")
public class ReceiveCookie extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();System.out.println(name + "=" +value);}}}
}

删除cookie的时候注意路径和原来的要一致,否则无法删除!!!

十、JSP指令和九大内置对象

<%@page session="true|false" %>
true表示启用JSP的内置对象session,表示一定启动session对象。没有session对象会创建。
如果没有设置,默认值就是session="true"
session="false" 表示不启动内置对象session。当前JSP页面中无法使用内置对象session。<%@page contentType="text/json" %>
contentType属性用来设置响应的内容类型
但同时也可以设置字符集。
<%@page contentType="text/json;charset=UTF-8" %><%@page pageEncoding="UTF-8" %>
pageEncoding="UTF-8" 表示设置响应时采用的字符集。<%@page import="java.util.List, java.util.Date, java.util.ArrayList" %>
<%@page import="java.util.*" %>
import语句,导包。<%@page errorPage="/error.jsp" %>
当前页面出现异常之后,跳转到error.jsp页面。
errorPage属性用来指定出错之后的跳转位置。<%@page isErrorPage="true" %>
表示启用JSP九大内置对象之一:exception
默认值是false。


十一、EL表达式


对应翻译

<%// 创建User对象User user = new User();user.setUsername("jackson");user.setPassword("1234");user.setAge(50);// 将User对象存储到某个域当中。一定要存,因为EL表达式只能从某个范围中取数据。// 数据是必须存储到四大范围之一的。request.setAttribute("userObj", user);
%><%--使用EL表达式取--%>
${这个位置写什么????这里写的一定是存储到域对象当中时的name}
要这样写:
${userObj}
等同于java代码:<%=request.getAttribute("userObj")%>
你不要这样写:${"userObj"}面试题:${abc} 和 ${"abc"}的区别是什么?${abc}表示从某个域中取出数据,并且被取的这个数据的name是"abc",之前一定有这样的代码: 域.setAttribute("abc", 对象);${"abc"} 表示直接将"abc"当做普通字符串输出到浏览器。不会从某个域中取数据了。${userObj} 底层是怎么做的?从域中取数据,取出user对象,然后调用user对象的toString方法,转换成字符串,输出到浏览器。<%--如果想输出对象的属性值,怎么办?--%>
${userObj.username} 使用这个语法的前提是:User对象有getUsername()方法。
${userObj.password} 使用这个语法的前提是:User对象有getPassword()方法。
${userObj.age} 使用这个语法的前提是:User对象有getAge()方法。
${userObj.email} 使用这个语法的前提是:User对象有getEmail()方法。
EL表达式中的. 这个语法,实际上调用了底层的getXxx()方法。
注意:如果没有对应的get方法,则出现异常。报500错误。${userObj.addr222.zipcode}
以上EL表达式对应的java代码:
user.getAddr222().getZipcode()



十二、JSTL标签库


JSTL标签的原理

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
以上uri后面的路径实际上指向了一个xxx.tld文件。
tld文件实际上是一个xml配置文件。
在tld文件中描述了“标签”和“java类”之间的关系。
以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。

源码解析:配置文件tld解析

<tag><description>对该标签的描述</description><name>catch</name> 标签的名字<tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class> 标签对应的java类。<body-content>JSP</body-content> 标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式。<attribute><description>对这个属性的描述</description><name>var</name> 属性名<required>false</required> false表示该属性不是必须的。true表示该属性是必须的。<rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。</attribute></tag><c:catch var="">JSP....
</c:catch>

jstl中的核心标签库core当中有哪些常用的标签呢?

- c:if- <c:if test="boolean类型,支持EL表达式"></c: if>
- c:forEach- <c:forEach items="集合,支持EL表达式" var="集合中的元素" varStatus="元素状态对象"> ${元素状态对象.count} </c: forEach>- <c:forEach var="i" begin="1" end="10" step="2"> ${i} </c: forEach>
- c:choose c:when c:otherwise



<c:choose><c:when test="${param.age < 18}">青少年</c:when><c:when test="${param.age < 35}">青年</c:when><c:when test="${param.age < 55}">中年</c:when><c:otherwise>老年</c:otherwise>
</c:choose>

十三、Filter过滤器


十四、Listener监听器








JavaWeb Day02(动力节点)相关推荐

  1. 2022年最新整理,动力节点Java自学全套资源

    今天整理了java开发的学习路线和相关的学习视频资源,非常适合零基础入门java的小伙伴,希望大家在学习的时候,能够节省时间. 这里有你需要掌握的所有前沿技术,史上最全的Java学习路线资源,从基础到 ...

  2. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day02.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day02.txt 1.关于查询结果集的去重? 2.连接查询 2.1.什么是连接查询? 2.2.连接查询的分类? 2.3.在表的连接查询方面有一种现 ...

  3. 动力节点-javaweb项目入门到实战教程-下

    继续上文的内容,are you ready?let's go !!! 熟悉的配方搭配精美的视频:动力节点最新JavaWeb视频教程,javaweb零基础入门到精通IDEA版-持续更新中_哔哩哔哩_bi ...

  4. 动力节点-javaweb项目入门到实战教程-上

    Java Web,是用Java技术来解决相关web互联网领域的技术栈.web包括:web服务端和web客户端两部分.Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的 ...

  5. JavaWeb—监听器—Eclipse版动力节点学习笔记

    JavaWeb学习笔记 监听器 Listener 哔哩哔哩蛙课网[动力节点]JavaWeb-Eclipse版学习视频网址 解释 归属 备注 ServletRequestListener Request ...

  6. 动力节点『lol版』Java学习路线图(八)Java选学技术

    八.失落之地的辉煌 这里曾经繁华一片,被世人称作福光,搁在古老的东方就叫洞天福地!但现在一切都烟消云散,一场魔法灾难让此地化作焦土,沦为人间炼狱.此地长年被黑暗浓雾笼罩,即便世界被同化之后也没能改变土 ...

  7. 2022全新Java学习路线图动力节点(八)Java选学的技术有哪些?

    八.失落之地的辉煌 这里曾经繁华一片,被世人称作福光,搁在古老的东方就叫洞天福地!但现在一切都烟消云散,一场魔法灾难让此地化作焦土,沦为人间炼狱.此地长年被黑暗浓雾笼罩,即便世界被同化之后也没能改变土 ...

  8. 超全面的Java全套教程分享_动力节点完整版视频教程

    各种各样的编程语言不断崛起,但唯有Java是牢牢占据着老大的位置,目前几乎90%以上的大中型互联网应用系统在服务器端开发首选Java. 因此,也是吸引了不少年轻人投入到Java的学习之中. 但不得不说 ...

  9. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day01.txt 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQ ...

  10. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day03.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day03.txt 1.约束 1.1.唯一性约束(unique) 1.2.主键约束 1.3.外键约束 2.存储引擎?(整个内容属于了解内容) 2.1 ...

最新文章

  1. 想读博士?进来看看!
  2. postgresql-创建主键自增的表
  3. Netty--Reactor模式
  4. e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析
  5. 程序员常用编程工具: VS Code,那些你不得不知道的小知识!
  6. Php 取出session中的值,获取php值
  7. 图论:柯尼斯堡桥问题、艾科西亚游戏
  8. Oracle EBS:追踪PO全过程
  9. AcWing1075. 数字转换(树形DP)题解
  10. 图片涂改了怎么给复原_图片马赛克怎么去掉 怎么去除马赛克方法介绍
  11. 重庆计算机c语言二级成绩查询,历届重庆市计算机C语言二级考试试题及答案.pdf...
  12. SqList *L与SqList *L的区别
  13. 开源免费财务软件中文版GnuCash
  14. 关于IDEA的一些常用的快捷键整合,赶紧进来KK......
  15. 基于Lasso回归筛选变量构建Cox模型并绘制Nomogram
  16. PTA Huffman树及其应用题
  17. 3ds max捕捉工具教程_3DS Max教程的终极收藏
  18. 业务知识 - 行业笔记
  19. 我的开源项目从0到1024的过程
  20. VSPD虚拟串口工具——使用完一定要删除串口

热门文章

  1. linux smb 连上 断开,linux – 如何在客户端断开连接后阻止samba持有文件锁?
  2. Committer identity unknown *** Please tell me who you are...
  3. hooks useRef 报错object is possibly undefined
  4. main方法中窥世界
  5. ExecuteScaler的三种返回值
  6. 查看Oracle sys_lob,system表空间满的处理-SYS_LOB0003450292C00039$$
  7. C语言程序设计:猜数游戏
  8. pyhton学习之找出单词的个数并进行排序
  9. vue 省市区三级联动 antd 级联组件 Cascader
  10. DICOM:dcm4che开源项目导入Eclipse编译错误问题解决方案