自己写的一个servlet Dispatchar,便于在osgi使用

osgi中暂时不支持springmvc等mvc框架,我们每写一个方法的时候,就需要新建一个servlet,这样很麻烦,所以想自己实现一个在osgi环境下能够运行的mvc框架,模仿springmvc或者struts2的框架。

1.首先我们看看web.xml的配置。里面定义了一个servlet,去过滤所有带.do的uri,初始化参数有controller类。当容器启动的时候,会执行servlet的init方法,然后把controller类初始化。以便后来调用。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	<display-name></display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>com.yyc.servlet.Dispatcher</servlet-class>
		<init-param>
			<param-name>login</param-name>
			<param-value>com.yyc.controller.Login</param-value>
		</init-param>
		<init-param>
			<param-name>main</param-name>
			<param-value>com.yyc.controller.Main</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</web-app>

2.Dispatchar.java继承了servlet,覆盖了init方法,doGet doPost方法。init把controller类实例化后放入map,如果后面有uir请求,去截取请求的uir获取里面的类,和方法名。

然后用java反射机制去执行。

package com.yyc.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Dispatcher extends HttpServlet {
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	Map<String , Object> controllers = new HashMap<String , Object>();

	private ServletContext application = null;//一个web应用程序对应一个ServletContext
	private ServletConfig config = null;  //一个Servlet对应一个ServletConfig

	@Override
	public void init() throws ServletException{

		//创建controller bean
		//读取web.xml配置参数 放入controllers
		application = getServletContext();
		config = getServletConfig();
		Enumeration<String> enumeration = config.getInitParameterNames();
		while(enumeration.hasMoreElements()){
			String className = enumeration.nextElement();
			//通过获取init获取参数
			BeanFactory(className, config.getInitParameter(className));
		}

		super.init();

	}
	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uri = request.getRequestURI();
		String classMethodName = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf(".do"));
		String className = classMethodName.split("_")[0];
		String methodName = classMethodName.split("_")[1];
		Object controller =  controllers.get(className);
		try {
			controller.getClass().getMethod(methodName,new Class[]{HttpServletRequest.class,HttpServletResponse.class}).invoke(controller.getClass().newInstance(),new Object[]{request,response});
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public void BeanFactory(String className,String classPath){
		try {
			Class<?> clazz = Class.forName(classPath);
			controllers.put(className, clazz.newInstance());
			System.out.println("初始化类"+className);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

下面是controller的类

login.java

package com.yyc.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Login {
	public void in(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("登陆!");
		response.sendRedirect("index.jsp");
	}

	public void out(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().print("you  logout!");
		System.out.println("退出!");
	}
}

main.java

package com.yyc.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Main {
	public void index(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("进入主页!");
	}
}

3.测试调用,使用的是tomcat

启动后,可以这样调用:

http://localhost:8080/dispatcher/login_in.do  login需要对应web.xml里面的servlet对应参数的值,in是对应类里面的方法名

http://localhost:8080/dispatcher/login_out.do

http://localhost:8080/dispatcher/main_index.do

这里实现了最简单的分发功能,目的是减少多余的配置 ,下次研究osgi‘  blueprint里面进行配置处理,以及依赖注入

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 15:36:44

自己写的一个servlet Dispatchar,便于在osgi使用的相关文章

怎样搭建一个完整的便于优化的网站

在网站搭建初期就完成所有便于优化的框架和内容能够缩短整个网站优化时间,一个完整的便于优化的网站包含:满足用户需求的程序和内容.便于优化的路径.优先层次的布局.附加价值的内容.长尾关键词布局.合理的内链设置. 学习要点 一.符合用户需求的程序和内容 1.程序.在做网站之前要考察什么程序是符合这个网站的,比如养羊,搜索养羊出现在百度首页的是养羊吧,那么说明搜索养羊的用户有讨论需求,那么论坛类型更加适合网站.但是如果搜索婚纱摄影,出现在百度第一名的是百度图片,就说明图片类的程序更加适合这种类型的网站.

一个Servlet中可以有多个处理请求的方法

BaseServlet 一个请求写一个Servlet太过复杂和麻烦,我们希望在一个Servlet中可以有多个处理请求的方法. 客户端发送请求时,必须给出一个参数,用来说明要调用的方法 方法的结构和service()方法的结构一样 初始版 当我们访问Servlet时,发生了那些操作? 首先是通过<url-pattern>找到<servlet-name>,通过<serlvet-name>最终找到<servlet-class>,也就是类名,在通过反射得到Serlv

第二天:tomcat体系结构和第一个Servlet

1.  打war包 2.  Tomcat体系再说明:   问题:如何去配置默认主机???    3.tomcat和servlet在网络中的位置 4.    servlet快速入门案例   1).开发servlet的三种方法     a.实现servlet接口     B.通过继承GenericServlet     C.通过继承HttpServlet 需求:请使用实现接口的方式来实现一个Servlet,要求该Servlet可以显示Hello world!!!,同时显示当前的时间. 步骤: A. 

如何正确地写好一个界面

写界面可以说是每位移动应用开发者的基本功,也是一位合格移动应用开发者绕不过去的坎.但就如不是每一位开发者都能够成为合格的开发者一样,本人在 不同的团队中发现,甚少有人能够编写出合格的UI代码:而非常奇怪的是,在很多的开发者论坛上看到我们移动开发者更多关注于某个控件或者是动画,但却很少 看到深入剖析UI机制,指导UI开发的文章. 由于界面涉及到的方面实在过于广泛,本文不可能事无巨细,一一道来,所以本文先立足于点,深入剖析iOS UI系统中不被重视却非常重要的机制,帮助本文读者对iOS的UI系统有整

JavaWeb中如何自己创建一个servlet

其实,一个Servlet就是一个java文件,所以创建servlet的过程其实就是创建一个类的过程,接下来我们创建一个Servlet. 比如我们创建一个类名叫作DateServlet的类,使得这个类继承(extends)HttpServlet 重写doGet()和doPost()方法. public class DateServlet1 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, Http

servlet基础,如何实现一个servlet,servletConfig,HTTPServlet,ServletContext

1.什么是servlet? *servlet 服务器端的小程序. *干什么用的?处理客户端请求的小程序 *JavaEE三大组件之一 *Servlet *Filter 过滤器 *listener 监听器 servlet流程 1.请求服务器 2.创建req,resp两个对象 3.去web.xml中寻找servlet 4.找到之后返回servlet信息 5.服务器去判断当前servlet实例是否已经被创建过呢? 6.没有创建过(服务器会创建一个实例(init)) 7.服务器拿着req,resp 去调用

eclipse-j2ee版编写第一个servlet程序

步骤如下: 1. jdk已经下载,配置好了.这个属于java的基础知识,这里我就不介绍了,不了解的,自己找资料. 2.下载一个tomcat,建议到官网下.解压成文件夹. 3.在window->perferences->service->runtime environment如图: 4.新建一个web项目,特别是选择版本上最好选择2.5,刚开始我选择3.0的版本就无法访问页面. 5.新建一个servlet文件,内容如下: package com.course1.servlet; impor

第四章:怎样搭建一个完整的便于优化的网站--------------------&gt;&gt;转至(卧牛SEO/武汉SEO http://blog.sina.com.cn/zhengkangseo )

在网站搭建初期就完成所有便于优化的框架和内容能够缩短整个网站优化时间,一个完整的便于优化的网站包含:满足用户需求的程序和内容.便于优化的路径.优先层次的布局.附加价值的内容.长尾关键词布局.合理的内链设置.学习要点 一.符合用户需求的程序和内容 1.程序.在做网站之前要考察什么程序是符合这个网站的,比如养羊,搜索养羊出现在百度首页的是养羊吧,那么说明搜索养羊的用户有讨论需求,那么论坛类型更加适合网站.但是如果搜索婚纱摄影,出现在百度第一名的是百度图片,就说明图片类的dede程序更加适合这种类型的

创建第一个servlet程序--HelloServlet

这篇文章是用来纪念我第一次创建一个Servlet程序,步骤我会写得详细点,也可以参考一下,后续我会将SpringMVC 跟ssh的搭建分别更新(ps:不忙的话我会更新) 工具:java jdk 1.6(或以上)   eclipse  tomcat7.0(6.0也行,步骤都差不多) 1.首先,我们先创建一个Dynamic Web Project 接下来给你创建的程序命名,选择你的服务器类型(我这里选择的是tomcat 7.0 所以版本是3.0),输入你的应用名后接下来next就可以了. 勾上红框内