Servlet简介
Servlet是由Web服务器加载,独立于平台和协议的Java应用程序。JSP改变了Servlet提供HTTP服务时的编程方式。
Servlet的生命周期
- 加载和实例化
- Servlet容器加载类
- 通过反射机制创建实例
- 初始化
- 调用Servlet的init方法
- 每个Servlet实例,只会调用一次init
- 参数为ServletConfig实例
- 执行
- 请求到来,容器针对该请求创建ServletRequest和ServletResponse
- 调用service()方法
- 从ServletRequest获取请求信息,处理请求,把处理结果放入到ServletResponse
- 销毁ServletRequest和ServletResponse
- service()会检查请求的类型,相应的调用doGet、doPost方法
- 清理
- Servlet实例需要从服务中移除时,容器调用destroy方法
- Servlet的整个生命周期,init和destroy只会调用一次,service()
Servlet相关类和接口
- Servlet接口: init、service、destroy、getServletConfig
- GenericServlet抽象类 和 HttpServlet抽象类
- ServletRequest:getAttribte、getContentLength、getInputStream、getParameter
- ServletResponse: getOutputStream、getWriter、setBufferSize、setContentLength
- HttpServletRequest:getCookies、getSession
- HttpServletResponse: addCookie、setStatus
- HttpSession: getId、invalidate(使当前会话失效)、setAttributes、getAttributeNames
web.xml配置
- webApp自定义web.xml路径:WEB-INF/web.xml
1 | <servlet> |
web.xml关键元素说明
- welcome-file-list:tomcat按顺序查找欢迎页
- listener: 注册监听器,用于初始化Spring框架
- error-page:根据error-code或者exception-type指定location
struts.properties
- 放置在src路径下;编译部署后,位于WEB-INF/classes 路径下
- 设置国际化编码、devMode、locale、theme等
struts.xml
- 位置同struts.properties
- 主要用于配置Action和Http请求的关系
- package:命名空间定义
- action
AJAX
Struts简介
Struts框架主要有两个版本: 1.x和2.x,都遵循MVC思想。1.x版本性能高效、低松耦合、低侵入,但存在如下缺点:
- 耦合
- 麻烦
2.x版本是一个全新的框架,将Struts技术与WebWork技术结合,功能更加灵活。
Struts 2 工作原理
- 用户发出HttpServletRequest
- 请求经过一些了的Filter过滤器
- 集成了SiteMesh插件之后,会先经过ActionContextCleanUp过滤器
- 调用FilterDispatcher
- 控制器的核心
- 询问ActionMapper是否需要调用Action
- 如果需要,转发给ActionProxy
- ActionProxy通过ConfigurationManager,从struts.xml中获取需要调用的Action类
- ActionProxy创建ActionInvocation实例,该实例使用命名模式来调用。 该实例根据配置文件,添加相关的拦截器Interceptor
- Action执行完成后,ActionInvocation实例根据strtus.xml中的配置,找到相对应的返回结果
- 返回结果为JSP或者FreeMaker模版
- 最后,HttpServletResponse通过web.xml 文件中配置的过滤器返回
Tips
- FilterDispatcher对应控制层
- web.xml 中启用过滤器fd
- fd根据URL和struts.xml中的配置调用对应的action
- Action对应模型层
- 模型层处理请求参数,调用效应的业务逻辑,产生视图所需要的数据
- Result对应视图层
- 2.x优点:
- 集中配置来调度动作类
- 提供简单统一的表达式语言来访问内存数据
- 提供标准的验证框架、国际化框架
- 强大的标签
- 良好的Ajax
- 明确的错误报告,异常简单明了
持久化
Java中对象持久化的方式有:
- 序列化对象,将对象存放到格式化的文件中
- 将对象持久化到xml文件中
- 持久化到数据库中,一般为关系型数据库
持久化层框架Hibernate
核心接口:Configuration、SessionFactory、Session、Transaction、Query
- 初始化创建Configuration对象
- 读取Hibernate.cfg.xml存放到Configuration
- 读取mapping元素到Configuration
- 创建SessionFactory(SF)
- Configuration对象创建SF,把配置信息注入SF
- SF负责创建Session
- Configuration使命结束
- SF是全局唯一的,线程安全的
- 创建Session,建立数据库连接
- Session对象操作实体对象
- 操作转换为DB中的CRUD
- session实例不是线程安全的,通过ThreadLocal来保证
- 创建Transaction,开始一个事务
- CDU操作必须包含在事务中
- 利用Session的持久化方法将实体对象持久化到DB
- 设计:DAO接口、DAO实现类、DAO工厂类
- 接口:save、findById、delete、update
- 实现:session、transaction
- 工厂:通过接口使用实现类,解耦使用与实现
public static UserDAOInterface getUserDAOInstance(){ return new UserDAOImpl();}
- SQL语句是在运行时由Hibernate自动生成的
- 提交结果并结束事务
- 关闭Session,与DB断开连接
hibernate.cfg.xml详解
- JDBC配置
- C3P0连接池:
- Hibernate实现类一个插件结构,可以继承第三方连接池
- Hibernate提供类对C3P0的内嵌支持
- 可以配置:最大/小连接数、超时时长、缓存statement数量
- JNDI数据源
- 二级缓存属性:
- 一级缓存是Session级,事务范围级的,由Hibernate自动控制
- 二级缓存是由SessionFactory管理的进程级缓存,可动态加载和卸载
- 二级缓存属性:
hibernate.cache.provider_class,hibernate.cache.use_query_cache,hibernate.cache.query_cache_factory
等
- 事务属性:
- Hibernate只实现了对JDBC的轻量级封装,本身未提供事务管理
- 依赖于JDBC或者JTA事务管理功能
hibernate.transaction.factory_class
指定工厂类
*.hbm.xml详解
- 映射文件结构
hibernate-mapping
是根元素,设置子元素类的共有属性class
声明一个持久化类id
映射标识属性- 经验表明自然主键很容易出现问题,一般使用代理主键
- uuid:长度32位的16进制字符串,由IP、JVM启动时间(精确到1/4秒)、系统时间、JVM中的唯一计数器值生成
property
元素映射普通属性- 映射集合元素
- 关联关系映射
- todo
- Tips:MiddleGen插件可以自动生成类和mapping文件