Winter framework 高效灵活的请求处理框架

2024-05-13 20:08

本文主要是介绍Winter framework 高效灵活的请求处理框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了深入的去了解java的底层东西和hibernate和Struts2的原理,自己觉得写了个框架。

该框架集成了hibernate和Struts2的功能,当然没有依靠其jar包,是独立的一个框架。

运行原理:

我们知道Struts2 是用过滤器来进行工作的。那么我这个框架也是一样。

其中有一点,使用方法和Struts2不同,而且更加灵活。

首先声明一点,我没有看Struts2的源码,我只是靠自己理解,来写这个框架的。

主要的目的就是减少繁琐的操作,提高整体开发效率。


Winter framework 可以直接对数据库进行操作,自动生成sql语句,几乎不用用户写一句sql语句。


看下简单的配置:

第一步配置:

首先在web.xml文件中添加过滤器

 <filter><filter-name>request</filter-name><filter-class>org.pan.filter.RequestFilters</filter-class></filter><filter-mapping><filter-name>request</filter-name><url-pattern>*.action</url-pattern><url-pattern>*.jsp</url-pattern><url-pattern>*.pan</url-pattern><url-pattern>*.php</url-pattern><url-pattern>*.do</url-pattern><url-pattern>*.aspx</url-pattern><url-pattern>*.html</url-pattern></filter-mapping>

这里是给过滤器指定需要拦截的后缀,只拦截指定的,不拦截没有指定的。


然后在WEB-INF文件夹中建立request.xml 文件

这里提供了多种配置,

一个request节点对应一个页面,class 就对应处理的类。 可以不指定类,如果不指定类,那么 必须指定返回 页面,这将直接转发到指定的页面

起到了一个转发器的作用

也可以指定自定义的方法,默认执行execute

配置:

