smartFramework学习笔记之Action分发机制

1、整个 Web 应用中,只有一个 Servlet,就是 DispatcherServlet;

(1)获取请求方法与请求 URL,封装 为RequestBean;

(2)根据 RequestBean 从 Action Map 中获取对应的ActionBean(Action 类与 方法);

(3)解析请求 URL 中的占位符,生成对应的 Action 方法参数列表(二者顺序一致);

(4)用反射创建 Action 对象,并调用 Action 方法,最终获取返回值(Result);

(5)根据 Action 方法上的 @Response ,返回值转换为 JSON 格式或XML格式;

2、源代码中相关类介绍:++++++++++++++++++++++++++++++++++++++++++++++++

ActionHelper(初始化 Action 配置)》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)Map<RequestBean, ActionBean> actionMap = ActionHelper.getActionMap();

(2) ActionHelper 加载 classpath 中所有的 Action,继承BaseAction 的类,都视为 Action;

RequestBean》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)封装请求相关数据,url和请求方法;

ActionBean》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)封装Action 相关数据,类和方法,用反射执行;

Result》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)封装 Action 方法的返回值;

(2)可序列化为 JSON 或 XML;

WebUtil(Web 操作工具类)《《《》》》》》》》》》》》》》》》》》》》》》》》》》》

DataContext(数据上下文)《《《《《《《《《《《《《《《《《《《《《《《《《《《《

(1)封装数据上下文;

private static final ThreadLocal<DataContext> 
         dataContextContainer = new ThreadLocal<DataContext>();

ClassHelper》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)List<Class<?>> actionClassList = ClassHelper.getClassList(BaseAction.class);

(2)所有继承BaseAction的类都是action;

BeanHelper(初始化相关 Bean 类)》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)Object actionInstance = BeanHelper.getBean(actionClass);

(2)实现轻量级依赖注入功能后,无需调用耗性能的 newInstance() ;

PropsUtil(属性文件操作工具类)》》》》》》》》》》》》》》》》》》》》》》》》》》》》

private static final Properties configProps = PropsUtil.loadProps("smart.properties");

(1)在当前线程所在目录下,加载smart.properties属性文件;

ConfigHelper(获取属性文件中的属性值)》》》》》》》》》》》》》》》》》》》》》》》》》

(1)private static final String packageName = ConfigHelper.getProperty("package.name");

(2)package.name就是配置文件根目录下的位置;

ClassUtil(类操作工具类)》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

WebUtil(Web 操作工具类)》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

(1)WebUtil.getRequestParamMap 

(2)获取请求参数映射,k、v的形式,不再要求参数顺序必须一致;

SQLHelper(封装生成SQL 语句)《《《《《《《《《《《《《《《《《《《《《《《《《

DBHelper(即DatabaseHelper)《《《《《《《《《《《《《《《《《《《《《《《《《《《《

DatabaseHelper(封装数据库相关操作)《《《《《《《《《《《《《《《《《《《《《《《《

(1)连接数据库、开始事务、回滚等;

EntityHelper(初始化 Entity 结构)《《《《《《《《《《《《《《《《《《《《《《《《《《《

private static final Map<Class<?>, String> entityClassTableNameMap = new HashMap<Class<?>, String>();

(1)实体类 => 表名

 private static final Map<Class<?>, Map<String, String>> 
             entityClassFieldMapMap = new HashMap<Class<?>, Map<String, String>>();

(2)实体类 => (字段名 => 列名)

TransactionProxy (事务代理)《《《《《《《《《《《《《《《《《《《《《《《《《《《《

DataSet (封装了基于单表的增删改查操作,可能是DataAccessor)《《《《《《《《《《《《

DataAccessor(数据访问器)《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

DefaultDataAccessor(默认DataAccessor---实现类)《《《《《《《《《《《《《《《《《《

QueryRunner(org.apache.commons.dbutils)**********************************************

PluginHelper(初始化插件)《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

ContainerListener(容器监听器,专用于系统初始化与销毁工作)《《《《《《《《《《《《《《

(1)Servlet3.0中的监听器跟之前2.5的差别不大,唯一的区别就是增加了对注解的支持;

(2)@WebListener注解,可以取代web.xml文件中配置;

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

WebPlugin( 基于 Web 的插件抽象类,拥有 Plugin 接口的所有功能)《《《《《《《《《《

(1)Plugin接口的web类型的抽象类;

DispatcherServlet(前端控制器,分发器,唯一servlet)《《《《《《《《《《《《《《《《

Params(封装请求参数)《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

(1)@WebServlet等价于web.xml配置

<servlet>
<!-- 类名 -->
<servlet-name>DisplayHeader</servlet-name>
<!-- 所在的包 -->
<servlet-class>test.DisplayHeader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayHeader</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/DisplayHeader2</url-pattern>
</servlet-mapping>

(2)两个路径的效果是一样的,不互斥;

Handler(封装 Action 方法相关信息)《《《《《《《《《《《《《《《《《《《《《《《《《

(1)包含action类和方法,可用于获取都有哪些参数;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2、相关注解:

Bean注解(定义需要 IOC 容器管理的 Bean 类)《《《《《《《《《《《《《《《《《《《《《

Transaction注解( 定义需要事务控制的方法)《《《《《《《《《《《《《《《《《《《《《《

Entity注解(定义 Entity 类)《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3、补充一:提高反射性能

(1)actionMethod.setAccessible(true); // 取消类型安全检测(可提高反射性能);

(2)可以提高 20 倍以上的性能(据相关人事透露);

4、补充二:

@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {

(1)在注解@WebServlet 内增加  loadOnStartup = 0;

(2)loadOnStartup = 0,该Servlet (DispatcherServlet )会在容器启动时自动加载(即执行init);

   ServletContext context = config.getServletContext();
   ServletRegistration registration = context.getServletRegistration("default");
   registration.addMapping("/favicon.ico", "/www/*");

(1)getServletRegistration(“defualt”)获取Servlet 是由容器实现的 Default Servlet;

(2)由它处理www目录下静态文件,这样DispatcherServlet就不会拦截并处理他们;

 

转载于:https://my.oschina.net/u/3847203/blog/1810279

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值