Java Web

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相关类和接口

  1. Servlet接口: init、service、destroy、getServletConfig
  2. GenericServlet抽象类 和 HttpServlet抽象类
  3. ServletRequest:getAttribte、getContentLength、getInputStream、getParameter
  4. ServletResponse: getOutputStream、getWriter、setBufferSize、setContentLength
  5. HttpServletRequest:getCookies、getSession
  6. HttpServletResponse: addCookie、setStatus
  7. HttpSession: getId、invalidate(使当前会话失效)、setAttributes、getAttributeNames

web.xml配置

  • webApp自定义web.xml路径:WEB-INF/web.xml
1
2
3
4
5
6
<servlet>
<servlet-name>
<servlet-class>
<servlet-mapping>
<servlet-name>
<url-pattern>

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 工作原理

  1. 用户发出HttpServletRequest
  2. 请求经过一些了的Filter过滤器
    • 集成了SiteMesh插件之后,会先经过ActionContextCleanUp过滤器
  3. 调用FilterDispatcher
    • 控制器的核心
    • 询问ActionMapper是否需要调用Action
    • 如果需要,转发给ActionProxy
  4. ActionProxy通过ConfigurationManager,从struts.xml中获取需要调用的Action类
  5. ActionProxy创建ActionInvocation实例,该实例使用命名模式来调用。 该实例根据配置文件,添加相关的拦截器Interceptor
  6. Action执行完成后,ActionInvocation实例根据strtus.xml中的配置,找到相对应的返回结果
    • 返回结果为JSP或者FreeMaker模版
  7. 最后,HttpServletResponse通过web.xml 文件中配置的过滤器返回

Tips

  • FilterDispatcher对应控制层
    • web.xml 中启用过滤器fd
    • fd根据URL和struts.xml中的配置调用对应的action
  • Action对应模型层
    • 模型层处理请求参数,调用效应的业务逻辑,产生视图所需要的数据
  • Result对应视图层
  • 2.x优点:
    1. 集中配置来调度动作类
    2. 提供简单统一的表达式语言来访问内存数据
    3. 提供标准的验证框架、国际化框架
    4. 强大的标签
    5. 良好的Ajax
    6. 明确的错误报告,异常简单明了

持久化

Java中对象持久化的方式有:

  1. 序列化对象,将对象存放到格式化的文件中
  2. 将对象持久化到xml文件中
  3. 持久化到数据库中,一般为关系型数据库

持久化层框架Hibernate

核心接口:Configuration、SessionFactory、Session、Transaction、Query

  1. 初始化创建Configuration对象
    • 读取Hibernate.cfg.xml存放到Configuration
    • 读取mapping元素到Configuration
  2. 创建SessionFactory(SF)
    • Configuration对象创建SF,把配置信息注入SF
    • SF负责创建Session
    • Configuration使命结束
    • SF是全局唯一的,线程安全的
  3. 创建Session,建立数据库连接
    • Session对象操作实体对象
    • 操作转换为DB中的CRUD
    • session实例不是线程安全的,通过ThreadLocal来保证
  4. 创建Transaction,开始一个事务
    • CDU操作必须包含在事务中
  5. 利用Session的持久化方法将实体对象持久化到DB
    • 设计:DAO接口、DAO实现类、DAO工厂类
    • 接口:save、findById、delete、update
    • 实现:session、transaction
    • 工厂:通过接口使用实现类,解耦使用与实现
      • public static UserDAOInterface getUserDAOInstance(){ return new UserDAOImpl();}
    • SQL语句是在运行时由Hibernate自动生成的
  6. 提交结果并结束事务
  7. 关闭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文件