首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

系统认知Servlet(晓得Servlet很多年了,没有系统认知过)

2012-10-30 
系统认知Servlet(知道Servlet很多年了,没有系统认知过)在现实工作中很少用servlet的,至少对于码农是这样!

系统认知Servlet(知道Servlet很多年了,没有系统认知过)

在现实工作中很少用servlet的,至少对于码农是这样!

其实只要是个系统,只要上个项目;都会涉及到servlet。当然jsp就是一个servlet等等

其实我们知道得最多的还是在搭建一个框架系统时,会常用到servlet做过滤。比如.do、.action、.jsf、.faces等等


也一直知道一个事情,就是应用程序启动的时候,可以调用一些远程的数据来初始化系统。很多庞大的框架就有这样的需求。下面写出自己的代码,

以前也只知道servlet可以extends ?httpServlet来实现一个servlet。

今天才知道一般情况下,我们有两种途径实现;还有一种就是extends ?GenericServlet。只不过httpServlet更为方法的识别http协议所提供的多种请求类型,而httpServlet本身就是从GenericServlet extends而来。

当然我们知道只要继承了servlet接口的类,自己封装好了方法都是可以用的。

?

?

?

  <servlet>  <servlet-class>com.xiva.servlet.HelloWorldServlet</servlet-class>  <servlet-name>hello</servlet-name>  <load-on-startup>#</load-on-startup>  <init-param>  <param-name>name</param-name>  <param-value>xiva</param-value>  </init-param>  </servlet>  <servlet-mapping>  <servlet-name>hello</servlet-name>  <url-pattern>/hello</url-pattern>  </servlet-mapping>

?

?

?

?

package com.xiva.servlet;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloWorldServlet extends GenericServlet{/** *  */private static final long serialVersionUID = 1L;@SuppressWarnings("unchecked")@Overridepublic void service(ServletRequest request, ServletResponse response)throws ServletException, IOException {//ServletContext context = this.getServletContext();Enumeration<String> enume = this.getInitParameterNames();while(enume.hasMoreElements()){System.out.println(enume.nextElement());}String name = this.getInitParameter("name");PrintWriter out;response.setContentType("text/html");out = response.getWriter();out.println("<html><head><title>Hello</title></head>");out.println("<body><h>Hello World</h>");out.println(name+"<br/>");out.println(request.getRemoteAddr()+"<br/>");out.println(request.getRemoteHost()+"<br/>");out.println(request.getServerName()+"<br/>");out.println(request.getServerName()+"<br/>");out.println("</body></html>");}public void init(){System.out.println("Xiva Start");}}

?

?

需要注意的是servlet的单线程模式,现在已经?deprecated。

还有一点就是GenericServlet是implements ServletConfig接口的,但是我们在使用下面两个方法

?

getInitParameterNames()getInitParameter(String name)
?

时,需要使用GenericServlet中的方法,而不是先获取ServletConfig,再从ServletConfig中获取初始化的参数名和参数值了。

?

?

二 配置自己的监视器Listener

??首先是web.xml的配置

?

?

  <listener>  <listener-class>com.xiva.servlet.listener.HttpListenerDemo</listener-class>  </listener>

?

?其次是代码:

?

?

package com.xiva.servlet.listener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.xiva.OnlineCount;public class HttpListenerDemo implements HttpSessionListener{@Overridepublic void sessionCreated(HttpSessionEvent event) {System.out.println("welcome");OnlineCount.raise();}@Overridepublic void sessionDestroyed(HttpSessionEvent event) {System.out.println("bye");OnlineCount.reduce();}}
?

监听器是从servlet上下文中接收通知事件的对象,在servlet2.3的规范中有四种监听器:

?

?

ServletContextListenerServletContextAttributesListenerHttpSessionListenerHttpSessionAttributesListener

?

熟悉Spring的朋友,可能就清楚其监听器ContextLoaderListener就是继承了ServletContextListener接口。

在网上得知还有一个监听器:

?

HttpSessionBindingListener

?

?HttpSessionBindingListener这个接口有两个方法:

?

@Overridepublic void valueBound(HttpSessionBindingEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void valueUnbound(HttpSessionBindingEvent arg0) {// TODO Auto-generated method stub}

?这两个方法什么时候调用呢?

在session做removeAttribute或者销毁时,调用valueUnbound

在session做setAttribute时,调用valueBound

?

了解jsf各组件中也有一个binging的属性,不知和这个binging监听器是否有关系,记得以后再研究!

?

三 配置自己的过滤器filter

?

?

package com.xiva.servlet.filter;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration;import java.util.Properties;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import com.xiva.exception.InitException;public class CharacterFilter implements Filter {private String coding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stubSystem.out.println(filterConfig.getFilterName());Enumeration<?>  names = filterConfig.getInitParameterNames();String name = null;while(names.hasMoreElements()){name = (String) names.nextElement();//从filter的参数中设置codingif("encoding".equals(name)){coding = filterConfig.getInitParameter(name);}}if(coding == null){throw new InitException("请初始化编码");}}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub//从资源文件中读取编码的设置this.setEncoding();if(coding == null){//如果初始化配置出错,则采取页面的编码方式coding = request.getCharacterEncoding();}request.setCharacterEncoding(coding);System.out.println("code");//提交到下一个filterchain.doFilter(request, response);}@Overridepublic void destroy() {// TODO Auto-generated method stub}public String getCoding() {return coding;}public void setCoding(String coding) {this.coding = coding;}private void setEncoding() throws IOException{Properties prop = new Properties();InputStream iStream = CharacterFilter.class.getClassLoader().getResourceAsStream("web.propertites");prop.load(iStream);String encoding = (String) prop.get("encoding");this.setCoding(encoding);}}
?

?

还在持续学习中,继续更新。

热点排行