`
18211103738
  • 浏览: 82304 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

JFinal处理请求的流程

阅读更多

①从web.xml文件中可以看出jfinal框架本质上是一个Filter

<!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>
	<display-name>jfinal</display-name>
  
	<filter>
		<filter-name>jfinal</filter-name>
		<filter-class>com.jfinal.core.JFinalFilter</filter-class>
		<init-param>
			<param-name>configClass</param-name>
			<param-value>com.demo.config.DemoConfig</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>jfinal</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

 

②JFinalFilter重写了doFilter方法,所有的处理都在该方法中完成

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)res;
		request.setCharacterEncoding(encoding);
		
		String target = request.getRequestURI();
		if (contextPathLength != 0)
			target = target.substring(contextPathLength);
		
		boolean[] isHandled = {false};
		try {
			handler.handle(target, request, response, isHandled);
		}
		catch (Exception e) {
			if (log.isErrorEnabled()) {
				String qs = request.getQueryString();
				log.error(qs == null ? target : target + "?" + qs, e);
			}
		}
		
		if (isHandled[0] == false)
			chain.doFilter(request, response);
	}

 

 Handler的实现类


 

 

③Hander接口有多个实现类,我们分析ActionHandler的handler()方法

 

/**
	 * handle
	 * 1: Action action = actionMapping.getAction(target)
	 * 2: new ActionInvocation(...).invoke()
	 * 3: render(...)
	 */
	public final void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		if (target.indexOf(".") != -1) {
			return ;
		}
		
		isHandled[0] = true;
		String[] urlPara = {null};
		Action action = actionMapping.getAction(target, urlPara); //根据ActionMapping中的映射获取处理当前请求的Action
		
		if (action == null) {
			if (log.isWarnEnabled()) {
				String qs = request.getQueryString();
				log.warn("404 Action Not Found: " + (qs == null ? target : target + "?" + qs));
			}
			renderFactory.getErrorRender(404).setContext(request, response).render();
			return ;
		}
		
		try {
			Controller controller = action.getControllerClass().newInstance(); //实例化Controller处理类
			controller.init(request, response, urlPara[0]); //初始化Controller
			
			if (devMode) {
				boolean isMultipartRequest = ActionReporter.reportCommonRequest(controller, action);
				new ActionInvocation(action, controller).invoke();
				if (isMultipartRequest) ActionReporter.reportMultipartRequest(controller, action);
			}
			else {
				new ActionInvocation(action, controller).invoke(); //调用Controller中相应的处理方法(详见)
			}
			
			Render render = controller.getRender(); //根据Controller中的设置获取数据和视图的对应类Render
			if (render instanceof ActionRender) { //如果render是一个ActionRender,则再交给对应的Handler处理
				String actionUrl = ((ActionRender)render).getActionUrl();
				if (target.equals(actionUrl))
					throw new RuntimeException("The forward action url is the same as before.");
				else
					handle(actionUrl, request, response, isHandled);
				return ;
			}
			
			if (render == null) //如果render,则使用默认Render
				render = renderFactory.getDefaultRender(action.getViewPath() + action.getMethodName());
			render.setContext(request, response, action.getViewPath()).render(); //调用Render实现类的render()方法进行渲染
		}
		catch (RenderException e) {
			if (log.isErrorEnabled()) {
				String qs = request.getQueryString();
				log.error(qs == null ? target : target + "?" + qs, e);
			}
		}
		catch (ActionException e) {

 

Render的实现类


 

 

④在ActionInvocation的invoke()方法中,请求先经过一系列拦截器

/**
	 * Invoke the action.
	 */
	public void invoke() {
		if (index < inters.length)
			inters[index++].intercept(this);
		else if (index++ == inters.length)	// index++ ensure invoke action only one time
			// try {action.getMethod().invoke(controller, NULL_ARGS);} catch (Exception e) {throw new RuntimeException(e);}
			try {
				action.getMethod().invoke(controller, NULL_ARGS);
			}
			catch (InvocationTargetException e) {
				Throwable cause = e.getTargetException();
				if (cause instanceof RuntimeException)
					throw (RuntimeException)cause;
				throw new RuntimeException(e);
			}
			catch (RuntimeException e) {
				throw e;
			}
			catch (Exception e) {
				throw new RuntimeException(e);
			}
	}

 

  • 大小: 38.3 KB
  • 大小: 33.3 KB
分享到:
评论

相关推荐

    JfinalDemo

    Jfinal的核心组件包括:Controller、Model、View和Interceptor(拦截器),它们共同构成了一个完整的Web应用程序。Jfinal还支持多种数据库,如MySQL、Oracle等,并且提供了ActiveRecord模式,使得数据库操作更加便捷...

    JFinal+token基础demo

    反之,如果Token正确,服务器会继续处理请求。 5. **Token的过期与刷新**:为了增加安全性,Token通常设置有有效期。一旦过期,客户端需要重新获取新的Token。有时,服务器也会提供一个刷新Token的功能,允许客户端...

    JFinal-1.8 源码

    通过自定义控制器,开发者可以控制请求的处理流程。 2. `Model`:JFinal 的 Model 类是数据操作的基础,提供了自动映射数据库记录到 Java 对象的功能。通过注解或配置文件,可以定义字段与数据库列的对应关系,简化...

    JFinalDemo流程

    ### JFinalDemo流程详解 #### 一、JFinal框架简介 JFinal是一个基于Java语言的极速Web+ORM框架,它的核心设计理念在于简化开发过程、减少代码量、易于学习与使用,同时保持强大的功能和轻量级特性。通过采用MVC...

    JFinal技术架构浅析.doc

    - **Handler**:Handler是JFinal的核心组件之一,它负责对请求进行进一步处理,如解析参数、处理异常等。 - **Action**:Action 类对应于具体的业务逻辑,是对用户请求的响应。开发者可以定义自己的Action类,...

    jfinal 和 activiti整合例子

    在整个过程中,JFinal负责接收请求,展示页面,而Activiti则负责流程的流转和状态管理。 六、总结 JFinal与Activiti的整合,为Java Web应用提供了强大的业务流程管理能力。通过Jetty的嵌入式服务,整个应用变得...

    借助Jfinal的极速开发框架与Snaker流程引擎搭建一套基础应用平台

    1. **平台架构**:利用Jfinal作为后端框架,处理HTTP请求,实现业务逻辑,并通过Snaker进行流程控制。这样,Jfinal可以专注于快速响应用户请求,而Snaker则负责流程的流转和决策。 2. **业务流程**:对于需要审批或...

    jfinal 详解()

    1. **拦截器(Interceptor)**:JFinal的拦截器允许在请求处理前后插入自定义逻辑,实现权限控制、日志记录等功能。 2. **插件(Plugin)**:JFinal提供了丰富的插件支持,如ActiveRecord、Shiro安全框架、Quartz定时...

    jfinaldemo

    通过“jfinaldemo”实例,你可以逐步学习并实践这些步骤,理解JFinal如何将请求转发给控制器,如何通过Service处理业务,再到视图展示结果。同时,还可以了解JFinal的配置方式、数据库操作、模板引擎使用等,全面...

    jfinal demo

    在 JFinal 中,我们创建一个 Controller 类,继承 `com.jfinal.core.Controller`,然后定义对应的方法来处理请求。 **视图(View)** 视图层负责展示数据。JFinal 支持 Velocity 和 FreeMarker 两种模板语言,...

    springboot和JFinal的集成

    在项目中,可以定义JFinal的Controller类,这些类会处理HTTP请求,并通过Db和Record进行数据库操作。由于Spring Boot和JFinal都遵循了 MVC 模式,所以Controller可以很容易地与Spring Boot的Restful风格相结合,提供...

    jfinal 3.5离线手册

    1. Controller:控制器是处理请求的入口,通过注解定义路由,调用Service层处理业务逻辑。 2. Model:模型层封装了数据库操作,与数据库表进行映射,提供CRUD(创建、读取、更新、删除)功能。 3. Service:服务层...

    jfinal-3.3-all.rar

    4. **创建Controller**:按照JFinal的约定,创建Controller类,定义处理请求的方法。 5. **编写Model**:JFinal支持ActiveRecord模式,创建Model类并关联数据库表,方便进行CRUD操作。 四、JFinal 3.3 主要模块详解...

    jfinal-3.1-all

    3. 性能优化:通过对核心模块的重构,JFinal 3.1 在处理请求速度上有所提升,进一步降低了系统开销。 4. 日志升级:引入了新的日志框架,提供了更好的日志管理,便于开发者调试和追踪问题。 5. 异常处理:增强了异常...

    jfinal-1.1.3-src.zip

    通过阅读这些源码,我们可以了解到JFinal如何优雅地处理Web请求,如何利用AOP进行业务逻辑扩展,以及如何通过简单的配置实现数据库操作和模板渲染。这对于提升我们的Java Web开发能力,理解MVC架构的内在运作,甚至...

    jfinal-3.6-all

    6. **异步处理**:框架支持异步处理,可以处理高并发场景下的请求,提升系统响应速度。 7. **性能优化**:JFinal 3.6在性能方面进行了多方面的优化,如零XML配置、无反射操作、编译时扫描注解等,使得整体性能更上...

    Jfinal3.0文档+demo

    通过分析和运行这些Demo,开发者能快速上手,了解Jfinal3.0的实际运用技巧,如如何进行表单验证、如何处理Ajax请求、如何使用拦截器等。 此外,Jfinal3.0还强调模块化设计,鼓励开发者通过插件进行功能扩展。例如,...

Global site tag (gtag.js) - Google Analytics