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页面会很简洁,重点是写好两个配置文件。
相关文章推荐
- Struts2学习笔记01----初识struts2配置文件和相关基础知识
- struts2系列学习笔记(4)---------------Action的多样化配置之二
- struts2第十讲学习笔记,获取Servlet.api的两种方式
- Extjs学习笔记之二 初识Extjs之Form
- struts2学习笔记之六(Action访问servlet的API以及复制项目小技巧)
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
- struts2学习笔记之一(初识jsp)
- Java开发学习笔记之二:一个简单的Servlet
- 【Struts2学习笔记(8)】访问或添加request/session/application属性获取HttpServletRequest / HttpSession / ServletContex
- Struts2学习笔记04----ActionContext、ServletActionContext、ValueStack之间的关系
- J2EE Struts2 学习笔记001 ---- 初识struts 2
- struts2学习笔记---获得HttpServletResponse或HttpServletRequest对象的几种方法
- Extjs学习笔记之二 初识Extjs之Form
- struts2系列学习笔记(13)---------------Struts2国际化
- Struts2学习笔记三——Namespace与访问路径
- 实现Action---struts2学习笔记
- maven的学习笔记二、初识maven仓库配置文件
- Struts2学习笔记 国际化(Internationalization)
- 【Struts2学习笔记-6--】Struts2之拦截器
- Struts2 入门学习笔记(四)——输入校验