2.10 Servlet介绍
2.10.1 Servelt的开发
Servelt必须继承HttpServlet。
Servlet提供不同的方法用于响应客户端请求。
>doGet:GET请求
>doPost:POST请求
>doPut:PUT请求
>doDelete:DELETE请求
重写这4个方法来响应客户端请求,或者重写service()方法。

>init(ServletConfig config)
>destroy()

Servlet和JSP的区别在于:
>Servlet中没有内置对象,原来JSP中的内置对象都必须由程序显示创建。
>对于静态的HTML标签,Servlet都必须使用页面输出刘住行显示。
普通Servlet类里的service()方法的作用,完全等同于JSP生成Servlet类的_jspService()方法。

2.10.2 Servlet的配置
从Servlet3.0开始,配置Servlet有两种方式:
>在Servlet类中使用@WebServlet Annotation进行配置。
>通过在web.xml文件中进行配置。

@WebServlet支持的常用属性
asyncSupported    是否支持异步模式
displayName        指定该Servlet的显示名
initParams        为该Servlet配置参数
loadOnStartup    配置该Servlet配置成load-on-startup
name            指定该Servlet的名称
urlPatterns/value        完全相同,指定该Servlet处理的URL
ex:
@WebServlet(name="firstServelt", urlPatterns={"/firstServlet"})

注意:不要在web.xml的中指定metadata-complete="true"

web.xml ex:


       
       firstServlet
       
       pack.FirstServlet


       
       firstServlet
       
       /aa


2.10.3 JSP/Servlet的生命周期
创建:
客户端第一次请求某个Servelt时,系统创建该Servlet的实例:大部分的Servlet都是这种。
web应用启动时立即创建Servlet实例,即load-on-startup Servlet。

生命周期:
1.创建
2.init()
3.Servlet初始化后,将一直存在于容器中,用于响应客户端请求。
4.destroy()

2.10.4 load-on-startup Servlet
这种Servlet通常作为应用的基础Servlet使用,提供重要的后台服务。
@WebServlet(loadOnStartup=1)
or

timerServlet
pack.TimerServlet
1


2.10.5 访问Servlet的配置参数
使用ServletConfig对象获取参数:getInitParameter(String name)
配置方式:
@WebServlet(name="testServlet", urlPatterns={"/testServlet"},
initParams={@WebInitParam(name="driver", value="com.mysql.jdbc.Driver"),
@WebInitParam(name="url", value="jdbc:mysql://localhost:3306/javaee"),
@WebInitParam(name="user", value="root"),
@WebInitParam(name="pass", value="123456")})
or:

testServlet
pack.testServlet

driver
com.mysql.jdbc.Driver


url
jdbc:mysql://localhost:3306/javaee

....


2.10.6 使用Servlet作为控制器

2.11 JSP2的自定义标签
在JSP规范的1.1版中增加了自定义标签规范,自定义标签是一种非常优秀的表现层组件技术。
JSP 2规范简化了标签库的开发,步骤:
1.开发自定义标签处理类
2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库可包含多个标签。
3.在JSP文件中使用自定义标签

2.11.1 开发自定义标签类
自定义标签类应该继承一个父类:javax.servlet.jsp.tagext.SimpleTagSupport。
如果标签包含属性,每个属性都有对应的getter和setter方法。
重写doTag()方法,这个方法负责生成页面内容。
ex:
public class HelloWorldTag extends SimpleTagSupport{
      public void doTag() throws JspException, IOException{
                //获取页面输出流,并输出字符串
                getJspContext().getOut().write("Hello World "+new java.util.Date());
      }
}

2.11.2 建立TLD文件
TLD:Tag Library Definition
ex:
mytaglib.tld

   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">
   A tag library exercising SimpleTag handlers.
   1.0
   mytaglib
   http://tomcat.apache.org/mytaglib
   
       Outputs Hello, World
       helloWorld
       jsp2.examples.simpletag.HelloWorldSimpleTag
       empty
   



