Winter framework 高效靈活的請求處理架構

來源:互聯網
上載者:User

為了深入的去瞭解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這兩個架構。有意向的留下資訊

註:轉載請註明來源

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.