您的位置:首页 > 编程语言 > Java开发

struts2 学习笔记之二(初识servlet)

2015-05-02 20:55 330 查看
1、简介
servlet通过一个框架扩展服务器的能力,采用请求-响应模式提供web服务,当客户机发送请求至服务器时,服务器将请求信息发送给servlet,servlet设概念车功能响应内容并将其传送给服务器,然后再由服务器将响应返回给客户端。
生命周期:
不存在servlet实例 --------> 服务器加载servlet ------> 创建servlet实例

-------->初始化servlet对应init方法----->调用service方法处理请求

-------->结束servlet调用destroy方法
配置web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>helloreader</servlet-name>
<display-name>This is the display name of my J2EE component</display-name>
<description>This is the description of my J2EE component</description>
<servlet-class>com.book.web3.helloreader</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>helloreader</servlet-name>
<url-pattern>/helloreader</url-pattern>
</servlet-mapping>

</web-app>
服务类helloreader.java
package com.book.web3;
public class helloreader extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
// TODO Auto-generated method stub
//super.service(req, res);
String name = req.getParameter("name");
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("<html>");

out.println("<head>");
out.println("<title>Hello Reader</title>");
out.println("</head>");

out.println("<body>");
out.println("<h1>Hello " + name + "!</h1>");
out.println("</body>");
out.println("</html>");
}
}
通过编写这个过程,我们大概可以知道servlet的调用过程。
tomcat收到应用请求之后,读取解析应用中的配置文件web.xml,然后如果在<servlet-mapping>里发现了请求,则根据这个url对应的servlet-name找到其具体的实现类,然后创建一个实例,开始提供服务。
<servlet>
<servlet-name>helloreader</servlet-name>
<servlet-class>com.book.web3.helloreader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloreader</servlet-name>
<url-pattern>/helloreader</url-pattern>
</servlet-mapping>
2、过滤器
一个可以传送请求和修改请求的对象,但它并不是一个servlet,它们是请求到达servlet前的预处理程序,在响应离开servlet后的后处理程序。
例:记录请求在服务器中的时间
package com.book.web3;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class TimeFilter implements Filter{
private FilterConfig config = null;

public void init(FilterConfig config) throws ServletException{
this.config = config;
}
@Override
public void destroy(){
config=null;
}
/*
* filter必须实现的方法
*/
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
long before = System.currentTimeMillis();
chain.doFilter(request, response);
long after = System.currentTimeMillis();
String name = "";
if(request instanceof HttpServletRequest){
name = ((HttpServletRequest)request).getRequestURI();
}
config.getServletContext().log(name+":"+(after-before) + "ms");
}
}
myeclipse里面没有找到new->filter这个选项,放佛的自己编写filter类
3、监听器
监听客户端的请求,服务器端的操作。通过监听器,可以自动激发一些操作。如监听用户在线数量
常见的监听器接口
ServletContextAttributeListener
监听对ServletContext属性的操作,比如增加,删除,修改
ServletContextListener
监听ServletContext,当创建ServletContext时,激发contextInitialized方法;当销毁servletcontext时,激发contextDestroyed方法
HttpSessionListener
监听HttpSession操作,创建一个session时,激发sessionCreated方法;当销毁一个session时,加法sessionDestroyed方法
HttpSessionAttributeListener
监听HttpSession中的属性操作。当在session中增加一个属性时,激发attributeAdded方法;当删除一个属性时,激发attributeRemove方法;属性重置时,激发attributeReplaced方法
例:计算在线用户数量
OnlineCounterListener.java

public class OnlineCounterListener implements HttpSessionListener {

/**
* Default constructor.
*/
public OnlineCounterListener() {
// TODO Auto-generated constructor stub
}

/**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
OnlineCounter.raise();
System.out.println(OnlineCounter.getOnline());
}

/**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
OnlineCounter.reduce();
System.out.println(OnlineCounter.getOnline());
}

}
OnlineCounter.java
public class OnlineCounter {
private static long online = 0;

public static long getOnline(){
return online;
}
public static void raise(){
online++;
}
public static void reduce(){
online--;
}
}
监听器就是一个处理类,而它的调用是由容器自动调用。当容器访问web.xml时候,检测到listener时就将其注册到系统中,当容器检测事件发生,会通知listener进行处理。
4、自定义JSP标签
使用标签可以处理定向请求,简化JSP页面的开发和维护。
自定义标签,封装了其他动态类型的机制。
自定义标签通常发布在标签库中,该库定义了一个标签集并包含实现标签的对象。
a、简介
标签
一种xml元素,名称和属性都是大小写敏感
标签库
由一系列功能相似,逻辑上相互联系的标签构成的集合
标签库描述文件
一个xml文件,简称TLD文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系,是一个配置文件,和web.xml类似。
标签处理类
java类,继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能
开发一个自定义标签,主要工作就是创建TLD文件和编写标签处理类
b、创建标签处理类
必须实现Tag接口的doStartTag和doEndTag方法。
当JSP引擎配到tag标签的开头时,调用doStartTag;碰到tag结尾时,doEndTag被调用。
例:打印字符串“Hello World!”
public class SimpleTag extends TagSupport {

/**
*
*/
private static final long serialVersionUID = 1L;

@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
try{
pageContext.getOut().print("Hello Reader!");
pageContext.getOut().print("<br>");
pageContext.getOut().print("I'm from custom Tag");
}catch(Exception e){
throw new JspTagException("SimpleTag" + e.getMessage());
}
return SKIP_BODY;//简单的tag没有body,所以返回SKIP_BODY
}

@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
return EVAL_PAGE;//余下的页面还要被计算,如果余下页面不被计算,则返回SKIP_PAGE
}

}
c、创建标签库描述文件
标签库描述文件简称TLD文件,用xml语言描述。TLD包括标签库中所有标签的描述,一般被JSP服务器用来校验标签的语法正确性,或者备用来开发新的标签。TLD文件的扩展名必须是.tld,而且必须放在当前WEB应用的WEB-INF目录或子目录中。
例:为上一节的处理类配合形成一个完整的标签
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>hellodemo</short-name>
<tag>
<name>hello</name>
<tag-class>com.book.web3.SimpleTag</tag-class>
<body-content>emtpty</body-content>
</tag>
</taglib>
d、使用自定义标签
配置web.xml,使用自定义标签<taglib>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

<filter>
<filter-name>timefilter</filter-name>
<filter-class>com.book.web3.TimeFilter</filter-class>
</filter>
<listener>
<listener-class>com.book.web3.OnlineCounterListener</listener-class>
</listener>
<servlet>
<servlet-name>helloreader</servlet-name>
<servlet-class>com.book.web3.helloreader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloreader</servlet-name>
<url-pattern>/helloreader</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri> /WEB-INF/helloreader.tld </taglib-uri>
<taglib-location>/WEB-INF/helloreader.tld</taglib-location>
</taglib>
</web-app>
注意:web.xml是有一定的顺序的,<taglib>不要放在web.xml的前面
测试:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/helloreader.tld" prefix="demo"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'tagTest.jsp' starting page</title>
</head>

<body>
<demo:hello/>
</body>
</html>
通过上述例子的演示,发现创建一个tag之后,jsp页面会很简洁,重点是写好两个配置文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