body-content子元素:
tagdependent:指定标签处理类自己负责处理标签体。
empty:指定该标签只能作为空标签使用
scriptless:指定该标签的标签提可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。

dynamic-attributes:指定该标签是否支持动态属性。
参考:apache-tomcat-7.0.39/webapps/examples/WEB-INF/jsp2

2.11.3 使用标签库
在JSP页面中确定指定的标签需要两点。
>标签库URI:确定使用哪个标签库。
>标签名:确定使用哪个标签库。

使用步骤:
>导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来。
<%@taglib uri="tagliburi" prefix="tagPrefix" %>
>使用标签:在JSP页面中使用自定义标签。




ex:
<%@taglib uri="http://tomcat.apache.org/mytaglib" prefix="mytag" %>



2.11.4 带属性的标签
必须定义getter和setter方法
tld实例:
   
       Populates the page context with a BookBean
       findBook
       jsp2.examples.simpletag.FindBookSimpleTag
       empty
       
           var
           true
           true
       

   

   
       
           Takes 3 fragments and invokes them in a random order
       

       shuffle
       jsp2.examples.simpletag.ShuffleSimpleTag
       empty
       
           fragment1
           true
           true
       

       
           fragment2
           true
           true
       

       
           fragment3
           true
           true
       

   

name:设置属性名,子元素的值必须是字符串内容。
requirement:设置该属性是否为必须属性,true/false
fragment:设置该属性是否支持JSP脚本,true/false
rtexprvlaue: Runtime Expression Value 是否可以通过动态计算指定。

JSTL和DisplayTag

2.11.5 带标签体的标签
ex:
public class IteratorTag extends SimpleTagSupport{
      private String collection;
      private    String item;
      //省略getter/setter
      public void doTag() throws JspException, IOException{
             //从page scope中获取属性名为collection的集合
             Collection itemList = (Collection)getJspContext().getAttribute(collection);
             for(Object s:itemList){
                     //将集合的元素设置到page范围
                     getJspContext().setAttribute(item, s);
                  //输出标签体
                     getJspBody().invoke(null);
          }
      }
}

tld:
scriptless

jsp:


       ${pageScope.item}




2.11.6 以页面片段作为属性的标签
>标签处理类中定义类型为JspFragment的属性,该属性代表了“页面片段”
>使用标签库时,通过动作指令为标签库属性指定值。

ex:
public class FragmentTag extends SimpleTagSupport{
      private JspFragment fragment;
      //getter/setter省略
      @Override
      public void doTag() throws JspException, IOException{
                JspWrite out = getJspContext().getOut();
             out.println("

");
             out.println("

下面是动态传入的JSP片段

");
             fragment.invoke(null);
             out.println("
");
      }
}

tld:和普通的一致

jsp:

       
                     
       




       
                      ${pageContext.request.remoteAddr}
       



2.11.7 动态属性的标签
在某些特殊情况下,我们需要传入自定义标签的属性个数是不确定的,属性名也不确定。需要使用动态属性的标签。
>标签处理类还需要实现DynamicAttributes接口。
>配置标签时通过子元素指定该标签支持动态属性。

ex:
public class DynaAttributesTag extends SimpleTagSupport implements DynamicAttributes
{
private ArrayList keys = new ArrayList();
private ArrayList values = new ArrayList();

@Override
public voi doTag() throws JspException, IOException{
JspWriter out = getJspContext().getOut();
out.println("
    ");
    for(int i = 0; iString key = keys.get(i);
    Object value = values.get(i);
    out.println("
  1. "+key+" = "+value+"
  2. ");
    }
    out.println("
");
}

@Override
public void setDynamicAttributes(String uri, String localName, Object value) throws JspException{
keys.add(localName);
values.add(value);
}
}

tld:

dynaAttr
DynaAttributesTag
empty
true


jsp:

你可能感兴趣的:(jsp,servlet,J2EE)