jsp_servlet课堂笔录_1001

来源:互联网 发布:淘宝联盟订单查询 编辑:程序博客网 时间:2024/05/17 09:21
1 认识服务器
    服务器 tomcat  jboss  websphere weblogic 
    服务器 :用来发布,布署,管理web应用程序
    
    jsp简介:  
       1  JSP---Java Server Pages
       2 依靠服务及解析 在服务端运行的脚本程序
       3 直接在HTML中内嵌java代码  <%  %>




  在tomcat下运行wen应用程序(也叫web项目或web工程)
    1 把我们的web应用程序 拷贝到 tomcat的webapps 目录下 ,然后启动服务器
       http://服务器地址:端口号/web应用程序名/资源文件路径
    2 有效的Web web应用程序目录结构如下
           WEB-INF
                web.xml (该web app的配置文件)
                lib (该web app用到的jar文件)
classes
           META-INF(存放该web app的上下文信息,符合J2EE标准)


    3    web应用程序可以直接放在webapp下面
         也可以通过配置文件指定到其他


jsp 九大对象 7大动作 三大指令


 out:向客户端输出数据  <%=%>


 1 跳转的方式


    4 个页面 


  
    
    1.jsp
      姓名 
      性别 单选框
      年龄
      身高
      籍贯
      爱好 复选框
      个人介绍 大文本框
    2.jsp 
      qq号码
      电话
      手机
      婚否 单选框
      银行卡号
    3.jsp
      机器ip
      毕业学校
      学历
      英语水平 下拉框 (一般 熟练 精通)


  4.jsp
     所在班级
     所在宿舍
     所在地址
     生日
     暗恋人名字 复选框
     是否在谈恋爱 单选框


  要求   第1个页面提交到第2个页面  第2个页面提交到第3个页面  第3个页面提交到第4个页面 第4个页面提交到第5个页面
  第2个页面显示第1个页面信息  第3个页面显示第1个页面和第2个页面信息  第4个页面显示第1 第2 第3个页面信息  第5个页面显示第1 第2 第3  第4个页面信息






***** form提交的两种方式 get与post 
  1 post比get安全 因为get方式提交会把参数值显示在浏览器地址栏中
  2  内容长度post大于get
  3 get提交中文乱码






 
 ***** session消亡的几种方式  
      1 关闭浏览器
      2 调用 session.invalidate()销毁session对象  常用于登录后的注销功能
      3 设置的session的过期时间


 ***** jsp中的包含页面的两种方式:静态包含与动态包含
       <%@include file="header.jsp" %>                            静态包含
       <jsp:include page="header.jsp" flush="true"></jsp:include>  动态包含
        区别
 静态包含:被包含的页面与包含的页面统一编译  变量可以共享的
          动态包含:单独编译
 1 统一编译与单独编译 导致变量的共享问题
 2 动态包含可以传递参数 静态包含不可以
 3  动态包含总是检查被包含文件的变化 ,而静态包含不一定    因此静态包含相对速度快些
 页面之间的跳转方式 
      客户端:
        1 form提交 指定action
2 超链接 
3 window.location.href  通过js改变浏览器的地址
 window.location.replace 


   ***** 服务端跳转两种方式
         1  重定向  Redirect        如 response.sendRedirect("2.jsp"); 可以跳转到任意资源
2  转发     forward     本服务器跳转  资源限定于本服务器      <jsp:forward page="2.jsp"></jsp:forward>
 
 区别:
   1 转发浏览器的地址栏不发生改变  转发速度快 但可访问的资源有限   任意对垒本服务器
   2 重定向会导致request作用域的属性值丢失
   
   在jsp页面使用bean的两种方式
   1 import 后直接使用
   2 




 jsp   乱码问题
      页面乱码 <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>
       request.getParameter("参数名") 值 乱码 request.setCharacterEncoding("GBK")  post方式提交
       response.sendRedirect("jsp页面")  response.setCharacterEncoding("GBK")


       连接数据库编码不一致  指定url编码
         DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/数据库名
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=GBK
 
  使用exception内置对象的步骤
