Servlet和jsp
Servlet
定义:
Servlet是一个java应用程序,运行在服务器端,用来处理客户请求并作出响应的程序.
当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类,此时它贮存于内存中.当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例,Servlet多线程机制背后有一个线程池在支持,线程池在初始化初期就创建了一定数量的线程对象.
访问过程:
1)客户端第一次发出请求---->Web服务器将http请求转发到Web容器Tomcat;
2)Tomcat主线程对转发来用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletResponse;
3)从请求中的URL中找到正确Servlet,Tomcat为其创建或者分配一个线程,同时把创建的两个对象的引用(request,response)传递给该线程;
4)Tomcat调用Servlet的service()方法,根据请求参数的不同调用doGet()或者doPost()方法;
5)假设是HTTP GET请求,doGet()方法中生成静态页面,并组合到响应对象(response)里,返回给线程对象,线程对象再返回给Tomcat服务器,将线程销毁或者返还给线程池,Tomcat将响应对象转换为HTTP响应发回给用户,同时删除请求和响应对象.
Servlet的生命周期
简述:Servlet在Web容器中(tomcat服务器),生命周期由web容器来管理,Servlet的生命周期通过javax.servlet.Servlet接口中的init(),service()和destroy()方法来表示.
1)加载和实例化:
因为容器是通过java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们编写Servlet类的时候,不应该提供带参数的构造方法.
2)实例化:
容器将调用Servlet的init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等,对于每一个Servlet实例,init()方法只能调用一次.
3)请求处理
Servlet容器调用Servlet的Service方法对请求进行处理.
4)服务终止
当前要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法.在destory()方法调用之后,容器会释放这个Servlet实例,该实例随后会被java的垃圾收集器所回收,destroy()方法在整个生命周期当中只会调用一次(服务器正常终止或者重新加载,都会调用destroy方法)

编写Servlet
Servlet接口:
有五个抽象方法
GenericServlet抽象类:
有一个抽象方法(servlet),四个抽象方法,一个init重载方法
HttpServlet抽象类:
没有抽象方法
相对路径和绝对路径
相对路径:
服务器端:相对web.xml中配置的那个路径
客户端:相对于地址栏里面的路径,如果当前页面设base标签,则相对base路径.[base路径最后一定要有/]
绝对路径[/]:
服务器端中/代表的是项目名后的这个/[http://ip:port/项目名/]
客户端中/代表的是端口号后的这个/[http://ip:port/]

过滤器Filter
概念
可以用来转换HTTP请求,响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应.
生命周期:
概述:一定要实现javax.servlet包的Filter接口的三个方法init(),doFilter(),destroy(),空实现也行.
1)启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
2)每一次请求时都只调用方法doFilter()进行处理;
3)停止服务器时调用destroy()方法,销毁实例.
访问过程
概述:filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应
1)在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;
2)根据程序需要修改请求和响应;
3)在Servlet被调用之后截获servlet的执行
特点:
1)流程是线性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter,servlet接收等
2)filter功能可用来保持流程继续按照原来的方式进行下去,用来辅助流程,而servlet的功能主要用来主导流程.
3)filter可用来进行字符编码的过滤,检测用户是否登录的过滤,禁止页面缓存等
4)filter过滤器[只会拦截地址栏中出现的路径],如果是服务器[内部跳动]的路径,filter是[不拦截]的.重定向,过滤器是会拦截的.

JSP
定义:一个jsp页面就是一个servlet,jsp只是比servlet多了一个编译的过程

编译访问过程
jsp页面第一次被访问时,会被tomcat服务器编译成一个java类,默认继承HttpJspBase类,jsp页面最终就被编译成HttpServlet的子类,所以说jsp本身就是一个servlet.
生命周期
1)编译
Jsp只会在客户端第一次发请求的时候被tomcat编译成java文件再编译成字节码文件,之后的请求不会再编译,同时tomcat能自动检测jsp更变与否,更变则再进行编译.
2)初始化
第一次编译并初始化时调用:init();在整个jsp生命周期中均只调用一次.
3)提供服务
servlet()方法是接收请求,返回响应的方法.请求都执行一次,该方法被HttpServlet封装为doGet和doPost方法之后再访问servlet时,直接调用service方法.
4)销毁
当服务器正常终止或者更新加载(reloading,web.xml文件中有),调用destory方法servlet对象会被销毁,在整个jsp生命周期中均只调用一次.
特点:
客户端访问jsp页面,第一次慢,以后正常;因为jsp页面要先翻译成.java文件然后再编译成.class文件,最后再运行
把部署在tomcat服务器中web项目删除后,还能再次运行起来;因为项目中的jsp页面被编译成.class文件之后存放到tomcat服务器的work目录中,当我们在客户端通过url去访问的时候就可以直接访问到,而不需要再去项目中根据url找对应的servlet

  jsp页面不能直接访问,因为它就是一个servlet;但是我们一般用servlet处理业务逻辑,用JSP展示页面

