Servlet-JAVA【笔记】
JAVA_WEBTomcattomcat工作流程servlet的生命周期ServletConfigServletContextHttpServletRequestHttpServletResponse前端提交的数据和请求域里的数据的区别应用域和请求域的区别如何做到两个servlet之间交流/共享数据请求转发和重定向区别注解开发版servlet3.0之后什么是会话sessionCookie禁用了session还能找到吗Cookiecookie有啥用JSPjavabeanEL表达式JSTL标签库原理常用的标签Filter 过滤器Listener监听器MVC架构模式原理项目实战(未完)Tomcattomcat是一款web应用服务器使用java语言写的安装后其目录下存在有大量的java文件还是我们熟悉的java。下面整理下大致流程tomcat工作流程1、服务器tomcat启动后看作一个永远不结束的main函数内部有死循环它的监听器会监听一个默认端口号8080在conf/server.xml文件中的Connector标签配置2、当有请求来浏览器端按下回车发送http请求底层创建socket与服务器建立链接-三次握手链接建立好后那么这个监听器会解析请求头浏览器端的地址包含在请求头里并封装成请求对象Request3、然后tomcat内部的一个Engine根据请求域名和请求路径里的项目名会匹配到部署在tomcat里的web应用注意web应用部署到tomcat里后可以理解有这样一个map项目路径作键部署的项目作为值4、tomcat找到具体的项目后就根据已经部署的项目的一个配置文件web.xml里的servlet类的入口路径再次和请求路径里项目后的路径进行匹配从而获取到XxxServlet类的全类名再通过反射机制创建xxxServlet对象并把创建的对象加入Map容器如果容器里没有接着调用该对象里的service方法注servlet对象创建后被tomcat用tomcat自己jarkata.servlet包下的Servlet接口来接受5、service方法处理完业务逻辑后生产出一个响应对象Response那么这个响应对象被Connector返回给客户端浏览器浏览器渲染后就能看到自己访问的资源。总结从上面得出一下几点1我们自己部署的项目不是随意放置一个位置的而是按照tomcat的要求放在指定目录下webapps2我们的项目必须包含一个配置文件web.xml且这个配置文件在自己的项目里有固定的目录位置不能随意移动否则tomcat找不到3servlet对象是单例的注意这里的单例不是指javase阶段里单例模式而是这个对象是tomcat的容器帮我们创建的且默认情况下只创建一个对象特殊情况需特殊配置来管理4tomcat里有一套自己的servlet接口和实现且在tomcat10及其以后这个套servlet被更名叫做jarkata.servlet,而不是老版的javax.servlet5被部署的项目的目录结构servlet的生命周期1服务器启动后默认不创建servlet对象当首次请求到达时自动创建servlet对象构造方法执行–init方法执行–service方法执行2当同一类的请求第2,3,4…100次到达时不会再创建新servlet对象仅service方法执行3当服务器关闭之前执行一次destory方法ServletConfig1servlet对象的配置信息对象2ServletConfig对象中封装了web.xml中标签的servlet配置信息3一个servlet对象对应一个ServletConfig对象也是在首次请求到达时tomcat创建的对象随着servlet创建而创建4常用方法记忆获取的是web.xml文件中的东西getInitParameter(String name)//通过初始化参数的name获取valuegetInitParameterNames//获取所有初始化参数的namegetServletContext//获取ServletContext上下文对象getServletName//获取servlet的nameServletContext1全局的上下文对象一个项目启动后对应一个该对象应用级对象2存全局数据、获取上下文路径 / 资源真实路径、读全局配置参数例如解决路径硬编码、实现跨 Servlet 数据共享且该对象里存储的数据一般是只读的且数据量小避免并发修改和内存被占用问题。3ServletContext对象在服务器启动阶段创建在关闭时销毁4该对象常用两个方法getInitParameter(String name)//根据name获取context-param标签的valuegetInitParameterNames//获取所有全局的标签namegetContextPath()//获取上下文路径重要输出/部署的项目名getRealPath(String path)//根据传入的相对路径返回该资源在项目中的绝对路径log(参1参2)这是一个记录日志的方法日志内容会记入tomcat的logs目录下注以上的配置信息属于应用级的配置信息一般一个项目中共享的配置信息会放到以上的标签当中如果你的配置信息只是想给某一个servlet作为参考那么你配置到servlet标签当中即可HttpServletRequestHttpServletRequest对象中封装了什么信息HttpServletRequest简称request对象。HttpServletRequest中封装了请求协议的全部内容。Tomcat服务器WEB服务器将“请求协议”中的数据全部解析出来然后将这些数据全部封装到request对象当中了。也就是说我们只要面向HttpServletRequest就可以获取请求协议中的数据。HttpServletResponseHttpServletResponse对象是专门用来响应HTTP协议到浏览器的把数据返回给浏览器前端提交的数据和请求域里的数据的区别1两种数据都是被封装在HttpServletRequest类型的对象里2在后端获取两种数据的方式相似但使用的方法不同3前端提交的数据被封装request对象的Map映射参数容器里paramsMap请求域里的数据一般都是由开发人员主动存入的为后续的其他servlet/jsp使用转发、el表达式等会用到它也是一个Map映射的属性容器attributeMap注请求转发并不会使当前请求结束还是同一个请求被拷贝在服务器内部流转因此请求域里的数据还存在而重定向则是浏览器发生两次请求第二次是浏览器的自动行为因此不能在重定向后再次使用到用户第一次提交的数据应用域和请求域的区别应用域就是ServletContext存在于整个项目生命周期内想象成一块公共存储数据的区域可以存入一些公共的数据服务器关闭时销毁请求域存在于一次请求的过程中也是想象一块存在周期短一点的存储数据的公共区域请求结束就销毁如何做到两个servlet之间交流/共享数据方法一将数据放到ServletContext应用域当中不推荐-大材小用浪费资源方法二将数据放到请求域中然后使用请求转发注转发的下一个资源必须是一个Servlet吗不一定只要是Tomcat服务器当中的合法资源都是可以转发的。例如jsp、html…。转发的时候路径的写法要注意转发的路径以“/”开始不加项目名。请求转发和重定向区别1请求转发RequestDispatcher不管转发多少次都是一次请求因为在转发的过程走中使用forward(req,rep)把当前的请求对象和响应对象传递给下一个资源2重定向的路径上一定要加上项目名这个路径返给浏览器因为浏览器发送请求时需要项目名的服务器才好定位访问哪个项目因此浏览器会向着服务器发第二次的请求自发的全新的请求。⚠️response.sendRedirect(“/项目名/路径资源…”);转发会存在浏览器的刷新问题。转发浏览器地址栏地址不变重定向地址栏地址变了注解开发版servlet3.0之后以前每写一个业务功能都要增加一个XxxServlet类继承HttpServlet且还要在web.xml中配置那么当业务量多时就会产生“类爆炸”的情况而注解就是解决这种麻烦我们只需要定义继承HttpServlet的类然后在类上属性上使用注解就能完成以前servlet编写和注册web.xml那一套不再需要配置web.xml只需少量配置web.xml就能完成项目的配置。用法在创建的类上使用WebServlet注解就标识这个类是XxxServlet类。该注解里的属性有name、urlPatterns、loadOnStartUp、value什么是会话session用户打开浏览器并进行一系列的点击操作然后将浏览器关闭这整个过程可以认为是一次会话。会话在服务器端也对应着一个java对象。jarkata.servlet.http.HttpSession叫做session。一次会话的过程当中包含多次请求session其实是一种B/S架构的一种机制规范不同语言都对这种会话机制有具体的实现主要用途用来保存会话状态比如用户登录系统了用session保存这种用户的登录状态举例张三打开一个浏览器A李四打开一个浏览器B访问服务器之后在服务器端会生成张三专属的session对象李四专属的session对象自主思考为什么不使用request对象保存会话状态为什么不使用ServletContext对象保存会话状态session的实现原理前置了解sessionid—每一个sessionid唯一捆绑一个账号就相当于身份证上的身份证号(sessionid)唯一对应一个人。这个sessionid一般放在浏览器的cookie里的。**大概流程**当一个用户用浏览器首次登录系统此时sessionid为空服务器端判断用户的sessionid是否合法不合法则被拦截到输入用户名和密码登录页面然后输入密码登录成功后会新创建一个sessionid存入一个map容器里服务器管理这个容器并把它和返回数据一块返回给浏览器浏览器会自动把sessionid存入cookie下次访问时会这个id会和用户提交的数据一块发送到服务器。注服务器端存储session对象是以其id为keysession对象为value存储在一个Map集和中的。当浏览器关闭时cookie消失(持久化的例外)session也就失效了Cookie禁用了session还能找到吗cookie禁用是指服务器正常发送cookie给浏览器但是浏览器不要了。拒收了。并不是服务器不发了这时就会产生每一次请求都会重新登录产生新的session对象。cookie禁用了session机制还能实现吗可以。需要使用URL重写机制http://localhost:8080/servlet12/test/session;jsessionid19D1C99560DCBF84839FA43D58F56E16但URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候后面都要添加一个sessionid给开发带来了很大的难度很大的成本。所以大部分的网站都是这样设计的你要是禁用cookie你就别用了。总结一下到目前位置我们所了解的域对象request对应的类名HttpServletRequest请求域请求级别的session对应的类名HttpSession会话域用户级别的application对应的类名ServletContext应用域项目级别的所有用户共享的这三个域对象的大小关系request session application这三个域对象都有以下三个公共的方法setAttribute向域当中绑定数据getAttribute从域当中获取数据removeAttribute删除域当中的数据使用原则尽量使用小的域。Cookiesession的实现原理中每一个session对象都会关联一个sessionid例如sessionid41C481F0224664以上的这个键值对数据其实就是cookie对象。对于session关联的cookie来说这个cookie是被保存在浏览器的“运行内存”当中。只要浏览器不关闭用户再次发送请求的时候会自动将运行内存中的cookie发送给服务器。例如这个Cookie: JSESSIONID41C481F0224664BDB28E95081D23D5B8就会再次发送给服务器。服务器就是根据41C481F0224664这个值来找到对应的session对象的。cookie有啥用cookie和session机制其实都是为了保存会话的状态cookie机制是将会话的状态保存在浏览器客户端上cookie里的数据存在浏览器客户端上的session机制是将会话的状态保存在服务器端上应用商场购物车未登录下的购物车状态保存、邮箱系统的十天免登录功能…注网上找些案例配合理解为佳。为什么要有cookie和session机制呢因为HTTP协议是无状态 无连接协议关于cookie的pathcookie关联的路径浏览器在什么请求路径下会自动携带这个 Cookie 给服务器假设现在发送的请求路径是“http://localhost:8080/servlet13/cookie/generate”生成的cookie如果cookie没有设置path默认的path是什么浏览器会自动取「当前请求路径去掉最后一级」作为默认 path即pathhttp://localhost:8080/servlet13/cookie。也就是说以后只要浏览器的请求路径是http://localhost:8080/servlet13/cookie 这个路径以及这个路径下的子路径cookie都会被发送到服务器。手动设置cookie的pathcookie.setPath(“/servlet13”); 表示只要是这个servlet13项目的请求路径都会提交这个cookie给服务器。总结cookie和session机制其实都不是java中的机制它们都是http协议的一部分http协议中规定任意一个cookie都是由name和value这样的字符串键值对组成。java的Servlet规范中对cookie是支持的提供了一个类jakarta.servlet.http.Cookie来专门表示cookie数据然后通过response对象的addCookie方法把cookie数据发送给浏览器且可以在java中设置cookie在浏览器端的有效时间和设置cookie保存路径JSPJSPJava Server Pages是 一种动态网页开发技术核心是在 HTML 页面中嵌入 Java 代码本质上是一种特殊的 Servlet—— 服务器会把 JSP 页面编译成 Java 类Servlet 子类最终通过 Servlet 处理请求、生成动态 HTML 响应。直观上理解就是HTML中嵌入Java 代码 JSP 的组合体目的是解决纯 Servlet 拼接 HTML 代码繁琐的问题。核心语法JSP 允许在 HTML 里通过「脚本标签」嵌入 Java 逻辑常用标签脚本片段% java代码 % 用于判断业务逻辑 输出表达式%变了/java表达式% 向页面输出内容翻译后变为java代码out.print() 声明标签%!变量和方法% 声明jsp类的变量和方法 注视 %-- 内容 --%. jsp专属注释不会输出到页面核心指令page它用来定义整个 JSP 页面的全局属性比如编码、语言、导入包、会话管理等 —— 所有 page 指令都要写在 JSP 页面的开头通常第一行在html标签之前% page 属性名1值1 属性名2值2 ... % 常用的属性名有 import(导java包多个包用“”隔开) language(设置编程语言-只能是java也默认是java) session”true/false“、true自动创建内置对象false不创建session对象使用session包错 errorPageerror.jsp当页面异常时跳转到error.jsp isErrorPage“true”标记当前页面是错误页面可以使用exception对象 contentType设置响应的类型和编码 isELIgnoredtrue 表示忽略el表达式核心指令include、taglibinclude指令包含指令在JSP中完成静态包含很少用 taglib指令引入标签库的指令。这个到JJSTL标签库1️⃣JSP对大小写敏感import 是唯一可重复的属性。2️⃣errorPage 的路径如果写相对路径如 error.jsp则和当前 JSP 同目录如果写绝对路径如 /WEB-INF/error.jsp则从项目根目录开始。jsp的九大内置对象jakarta.servlet.jsp.PageContext pageContext 页面作用域jakarta.servlet.http.HttpServletRequest request 请求作用域jakarta.servlet.http.HttpSession session 会话作用域jakarta.servlet.ServletContext application 应用作用域pageContext request session application以上四个作用域都有setAttribute、getAttribute、removeAttribute方法。以上作用域的使用原则尽可能使用小的域。java.lang.Throwable ----exceptionjakarta.servlet.ServletConfig ----configjava.lang.Object ----page其实就是this当前的servlet对象akarta.servlet.jsp.JspWriter ----outjakarta.servlet.http.HttpServletResponse —responsejavabean什么是javabean实际上javabean你可以理解为符合某种规范的java类比如有无参数构造方法属性私有化对外提供公开的set和get方法实现java.io.Serializable接口重写toString重写hashCodeequalsjavabean其实就是java中的实体类。负责数据的封装。EL表达式在前面的jsp文件中经常看到一堆一堆的% java代码 %、%%这样的代码看起来就很混乱脑壳大所以就有了el表达式el表达式可以算是jsp语法的一部分。用于整洁美观jsp代码。EL表达式出现在JSP中主要是从某个作用域中取数据然后将其转换成字符串然后将其输出到浏览器。这就是EL表达式的功效。从某个域中取出数据四个域pageContext、request、session、application将取出的数据转化为字符串如果是一个java对象也会自动调用java对象的toString方法将其转换成字符串。将字符串输出到浏览器和% %一样将其输出到浏览器语法${表达式}表达式主要可以写存储到域对象当中时的name。如果存入到域中的是一个对象要获取对象里的属性必须要求对象有getXxx方法才能使用{对象.属性}el表达式还对null值做了处理如果为null则为空串EL表达式优先从小范围中读取数据pageContext request session applicationEL表达式中有四个隐含的隐式的范围pageScope对应的是 pageContextrequestScope 对应的是requestsessionScope 对应的是sessionapplicationScope对应的是applicationEL表达式取数据的形式有两种使用“.方式第二种[ ] 如果存储到域的时候这个name中含有特殊字符可以使用 [ ]- request.setAttribute(“abc.def”, “zhangsan”);- requestScope.abc.def 这样是无法取值的。应该这样${requestScope[“abc.def”]}掌握使用EL表达式怎么从Map集合中取数据掌握使用EL表达式怎么从数组和List集合中取数据掌握EL表达式中其他的隐式对象掌握EL表达式的运算符掌握通过EL表达式获取应用的根。。。JSTL标签库jsp中引入标签库使用taglib指令%taglib prefix“c” uri“http://java.sun.com/jsp/jstl/core” %注prefix“这里随便起一个名字就行了核心标签库一般大家默认为c”原理JSTL标签的原理%taglib prefixc urihttp://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文件。常用的标签Filter 过滤器Filter可以在Servlet这个目标程序执行之前添加代码。也可以在目标Servlet执行之后添加代码就像渔网一样可以过滤筛选。之前之后都可以添加过滤规则一般情况下都是在过滤器当中编写公共代码。步骤1️⃣建立一个类实现一个接口jarkata.servlet.Filter。并且实现这个接口当中所有的方法。init方法在该对象创建后调用且只执行一次doFilter方法用户发送多少次请求执行多少次该方法destory方法在Filter对象被释放/销毁之前调用并且只调用一次2️⃣在web.xml中对Filter进行配置这个配置和Servlet很像filter filter-namefilter2/filter-name filter-classFilter的实现类全名/filter-class /filter filter-mapping filter-namefilter2/filter-name url-pattern*.do/url-pattern /filter-mapping 或者使用注解WebFilter({*.do}) 来代替注Filter对象默认情况下在服务器启动的时候会新建对象和servlet区别开filter和servlet一样都是单实例的。Filter的优先级天生的就比Servlet优先级高如何一个请求路径分别对应filter和servlet则会先执行filter再执行servlet路径配置1前缀路径匹配模式以/开始例如 /a.do/dept/save/*匹配所有路径2后缀匹配模式不能以/开始后缀名匹配必须以 *. 开头不能以 / 开头 例如*.do、*.jsp 含义匹配所有指定后缀结尾的请求零碎规则1过滤器的调用顺序遵循栈数据结构2如果使用的是WebFilter注解则它们会比较过滤器名字来决定调用顺序3Filter采用责任链设计模式Listener监听器监听器是Servlet规范中的一员。就像Filter一样。Filter也是Servlet规范中的一员。在Servlet中所有的监听器接口都是以“Listener”结尾。有什么作用监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机在触发这个时机的事情发生时执行一段代码。常用的监听器实现一个监听器步骤第一步编写一个类实现上述的监听器接口并实现里面的方法要执行的那一小段代码就写在对应的方法中第二步在web.xml中进行配置或用WebListener注解代替listener listener-class监听器类/listener-class /listener //注所有监听器中的方法都是不需要javaweb程序员调用的由服务器来负责调用案例编写一个监听器实现一个系统项目中当前登录在线的人数MVC架构模式原理MVC是软件工程中解耦业务逻辑和页面展示的经典架构模式并非专门某个语言所属是一种通用的设计思想M是指模型Model与处理业务逻辑相关封装数据javabean/pojo业务规则如订单校验数据持久化数据查询和数据修改入库…V是指视图View处理所有界面的展示逻辑接受controller传递的参数纯展示数据不关心数据来源专注页面的渲染C是指控制器Controller主要是请求分发和组件协调接受用户请求如用户下单调用model层接口做数据处理将处理结果传递给View最终返回响应结果设计原则单一职责原则每个组件只做一件事Model 管数据View 管展示Controller 管协调开闭原则扩展功能时新增组件即可如新增「秒杀商品」Model无需改 View 和 Controller依赖倒置原则Controller 依赖 Model 的抽象如接口而非具体实现便于替换数据来源如从 MySQL 换成 Redis关注点分离开发时前端只关注 View后端只关注 Model接口对接通过 Controller 约定。项目实战(未完)一、技术选型后端Javaservletjsp前端htmlcssjs数据库mysql…未完待续…
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2500883.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!