`
xiang37
  • 浏览: 433082 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

系统认知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")
	@Override
	public 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{

	@Override
	public void sessionCreated(HttpSessionEvent event) {
		System.out.println("welcome");
		OnlineCount.raise();
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		System.out.println("bye");
		OnlineCount.reduce();
	}

}
 

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

 

 

ServletContextListener
ServletContextAttributesListener
HttpSessionListener
HttpSessionAttributesListener

 

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

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

 

HttpSessionBindingListener

 

 HttpSessionBindingListener这个接口有两个方法:

 

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

	@Override
	public 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;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println(filterConfig.getFilterName());
		Enumeration<?>  names = filterConfig.getInitParameterNames();
		String name = null;
		while(names.hasMoreElements()){
			name = (String) names.nextElement();
			//从filter的参数中设置coding
			if("encoding".equals(name)){
				coding = filterConfig.getInitParameter(name);
			}
		}
		if(coding == null){
				throw new InitException("请初始化编码");
		}
	}

	@Override
	public 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");
		//提交到下一个filter
		chain.doFilter(request, response);
	}

	@Override
	public 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);
	}
}
 

 

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

分享到:
评论

相关推荐

    javaee实验考察项目结课项目 纯servlet 无后端框架 网盘项目

    本项目是一个基于JavaEE技术的网盘系统,完全使用Servlet进行开发,没有依赖任何后端框架。Servlet是Java Web开发中的核心组件,它用于处理HTTP请求,提供动态内容。在这个项目中,Servlet被用来构建服务器端的业务...

    基于ZigBee+ESP32+MQTT+EMQX+TomCat+Servlet接口+MySQL+Androidapp的物联网课程设置.zip

    二、课设简介我的课设想法因为自己已经大三了,也不年轻了,技术也学得很广泛也很烂(物联网专业也算得上是一个万金油专业),综合自己学过的技术和对自己专业的认知,当时萌生了做一个很普通的适合物联网三层架构...

    smbms静态资源(超市管理系统)

    【标题】"smbms静态资源(超市管理系统)"指的是一...理解这个系统涉及到对Java Web开发、前端开发以及超市业务流程的综合认知。开发者需要关注如何有效地整合这些静态资源,以创建一个高效、用户友好的超市管理界面。

    基于Java+SQL电子通讯录系统源码.zip

    这个系统涵盖了Java编程语言的基础知识、SQL数据库管理和数据操作以及用户界面设计等多个核心领域。下面将详细阐述其中涉及的主要知识点: 1. **Java基础**:作为系统的后端语言,Java提供了面向对象的编程模型,...

    java项目之实验教学管理系统源码.zip

    《Java项目:实验教学管理系统源码解析》 Java项目中的实验教学管理系统源码是一份珍贵的学习资源,它为我们...通过逐个剖析这些文件和目录,开发者可以逐步构建起对整个系统运作机制的认知,从而提升自己的编程能力。

    简单的基于MVC的JavaEE项目-学生管理系统(新手培训项目).zip

    这个学生管理系统是一个很好的实践平台,可以帮助初学者深入理解JavaEE开发流程,包括后端逻辑处理、数据库操作以及前端展示,同时也能提升对MVC模式和Web应用开发的整体认知。通过实际操作,你可以进一步巩固Java...

    基于SSH的车间信息管理系统源码.zip

    【标题】中的“基于SSH的车间信息管理系统源码”表明这是一个使用SSH(Spring、Struts、Hibernate)技术栈开发的车间...通过深入研究这个系统,可以提升对Java Web开发的整体认知,为今后的实际工作打下坚实的基础。

    安卓java读取网页源码-smartHome:基于ZigBee+ESP32+MQTT+EMQX+TomCat+Servlet接口+MySQL+

    我的课设想法:因为自己已经大三了,也不年轻了,技术也学得很广泛也很烂(物联网专业也算得上是一个万金油专业),综合自己学过的技术和对自己专业的认知,当时萌生了做一个很普通的适合物联网三层架构思想的一个小...

    jsp毕业设计——jsp网上超市设计与实现(源代码+论文).zip

    3. **MVC模式**:网上超市系统很可能采用了Model-View-Controller架构,学习如何用JSP作为视图层,Servlet作为控制器,以及如何组织模型类。 4. **数据库设计**:涉及商品信息、用户信息、购物车、订单等表的设计,...

    简单的JAVAweb应用

    7. **数据库连接与JDBC**:虽然题目中没有明确提到,但很多JAVA Web应用都会涉及到数据库操作,学习如何使用JDBC进行数据库连接和查询是必要的。 通过实践这个简单的JAVA Web应用,你可以逐步建立起对JAVA Web开发...

    一个很好的JSP 教案

    本教程“一个很好的JSP教案”是为大专、高职等层次的学生或初学者设计的,旨在帮助他们掌握JSP的基础知识和实际应用。通过这份教案,学习者可以深入理解JSP的工作原理,以及如何在实际项目中运用这些知识。 ### JSP...

    java开发英文自我介绍.pdf

    虽然实际工作经验不多,但作者拥有四年的军事生活经历,培养了自己的自信心、职业精神和扎实的学术基础知识。 五、个人素质 作者具有良好的个人素质,包括自信心、职业精神、自律、守时、诚实、负责任等。作者还...

    网上书店 jsp附有源码

    本项目虽然没有明确提到使用完整的J2EE框架,但其核心组件(如Servlet和JSP)是J2EE的一部分。 4. Tomcat:Tomcat是一款开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages的相关规范。在本项目中,...

    Java面试题集最全版开发入门.pdf

    【Java面试题集最全版开发入门.pdf】涵盖了多个Java及相关技术领域的面试知识点,包括技巧篇、智力篇、Java篇、JSP篇、Servlet篇、应用服务器篇、J2EE和MVC篇、设计模式篇、Hibernate性能优化篇以及数据库篇。...

    Java开发实战经典和疯狂Java讲义

    对于初学者来说,这是一本很好的入门书籍,能帮助他们快速建立起对Java编程的整体认知。 《Java开发实战经典》则由李兴华编写,这本书更注重实践与案例,旨在提升读者的实战能力。书中不仅覆盖了Java语言的基本知识...

    JAVA面试问题

    - **示例回答**:“我希望在未来几年内成为一名高级软件工程师,并逐步承担更多的技术和管理职责。我计划通过参与更多的项目来提升我的技术水平,同时也希望能够带领团队一起成长。” #### 二、知识、经验和专业...

    计算机科学与技术_基于JavaWeb的社会公共常识科普网的设计与实现.docx

    - 系统可以发布问卷调查,收集用户对于某些社会公共常识的认知情况。 - 通过对调查结果的分析,可以了解公众的需求和反馈,进而优化科普内容。 5. **公共知识分类管理**: - 对科普内容进行分类管理,便于用户...

    GoodProject Maven Webapp.zip

    JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页...

    J2EE 企业及测试案例(设计框架应用开发)

    《J2EE企业及测试案例(设计框架应用开发)》是一个综合性的学习资源,主要针对J2EE平台上的企业级应用程序开发和测试。...通过深入学习,你可以构建起对J2EE开发的全面认知,并有能力参与企业级项目的开发和测试工作。

    overview-frame.rar_overview

    综上所述,"overview-frame.htm" 文件很可能包含了以上这些方面的详细概述,帮助开发者建立起对Java架构的整体认知,无论是初学者还是有经验的开发者,都能从中受益。学习并理解这些知识点,将有助于提升编程技能,...

Global site tag (gtag.js) - Google Analytics