jsp的指令元素
   描述:
      JSP指令是通知JSP引擎如何处理该JSP页面,JSP引擎就是tomcat的jasper组件.
   1)page
     页面指令用来定义jsp文件中的全局属性.一个页面可以包含多个页面指令 【<%@ page language="java" %>】
   2)include
      该包含为静态包含,file1包含file2,则将file2的代码插入file1的指定位置作为一个jspfile,然后在编译.两个文件中变量会复用.【 <%@ include file="jspfilename" %>】

      动态包含(不属于include指令元素):当执行到被包含页面时,才转换,所以产生两个java和class文件.相当于将被包含的页面转化为一个方法去调用
   3)taglib
     该指令的作用是在当前jsp页面中[引入一些特殊的标志库],比如jstl标志库,struts2标志库等.

9个内置对象
   描述:
     在jsp页面代码不需要声明,直接可以使用的对象.其实是只有在这个[_jspServlet()]方法中才能使用;因为早已定义好了的.
   1)application(ServletContext)
     作用范围:ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象
   2)session(HttpSession)
      作用范围:用户打开浏览器会话开始,直到关闭浏览器会话才会结束,一次会话期间只会创建一个session对象.
      应用:
        常用于web开发中的登录验证界面(当用户登录成功后浏览器分配其一个session键值对)
      销毁:
        session超时
        客户端关闭后,session丢失,再也访问不到和客户端对应的session了,它会在超时之后被销毁
        调用session,invalidate();
      备注:
         session时服务器端对象,保存再服务器端,并且服务器端可以创建session后产生的sessionid通过一个cookie返回给客户端,以便下次验证.(session底层依赖于cookie)
      3)request(HttpServletRequest)
        作用范围:
           仅在当前请求中有效.
         应用:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递.
         pageContext(PageContext)
4)pageContext对象是一个比较特色的对象,通过它可以获取jsp页面的request、response、session、application、exception等对象。
5)out Out对象向客户端浏览器输出信息,并管理应用服务器上的输出缓冲区。
6)config Config对象针对的是web.xml文件。
7)exception  只有在page指令中设置isErrorPage属性值为true的页面才可以被使用,设置跳转的Error的页面属性errorPage=”error.jsp”。
8)response  Response对象用于响应客户请求并向客户端输出信息,它封装了jsp生产的响应,并发送到客户端以响应客户端的请求
9)page(Object)  page对象代表jsp本身,只在jsp页面内才是合法的。该对象本质上包含当前Servlet接口引用的变量,可以看做是this关键字的别名。

jstl标签库
   需要先导入jstl的jar包.jstl.jar shandard.jar

Web服务器
tomcat服务器的目录结构
bin目录:
存放运行tomcat服务器相关的命令
conf目录:
存放tomcat服务器相关的配置文件
lib目录:
存放tomcat服务器自带的jar包,我们也可以把其他的一些jar包存放到这里在tomcat中同时可以部署部署多个项目,多个项目可共享lib目录中的jar包
logs目录:
存放tomcat服务器在运行过程中,所产生的日志文件
temp目录:
存放部署到tomcat服务器在运行过程中,所产生的临时文件
webapps目录:
存放部署到tomcat服务器中的web项目,把项目部署服务器里面,其实就是放到这个目录下
word目录:
这个目录和时jsp页面相关的,jsp页面被tomcat服务器编译成的java文件及其class文件保存在tomcat服务器里面的work目录中.

Web项目的启动
1)部署
将项目放在tomcat中的webapps项目下
2)启动
启动tomcat服务器,web项目借助与tomcat服务器的启动而启动
3)访问
查看Web项目启动后的结果,通过使用浏览器通过url的形式

Web项目的建立
1)在tomcat目录下的webapps目录下新建一个项目为First_Web的项目
2)在First_Web目录下建一个名为WEB-INF的文件夹(存放动态资源)
3)在WEB-INF同级目录下存放的是静态资源
WEB-INF目录下的两个目录
1)classes:
将来web项目中,写好的java代码编译成class文件后,就要把class文件存放到这个文件夹下寻找自己所需要的jar包.
特点:
WEB-INF目录下的资源不是为客户直接服务的
我们仍然可以使用WEB-INF目录下的JSP页面来提供视图给客户,客户却不能直接访问JSP.
如果把这些JSP页面文件移到WEB-INF目录下,在调用页面的时候就必须把"WEB-INF"添加到URL中.
所以放到WEB-INF目录下的文件是不允许采用redirect方式的跳转来访问的.

  优点:出于对安全性的考虑,是为了代码的安全.
  WEB-INF以外的目录是可以通过URL直接访问的
URL解析的过程
  URL所包含的信息:
    "协议"+"端口号"+"路径(项目名称+文件路径)"
  Tomcat启动后:
    监听我们的8080端口,当有Url请求发送过来之后,解析出项目名称abingtest,然后到webapps目录下搜素到该项目文件夹
项目文件找到后:
    这个时候Tomcat去web.xml文件中寻找<servlet-mapping>配置节中包含"servlet/FirstServlet"字符串,进而找到该类文件所在的位置.
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