为了深入的去了解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这两个框架。有意向的留下信息
注:转载请注明来源