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就不会拦截并处理他们;