框架配置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;
	}
	
	@Override
	public String execute() {
		// TODO Auto-generated method stub
		System.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 block
			e.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;
	}
	
	@Override
	public String execute() {
		// TODO Auto-generated method stub
		System.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 block
			e.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 block
			e.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这两个框架。有意向的留下信息

    注:转载请注明来源

文章结束给大家分享下程序员的一些笑话语录: 那是习惯决定的,一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器。历史(软件UI)的进步(改善)不是以个人意志(习惯)为转移的!

--------------------------------- 原创文章 By
框架和配置
---------------------------------

原文地址:https://www.cnblogs.com/jiangu66/p/3097660.html