為了深入的去瞭解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這兩個架構。有意向的留下資訊
註:轉載請註明來源