1 在你的页面上指定错误处理页面  errorPage="error.jsp"
2 在错误处理页面指明我就是错误处理页面 isErrorPage="true"
  之后就可以在错误处理页面使用exception对象获得异常堆栈信息


使用tomcat产生的http友好500错误 解决方法两种
1 取消IE“工具--Internet选项--高级--显示友好HTTP错误信息”选项;不推荐使用
2  增加你的error page的长度。










  servlet 
     Servlet是由sun公司编写用于运行在服务器端的软件组件,是一种规范,Servlet API为Servlet提供了统一的编程接口
       1 Servlet是服务器小应用程序
       2 用来完成B/S架构下,客户端请求的响应处理
       3 平台独立,性能优良,能以线程方式运行
       4 Servlet API为Servlet提供了统一的编程接口
       5 常见的Servlet容器
Tomcat Jetty / Resin


  
   使用Servlet作为表现层的工作量太大,所有的HTML标签都需要使用页面输出流生成。
   因此,使用Servlet作为表现层有如下3个劣势。 
    1 开发效率低,所有的HTML标签都需使用页面输出流完成。
    2 不利于团队协作开发,美工人员无法参与Servlet界面的开发。
    3  程序可维护性差,即使修改一个按钮的标题,都必须重新编辑Java 代码,并重新编译
  
     Jsp Model1
   
   这种架构模型非常适合小型Web项目的快速开发,而且对Java Web开发人员的技术水平要求不高4.的缺点:
   I.HTML和JAVA强耦合在一起,导致页面设计与逻辑处理无法分离


              II.可读性差,调试困难,不利于维护
              III.功能划分不清
  Jsp Model2


1.Jsp Model2中使用了三种技术JSP、Servlet和JavaBeans


Jsp负责生成动态网页,只用做显示页面。


Servl et负责流程控制,用来处理各种请求的分派。


JavaBeans负责业务逻辑,对数据库的操作。


2.使用Jsp Model2的交互过程:
     
      .Jsp Model2优点


       I.消除了Jsp Model1的缺点:


       II.该模式适合多人合作开发大型的Web项目


       III.各司其职,互不干涉


       IV.有利于开发中的分工


       V.有利于组件的重用


      Jsp Model2缺点


       Web项目的开发难度加大,同时对开发人员的技术要求也提高了






   连接池  :用空间换时间的做法 先创建一定数量的数据库连接放入池(容器)中  建立连接的时候到池(容器)中取得连接 


        连接池运作原理
