• 框架配置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
    框架和配置
    ---------------------------------

  • 相关阅读:
    C++异常:exception
    C++关键字:explicit
    C++关键字:重学记录
    Unity jointmoto
    hashtable和hashmap
    Spring MVC 笔记 概述
    SQL上门2
    面试:A
    Java 初学者
    SQL上门
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3097660.html
Copyright © 2020-2023  润新知