<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE pages PUBLIC "//UNKNOWN/" "request.dtd"> -->
<pages><request-encode>UTF-8</request-encode><response-encode>UTF-8</response-encode><!-- 首页  -->	<request page="index.jsp" class="com.pan.action.IndexAction"><result name="success">/index.jsp</result><result name="error">/error.jsp</result></request><request page="login.jsp" class="com.pan.action.LoginAction"><result name="success">/login.jsp</result><result name="error">/fail.jsp</result></request><!-- php  --><request page="test.php" class="com.pan.action.MyAction"><result name="success">/test.jsp</result><result name="error">/fail.jsp</result></request><!-- do request  --><request page="test.do" class="com.pan.action.MyAction"><result name="success">/test.jsp</result><result name="error">/fail.jsp</result></request><request page="index.html" class="com.pan.action.IndexAction"><result name="success">/test.jsp</result></request>
package com.pan.action;import java.util.List;import org.pan.sql.SqlSession;
import org.pan.sql.dao.ISession;
import org.pan.support.ActionSupport;public class IndexAction extends ActionSupport {private String userName;public void setUserName(String userName) {this.userName = userName;}@Overridepublic String execute() {// TODO Auto-generated method stubSystem.out.println(userName+"请求的用户名");//保存对象ISession session=new SqlSession();Order object=new Order();object.setAddress("北京");try {List<Order> orders=session.findByExample(object, true);System.out.println(orders.get(0).getCount()+"数量");System.out.println(orders.get(0).getAddTime()+"时间");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}addActionMessage("userName", userName);addActionMessage("welcome", "欢迎使用winterframework");return SUCCESS;}}

<request page="login.aspx" class="com.pan.action.IndexAction"><result name="success">/test.jsp</result></request><request page="login.xxoo" class="com.pan.action.IndexAction"><result name="success">/test.jsp</result></request><!-- 值配置请求 不配置返回面页 --><request page="123.html" ><result name="success">/test.jsp</result></request></pages>


然后配置自己的Action 处理类:

必须集成:ActionSupport 这个类,Struts2 中没有强制继承,我这里是必须基础并实现方法

示例类:

package com.pan.action;import java.util.List;import org.pan.sql.SqlSession;
import org.pan.sql.dao.ISession;
import org.pan.support.ActionSupport;public class IndexAction extends ActionSupport {private String userName;public void setUserName(String userName) {this.userName = userName;}@Overridepublic String execute() {// TODO Auto-generated method stubSystem.out.println(userName+"请求的用户名");//保存对象ISession session=new SqlSession();Order object=new Order();object.setAddress("北京");try {List<Order> orders=session.findByExample(object, true);System.out.println(orders.get(0).getCount()+"数量");System.out.println(orders.get(0).getAddTime()+"时间");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}addActionMessage("userName", userName);addActionMessage("welcome", "欢迎使用winterframework");return SUCCESS;}}
然后再页面中取值有很多种方式,

框架默认提供这个方法,是把值放入Session中

addActionMessage

在页面上取值,可以用框架提供的标签

例子:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://winter.baletu.com/" prefix="w" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML>
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>${test }${name }<w:property value="userName"></w:property><w:property value="welcome"></w:property></body>
</html>

主要运行过程:

web.xml 配置过滤器,然后由RequestFilters.java 来复制调度。

过滤器中代码很少,就调用了一下控制器:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//请求控制器RequestController controller=new RequestController(request, response, chain);try {controller.doFilter();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}

然后进入请求控制器来看看:

package org.pan.controller;import java.util.List;import javax.naming.ConfigurationException;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.pan.bean.Request;
import org.pan.bean.Result;
import org.pan.code.Configuration;
import org.pan.code.ActionManage;
import org.pan.support.ActionSupport;
import org.pan.util.ResultUitl;import com.sun.crypto.provider.RSACipher;/*** 请求控制器* @author Pan**/
public class RequestController {private HttpServletRequest request;private HttpServletResponse response;private FilterChain chain;public RequestController(ServletRequest request,ServletResponse response,FilterChain chain){this.request=(HttpServletRequest)request;this.response=(HttpServletResponse)response;this.chain=chain;}/*** 处理请求*/public void doFilter() throws Exception{String filepath=request.getServletPath().replace("/","");		//当前这个文件的名称//通过配置文件得到跳转对象和一些操作的方法Configuration configuration=new Configuration(request);Request rt=configuration.find(filepath);if(rt!=null){//调用请求对象管理器 的返回值 来确定 要转发到的页面//如果没有配置类路径,就当作转发器使用直接转发到结果页if(rt.getClassPath().equals("")){Result rs=ResultUitl.findResult(rt.getResults(), ActionSupport.SUCCESS);if(rs==null){chain.doFilter(request, response);}else{request.getRequestDispatcher(rs.getPath()).forward(request, response);}}else{ActionManage actionManage=new ActionManage(request,response,rt.getClassPath(),rt.getMethod());String result=actionManage.getResult();//寻找放返回值对应的页面List<Result> results= rt.getResults();boolean isDoFilter=false;	//是否已经跳转for (Result result2 : results) {if(result2.getName().equals(result)){//得到对应的路径String path=result2.getPath();//如果不是当前页的时候 就转发或者跳转if(!path.equals(filepath)){//默认用转发,否则会丢失数据isDoFilter=true;request.getRequestDispatcher(path).forward(request, response);}}}}}else {chain.doFilter(request, response);}}
}

请求管理器调用了,配置管理器,和Action管理器。

配置管理器用来读取request.xml 的配置信息,然后传入给Action管理器,

Action管理器来实例化用户Action,然后再调用转换器进行字段类型转换并赋值。

最后执行用户Action定义的方法,然后标志 SECUESS、INPUT、ERROR等...然后再进行转发,如果是当前面页就不进行转发,而是采取不处理的操作,

交给其他的拦截器去处理。

基本上配置和运行原理都是和Struts2差不多的。这是两天时间完成开发的。

需要源码的同学可以联系下我。Q:599194993

想找个人一起来继续完成这个框架,下一步打算支持hibernate和Spring这两个框架。有意向的留下信息

注:转载请注明来源

这篇关于Winter framework 高效灵活的请求处理框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986696

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python GUI框架中的PyQt详解

《PythonGUI框架中的PyQt详解》PyQt是Python语言中最强大且广泛应用的GUI框架之一,基于Qt库的Python绑定实现,本文将深入解析PyQt的核心模块,并通过代码示例展示其应用场... 目录一、PyQt核心模块概览二、核心模块详解与示例1. QtCore - 核心基础模块2. QtWid

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.