在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、
打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,
系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器
(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。
  数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,
  不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。
  数据库连接池的主要操作如下:
  (1)建立数据库连接池对象(服务器启动)。
  (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  (4)存取数据库。
  (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
  
  
  
  容器与服务器


  
  服务器 用来部署 发布 和管理web应用的




   容器: 管理bean的生命周期 包括创建实例 执行 销毁,以及管理事务等


   servlet容器 实现了servlet相关接口 的主要任务是管理servlet的生命周期 包括加载和实例化servlet,初始化 ,执行和销毁servlet    servlet容器有时候也叫servlet引擎
   
    2 Servlet容器的作用是负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户
  
    3 Servlet容器的工作过程是:当客户请求某个资源时,Servlet容器使用ServletRequest对象把客户的请求信息封装起来,
然后调用java Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的要返回给客户的结果封装到 ServletResponse对象中,
最后Servlet容器把客户的请求发送给客户,完成为客户的一次服务过程。每一个Servlet的类都执行 init()、service()、destory()三个函数的自动调用,
在启动时调用一次init()函数用以进行参数的初始化,在服务期间每当接收到对该Servlet的请求时都会调用Service()函数执行该Servlet的服务操作,
当容器销毁时调用一次destory()函数。

  ********servlet生命周期  init()进执行一次  具体参考结构图 


 servlet结构
        
servlet继承关系
servlet主要数据结构: 
Servlet 接口:主要定义了servlet的生命周期方法 
ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。 
ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重要方法。 
GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。 
HttpServlet抽象类:为处理http请求的servlet提供了一般实现,主要是定义和实现了若干service方法。 
继承关系:GenericServlet继承了Servlet和ServletConfig接口;HttpServlet继承了GenericServlet;我们写的servlet继承了HttpServlet 


 
                       servlet           ServletConfig        
                            \                 /
                             \               /
                              \             /
                               \           /
                               GenericServlet
                                     |
                                     |
                                     |
                                     |         
                                HttpServlet
                                     |
                                     |
                                     |
                                     |
                               我们的servlet
                                               




 








                    JSP内置对象与Servlet子类映射表


JSP内置对象       Servlet子类                                                作用域


request                javax.servlet.http.HttpServletRequest          Request


response             javax.servlet.http.HttpServletResponse           Page


session               javax.servlet.http.HttpSession                  Session


application          javax.servlet.ServletContext                     Application


out                   javax.servlet.jsp.JSPWrite                     Page


pageContext       javax.servlet.jsp.PageContext                       Page


config               javax.servlet.ServletConfig                      Page


page                  java.lang.Object                                Page


exception           java.lang.Throwable                               Page










    
request中的两个getsession的方法区别
   HttpSession getSession() 
          返回关于该请求的当前会话。或者若该请求没有会话则就创建一个。  
 HttpSession getSession(boolean create) 
          返回有关本请求的当前HttpSession,或者若该请求没有会话,且“创建”属性为真,则就创建一个。 








cookie   cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段


   cookies给网站和用户带来的好处非常多:
  1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
  2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
  3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
  4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
  在JSP中,我们也可以使用Cookie,来编写一些功能强大的应用程序




    


 








  过滤器
  1 屏蔽非法文字
  2 对是否登陆进行过滤
  3 对内容进行统一编码
   过滤器特点 1自动执行 先于我们的程序执行




   servlet 一般分为3种
   1标准的servlet
   2过滤器
   3监听器  指对整个web环境的监听
        servletcontext监听  
   对servletcontext创建 销毁的监听
            对servletcontext属性的监听器
session监听
           对session创建 销毁的监听
            对session属性的监听器


request监听
    




jsp 自定义标签
     在JSP规范的1.1版中增加了自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术。通过使用自定义标签库,可以在简单的标签中封装复杂的功能。 


为什么要使用自定义标签呢?主要是为了取代丑陋的JSP脚本。在HTML页面中插入JSP脚本有如下几个坏处:


JSP脚本非常丑陋,难以阅读。


JSP脚本和HTML代码混杂,维护成本高。


HTML页面中嵌入JSP脚本,导致美工人员难以参与开发。


出于以上3点的考虑,我们需要一种可在页面中使用的标签,这种标签具有和HTML标签类似的语法,但有可以完成JSP脚本的功能——这种标签就是JSP自定义标签。


在JSP 1.1规范中开发自定义标签库比较复杂,JSP 2规范简化了标签库的开发,在JSP 2中开发标签库只需如下几个步骤。


开发自定义标签处理类;


建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标签;


在JSP文件中使用自定义标签。


标签库是非常重要的技术,通常来说,初学者、普通开发人员自己开发标签库的机会很少,但如果希望成为高级程序员,或者希望开发通用框架,就需要大量开发自定义标签了。所有的MVC框架,如Struts 2、SpringMVC、JSF等都提供了丰富的自定义标签


二、JSP自定义标签的优点


1、分离了程序逻辑和表示逻辑
2、将java代码从html中剥离,便于美工维护页面
3、减少了jsp页面中的脚步,减少了维护成本
4、提高了可重用的功能组件






继承BodyTagSupport


 @Override  
    public int doEndTag() throws JspException {   
          JspWriter out = pageContext.getOut(); 
         out.print("你知道我是谁吗"); 
        return EVAL_PAGE;   
    }   


增加属性名value 


<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>写写信息</shortname>
<uri>/取个名字</uri>
<tag>
<name>随便取个名字</name>
<tag-class>包名.类名(即自定义标签处理类)</tag-class>
<body-content>empty</body-content>
      </tag>
</taglib>




taglib下有3个子元素:


tlib-version:指定该标签库实现的版本,这是一个作为标识的内部版本号,对程序没有太大的作用。


shortname:该标签库的默认短名,该名称通常也没有太大的用处。


uri:这个属性非常重要,它指定该标签库的URI,相当于指定该标签库的唯一标识。如上面斜体字代码所示,JSP页面中使用标签库时就是根据该URI属性来定位标签库的。


除此之外,taglib元素下可以包含多个tag元素,每个tag元素定义一个标签,tag元素下至少应包含如下3个子元素:


name:该标签库的名称,这个属性很重要,JSP页面中就是根据该名称来使用此标签的。


tag-class:指定标签的处理类,毋庸置疑,这个属性非常重要,指定了标签由哪个Java类来处理。


body-content:这个属性也很重要,它指定标签体内容。该元素的值可以是如下几个:


tagdependent:指定标签处理类自己负责处理标签体。


empty:指定该标签只能作为空标签使用。


scriptless:指定该标签的标签体可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。


JSP:指定该标签的标签体可以使用JSP脚本。






Tag系列的Interface里定义的静态int,通过他们也能一窥tag组键的执行流程,这几个静态值分别是: 
SKIP_BODY : 跳过了开始和结束标签之间的代码,一般是在doStartTag中使用 
EVAL_BODY_INCLUDE :处理嵌套的标签,一般是在doStartTag中使用,由负责处理标签正文的tag接口提供 
EVAL_BODY_BUFFERED :对包含的内容进行解析 一般是在doStartTag中使用,由负责处理标签正文的bodyTag接口提供,目的是通知jsp容器作好读取正文的工作(创建一个body- content包装正文和获取存放操作结果的out对象,便于以后的操作和输出). 
EVAL_BODY_AGAIN:处理标签正文,嵌套标签的iteratorTag接口的使用 
SKIP_PAGE : 忽略剩下的页面,一般是在doEndTag中使用 
EVAL_PAGE : 继续执行下面的页, 一般是在doEndTag中使用




 执行顺序:


重载BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(),doAfterBody(), doEndTag();
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(),doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG,SKIP_BODY, 








 






<%@taglib uri="/WEB-INF/a.tld" prefix="随便取个名字"%>
第2种 <%@taglib uri="tld文件中配置的那个uri值" prefix="随便取个名字"%>




使用 <前缀名:标签名  属性名="属性值"/>
  




<!-- 配置标签属性 -->
<attribute>
<name>属性名</name> 
<required>true</required><!--可以在attribute元素的rtexprvalue 子元素指定JSP是否为动态元素。<s:dynamicAttributeValue birthday="<%=new Date() %>"/>  -->
<fragment>true</fragment>
</attribute>


2.0输出


getJspContext().getOut().write("你知道我是水吗")




-----------------------------------jsp2.0  ------------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
 <tlib-version>1.0</tlib-version> 
 <short-name>取个名字</short-name>
<uri>取个名字</uri>
<tag>
<name>取个名字</name>
<tag-class>包名.类名(即自定义标签处理类</tag-class>
<body-content>scriptless</body-content>
<!-- 以下是配置属性 -->


<attribute>
            <name>属性名</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>


        </attribute>
</tag>


</taglib>


掌握:如何写一个自定义标签






1 bean标签 
2迭代标签 实现步骤
    1 2.0 继承SimpleTagSupport 重写doTag方法
    2 首先从作用域获得相应的list(this.getJspContext().getAttribuet("属性名",作用域)) ,属性名可作为标签类的一个属性,用户从界面传入
    3 假设list中的元素师一个个object,对list的元素进行迭代,每迭代一个,就把当前元素object放入相应的作用域,以方便bean标签取出打印,
      由于bean属性的打印标签是迭代标签的标签体,所以我们通过调用this.getJSpBody().invoke()执行标签体
        




3 分页标签 4 权限标签




  jstl标签  需要jstl.jar与stand.jar支持
      
      JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,


        
         这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
         1 核心标签库:包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。 
         2 国际化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。 
         3 数据库标签库:可以做访问数据库的工作。 
         4  XML 标签库:用来访问 XML 文件的工作,这是 JSTL 标签库的一个特点。 
         5  函数标签库:用来读取已经定义的某个函数。 
          
JSTL包含了和以下操作相关的标签 
    常用标签  <c:out> ,<c:set> 
    条件迭代标签  <c:if>, <c:choose>  <c:when> <c:otherwise>  <c:forEach>   
    url标签  <c;import> 
    xml标签  <xml:out> 
    国际化输出标签  <fmt:timeZone> 
    SQL标签 : <sql:query> 


  
  此外, JSTL 还提供了 EL 表达式语言( Expression Language )来进行辅助的工作。
          JSTL 标签 库由标签库和 EL 表达式语言两个部分组成。 EL 在 JSTL 1.0 规范中被引入,当时用来作为 Java 表达
         该表达式必须配合 JSTL 的标签库才能得到需要的结果。 


       <c:out value="${user.firstName}"/> 






  mvc 
        
MVC是Model-View-Controller的简称,原本是建立Smalltalk 应用的框架
        MVC是三个单词的缩写:M,Model(模型);V,View( 视图 ),C,Control(控制器)。
在Model发生变化的时候,通知View改变,举一个经典的例子是对同一数据,系统可能需要不同的显示视图,比如条形图、饼图、数据表格等等






         mvc模式与model2


         Model2并不是什么新的东西,其思想上实际是对MVC的一种继续。很多场合,交互使用Model 2 和 MVC这两个词。
但是还是存在一些争论,即一个应用是否是 MVC,以及是否支持经典的观察者通知模式。没有观察者通知的Model-View-Controller 有时被称为MVC2 或Web MVC
MVC模式的目的就是实现Web系统的职能分工,
Model层:模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑,即javaBean部分
View层:负责与用户交互,即在界面上展示数据对象给用户,即html,jsp
Control层:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,
同时它也可以解释用户的输入并将它们映射为模型层可执行的操作,当然就是Servlet的职责了


         我们在web开发中引入MVC思想,想要达到的目的是: 实现表现层和业务逻辑层分离——控制器是为了实现上述目的而存在的!


          
 
 MVC三个部分在J2EE三层架构中的位置


           先说说J2EE三层架构这个古老话题。地球人都知道web三层架构是指:


·                >表现层(UI Layer或  Web Tier 或Client Tier)


·                >业务逻辑层(Bussiness Layer)


·                >持久化层






   我们来了解一下MVC三个部分在J2EE架构中处于什么位置,这样有助于我们理解MVC模式的实现。
   MVC与J2EE架构的对应关系是:View 处于表现层,通常是JSP/Servlet,即页面显示部分。
   Controller也处于表现层,通常用Servlet来实现,即页面显示的逻辑部分实现。Model处于业务逻辑层,
   通常用服务端的javaBean或者EJB实现,即业务逻辑部分的实现。




  MVC模式优点
     ①实现一个模型的多个视图;
     ②采用多个控制器;
              ③当模型改变时,所有视图将自动刷新;
     ④所有的控制器将相互独立工作。


           MVC模式缺点
     (1)增加了系统结构和实现的复杂性。
      (2)视图与控制器间的过于紧密的连接
     (3)视图对模型数据的低效率访问
     (4) 目前,一般高级的界面工具或构造器不支持MVC模式 

原创粉丝点击