JavaWeb编程基础

OGNL表达式语句:

  • OGNL(Object DGraph Navigation Language):是一种强大的表达式语言,能够自动导航对象的结构并访问和设置对象数据
  • OGNL上下文相当于一个Map容器,在Map容器中可以保存任何类型的数据(对象、数组等)
  • 基本格式,如:

    JavaBean对象User{id:int; name:String}
    
    • 访问属性的方式为:

      #user.name
      

ONGL表达式语言的特点:

  • 支持对象方法的调用
  • 支持井台方法的调用
  • 支持变量的赋值
  • 可以操作 集合数据

Struts2中的OGNL:

  • 在Struts2中,OGNL上下文作用于Struts2中的ActionContext对象
  • ActionContext中的对象:

    • 值栈(根)、application、session、request、parameters、attr
    • 获取application中的对象:

      #application.name或#application.['name']
      
    • 获取request中的对象:

      #request.name或#request.['name']
      
    • 获取session中的对象:

      #session.name或#session.['name']
      
    • 获取parameters中的对象:

      #parameters.name或#parameters.['name']
      
    • 获取attr中的对象:

      #attr.name或#attr.['name']
      
  • 在JSP页面中获取对象的属性:

    
    
    • 注意:Struts2的JSP页面需要导入标签库:

      <%@taglib prefix="s" uri="/struts-tags"%>
      
  • 静态属性的调用方法如下:

    //通过@符号来标注
    @com.michale.djh.Bean@NAME
    
    • 注意:默认情况下,struts2不允许调用静态方法,需要在struts.xml文件中手动开启

      
      
  • 访问集合:

    • List集合:(有序集合),可以使用下标的方式访问,如:list[0]
    • Set集合:(无序集合),不能通过下标的形式访问
    • Map集合:键值对形式,通过key访问value:

      map.key 或 map.['key']
      
    • 获取所有的Key和value:

      map.keys //获取所有的Key
      map.values //获取所有的value
      
  • 集合的操作:

    collection.isEmpty//判断集合元素是否为空
    colloection.size()//获取集合的长度
    
  • 投影与选择:

    • 投影:对集合中列的操作,指将集合中的某一列数据都抽取出来形成一个集合,如:

      #list.{name} //获取一个包含多个学生对象集合的所有学生姓名
      
    • 选择:对集合中行的操作,指通过一定的条件获取集合中满足这一条件的的数据,所获取的行就是对集合中数据的选择操作,如:

      #list.{?#this.age>10}//获取所有年龄大于10的所有学生,"?"表示满足这一条件的所有对象
      
  • OGNL表达式中的操作符:
    • ?:获取满足指定条件的所有元素
    • ^:获取满足指定条件的所有元素中的第一个元素
    • $:获取满足指定条件的所有元素中的最后一个元素

Struts2的标签库

  • 数据标签:

    • property:用于获取数据值,并将数据值直接输出到页面中,其属性如下:
      • default:可选
      • escape:可选
      • escapeJavaScript:可选
      • value:可选
    • set:用于定义一个变量,可以为所定义的变量赋值及设置变量的作用域(application、request、session),set标签属性:

      • scope(String):可选,设置变量的作用域,其默认值是action
      • value(String):可选,设置变量的值
      • var(String):可选,定义变量的名称
      • set标签用法:

        
        
        
    • a:用于构建超链接,常用属性:
      • action(String):将超链接的地址指向action
      • href(String):超链接地址
      • id(String):设置HTML中的属性名称
      • method(String):如果超链接的地址指向action,method同时可以为action声明所调用的方法
      • namespace(String):可以为action声明命名空间
    • param:用于对参数赋值,属性如下:
      • name(String):设置参数名称
      • value(Object):设置参数值
    • action:用于执行 一个Action请求,可以将Action的返回结果输出到当前页面中,也可以不输出,其属性如下:
      • executeResult(String):是否使Action返回到执行结果,默认值为false
      • flush(Boolean):输出结果是否刷新,默认值为true
      • ignoreContextParams(Boolean):是否将页面请求参数传入被调用的Action,默认值为false
      • name(String):Action对象所映射的名称,也即是struts.xml中配置的名称
      • namespace(String):指定名称空间的名称
      • var(String):引用此action的名称
    • push:用于将对象或值压入到值栈中并放置到顶部,简化操作,用法如下:

      
      
    • date:用于格式化日期时间,可以对日期时间值进行指定的格式化样式格式化,包含的属性如下:
      • format(String):设置格式化日期的样式
      • name(String):日期值
      • var(String):格式化时间的名称变量,通过该变量可以对其进行引用
    • include:类似于JSP的include标签,添加了可以在目标页面中通过param标签传递请求参数的功能,用法如下:

      <%@include file="/pages/common/admin.jsp"%>
      
    • url
  • 控制标签:

    • if:

      • :可以单独使用
      • :配合使用
      • :配合使用
      • 使用方式:

          //test属性用于设置标签的判断条件,其值为布尔类型的条件表达式,如:
        expression1
        
        
        expression2
        
            ...
        
        expression3
        
        
    • iterator:可以遍历数组和集合类中的所有或部分数据(可以指定迭代数据的起始位置、步长以及终止位置来迭代集合或数组中的部分数据),其属性如下:
      • begin(Integer):指定迭代数组或集合的起始位置,默认值为0
      • end(Integer):指定迭代数组或集合的结束位置,默认值为集合或数组的长度
      • status(String):迭代过程中的状态
      • step(Integer):迭代的步长,默认值为1
      • value(String):指定迭代的集合或数组对象
      • var(String):设置迭代元素的变量,若指定此属性,那么迭代的变量将压入到值栈中

数据的验证机制:

  • 手动验证的实现: 在继承ActionSupport类的情况下,重写validate()方法,在该方法中进行验证
  • 验证文件的命名规则: 验证文件的名称必须是以下两种:(ActionName是Action对象的名称,AliasName为Action配置中的名称,也即是struts.xml配置文件中Action元素对应name属性的名称)
  • ActionName-validation.xml: 数据的验证会作用于整个Action对象中,并验证Action对象的请求业务处理方法,适用于验证处理的规则都相同的形式
  • ActionName-AliasName-validation.xml: 更加灵活。
  • 验证文件的编写风格:

    • 字段验证器编写格式: 如:验证用户名与密码(注意xml文件需要指定编码格式),其中name为需要检验的字段

      
          
          
              Please Input user name
          
          
          
              
              Please Input password
              
           
      
      
    • 非字段验证器编写格式: 如:用户名与密码验证

      
          
              password
              username
              Please Input text
          
      
      
      • 使用param标签传递字段参数,其参数的名称为fieldName,参数的内容为字段的名称
    • 对于字段验证时,通常使用字段验证器编写格式
  • 案例:

    • index.jsp:

       
          

      User Register

    • struts.xml:

      
      
       
          
          
              
                  success.jsp
               
          
      
      
    • UserAction.java:

      public class UserAction extends ActionSupport {
          private static final long serialVersionUID = 1L;
          private String name;
          private String password;
          private String description;
          private int sex=0;
          private String province;
          private String[] hobby;
      
          @Override
          public String execute() throws Exception {
              // TODO Auto-generated method stub
              return SUCCESS;
          }
      
          //Getter and Setter method
          ......
      }
      
  • 默认情况下,Struts2的验证框架验证失败后会返回input对应的页面

struts2的配置文件:

  • struts.xml:

    
    
     
        
        
            
                success.jsp
             
            
                login.jsp
                success.jsp
                    
        
     
    
  • web.xml:

    
    
        Struts 2 Rest Example
        
        login.jsp
        
        
            struts2
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        
        
            struts2
            /*
        
     
    

Hibernate:

  • Hibernate通过持久化类(.java)、映射文件(.hbm.xml)与配置文件(*.cfg.xml)操作关系型数据库
  • Hibernate三大类:
    • 配置类(Configuration): 负责管理Hibernate的配置信息以及启动Hibernate,包含数据库URL、数据库用户名、数据库用户密码、数据库驱动类及数据库适配器(dialect)
    • 会话工厂类(SessionFactory): 用于声称Session的工厂,保存了当前数据库中所有的映射关系,是[线程安全]的,为一个重量级对象,初始化创建过程会耗费大量的系统资源
    • 会话类(Session): 数据库持久化操作的核心,负责Hibernate所有的持久化操作,可以实现数据库的CRUD操作,但会话类并不是线程安全的,应避免多个线程共享一个Session
  • Hibernate通过读取默认的XML配置文件hibernate.cfg.xml加载数据库的配置信息,该配置文件被默认放于项目的classpath根目录下,如:

    //连接应用的MySQL数据库
    
    
    
        
            com.mysql.jdbc.Driver
            root
            java
            org.hibernate.dialect.MySQLDialect  //Hibernate方言
            true
                //打印SQL语句
                //映射文件
        
    
    
    • property元素的常用配置属性:
      • connection.driver_class:连接数据库的驱动
      • connection.url:连接数据库的URL地址
      • connection.username:连接数据库用户名
      • connection.password:连接数据库密码
      • dialect:设置连接数据库使用的方言
      • show_sql:是否在控制台打印SQL语句
      • format_sql:是否格式化SQL语句
      • hbm2ddl.auto:是否自动生成数据库表
  • Hibernate中的持久化类编成规则:
    • 实现一个默认的构造函数: 所有的持久化类中都必须含有一个默认的无参数构造方法,通过Constructor.newInstance()实例化持久类
    • 提供一个标识属性(option): 一般用于映射数据库表中的主键字段
    • 使用非final类(option): 使用final类,Hibernate就不能使用代理来延迟关联加载,会影响开发人员进行性能优化的选择
    • 为属性声明访问器(option): 持久化类的属性不能声明为public的,最好以private的set()和get()方法对属性进行持久化
  • Hibernate映射:

    • 映射文件的命名规则为:*.hbm.xml,如(User对象配置):

      
      
      
          
              //持久化类的唯一标识
                  
              
              
                  
              
              
                  
              
          
      
      
    • 元素包含一些可选的属性:
      • schema:指该文件映射表所在数据库的schema名称
      • package:指定一个包前缀
    • 元素用于指定持久化类和映射的数据库名,name属性需要指定持久化类的全限定的类名,table属性就是持久化类所映射的数据库表名
    • 元素用于持久化类的其他属性和数据表中非主键字段的映射,其属性有以下几个:
    • name:持久化类属性的名称,以小写字母开头
    • column:数据库字段名
    • type:数据库的字段类型
    • length:数据库字段定义的长度
    • not-null:该数据库字段是否可以为空,属性值为布尔变量
    • unique:该数据库字段是否唯一
    • lazy:是否延迟抓取
  • Hibernate数据持久化:

    • Hibernate的实例三种状态:
      • 瞬时状态(Transient)
      • 持久化状态(Persistent)
      • 脱管状态(Detached)
    • Hibernate工具类,避免Session的多线程共享数据问题, SessionFactory的获取:

      Configuration configuration = new Configuration.configure();
      SessionFactory factory = configuration.buildSessionFactory();
      
      • Configuration对象会自动加载Hibernate的基本配置信息,如果没有在configure()方法中指定加载配置XML文档的路径信息,Configuration对象会默认加载项目classpath下的hibernate.cfg.xml文件
      • HibernateUtil.java:(用于初始化Hibernate)

        public class HibernateUtil{
            private static final ThreadLocal threadLocal = new ThreadLocal();
            private static SessionFactory sessionFactory = null;
            static{
                try{
                    Configuration configuration = new Configuration.configure();
                    sessionFactory = configuration.buildSessionFactory();
                }cathc(Exception e){
                    e.printStackTrace();
                }
            }
            //get Session
            public static Session getSession() throws HibernateException(){
                Session session = (Session)threadLocal.get();
                if(session == null || !session.isOpen()){
                    if(sessionFactory == null){
                        rebuildSessionFactory();
                    }
                    session = (sessionFactory != null) ? sessionFactory.openSession : null;
                    threadLocal.set(session);
                }
                return session;
            }
            public static void rebuildSessionFactory(){
                try{
                    Configuration configuration = new Configuration.configure();
                    sessionFactory = configuration.buildSessionFactory();
                    }cathc(Exception e){
                    e.printStackTrace();
                }
            }
            //get SessionFactory
            public static SessionFactory getSessionFactory(){
                return sessionFactory;
            }
            //close Session
            public static void closeSession() throws HibernateException{
                Session session = (Session)threadLocal.get();
                threadLocal.set(null);
                if(session != null){
                session.close();
                }
            }
        }
        
    • 数据保存:

      • 数据的持久化过程:

        application->Configuration->SessionFactory->Session->数据操作->正常commit,失败rollback->close()
        
      • 开启事务:

        session.beginTransaction();
        
      • 执行数据库添加操作:

        session.save(user);
        
      • 事务提交:

        session.getTransaction().commit();
        
      • 事务回滚:

        session.getTransaction().rollback();
        
      • 注意:最后需要关闭session.
    • 查询数据:Session对象提供了两种对象装载的方法,即get()与load()方法

      • get()方法:装载对象后会立刻访问数据库,适用于不确定数据库中是否有匹配的记录存在时用
      • load()方法:返回对象的代理,只有在返回对象被调用时,Hibernate才会发出SQL语句去查询对象
      • 如:

        User user = (User)session.get(User.class, new Integer("1"));
        String name = user.getName();
        String sex = user.getSex();
        ...
        
    • 删除数据:delete()方法, 只有对象在持久化状态时才能执行delete()方法
  • 延迟加载: load方法或者设置property元素的lazy属性,如:

    
        
            
                
            
            
                
            
        
    
    
    • 通过上述方式的设置,用户的姓名属性就被设置成了延迟加载
  • Hibernate缓存:

    • 缓存分类:
      • 一级缓存(Session level):也称为内部缓存,生命周期与Session相同
      • 二级缓存(SessionFactory level):用于数据更新频率低,系统频繁使用的非关键数据,以防止用户频繁访问数据库,过度消耗资源
      • 在Hibernate中不同的Session之间是不能共享一级缓存的,也即是一个Session不能访问其他Session在一级缓存中的对象缓存实例
    • 利用EHCache作为Hibernate的二级缓存的配置,如:(查询产品信息)

      • hibernate.cfg.xml:

        
            
                ...
                true//开启二级缓存
                org.hibernate.cache.EhCacheProvider
            
        
        
      • 在持久化类的映射中需要指定缓存的同步策略,关键代码如下:

        
            
                 //指定的缓存的同步策略
                ...
            
        
        
      • 缓存的配置文件放在classpath目录下ehcache.xml(在Hibernate的zip包下的etc目录中可查看到),代码如下:

        
            
            
        
        
  • 实体关联关系映射:

    • 多对一单向关联:

      • product与factory表:

        tb_product{id, name, price, factoryid}
        tb_factory{factoryid, name}
        
      • 在产品对象的映射文件中建立多对一的关联,代码如下:(Product类引用Factory类)

        
            
                   //id 值
                
            
                //product name
                
            
               //product price
                
            
                //多对一关联映射
                 //映射字段
            
            
        
        
      • 单向多对一关联时,只能通过主控方对被动方进行级联更新
    • 多对一双向关联:

      • Product与Factory类:

        Product{int:id, String:name, double:price, Factory:factory}
        Factory{int:factoryid, String:factoryName, Set:products}
        
      • 映射代码:

        
            
                 //id 值
                    
                
                 //product name
                    
                
                   //product price
                    
                
                    //定义一多映射
                    
                    
                
            
        
        
  • 级联操作:

    • 指的是当主控方执行save、update、delete操作时,关联对象(被控方)是否进行同步操作,可以通过cascade属性来设置,其属性值如下:
      • all:所有情况下均采用级联操作
      • none:默认的参数,所有情况下均不采用级联操作
      • save-update:在执行save-update方法时执行级联操作
      • delete:在执行delete方法时执行级联操作
    • 映射文件的配置,如:

      
          
              ...
              
          
      
      
  • HQL(Hibernate Query Language):Hibernate查询语言

    • 完全面向对象的查询语言,提供了更加面向对象的封装,返回的是匹配的单个实体对象或多个实体对象的集合
    • HQL语句区分大小写(由于查询的是对象,对象是Java类,而Java大小写敏感)
    • HQL的基本语法:

      select "对象.属性名"
      from "对象"
      where "过滤条件"
      group by "对象.属性名" having "分组条件"
      order by "对象.属性名"
      
      • 如:

        select * from Employee emp where emp.flag='1'
        等价于
        from Employee emp where emp.flag='1'
        
  • 通过from子句查询指定字段数据,如:

    select Person(id, name) from Person per
    
  • 如:查询Employee对象的所有信息

    List employees = new ArrayList();
    Session session = null;
    session = HibernateUtil.getSession();
    String hql = "from Employee employee";
    Query  query = session.createQuery(hql); 
    employees = query.list();
    HibernateUtil.closeSession();
    
  • HQL参数邦定机制:

    • 参数邦定机制可以使查询语句和参数具体值相互独立,不但可以提高程序的开发效率,还可以有效地防止SQL的注入攻击
    • HQL提供动态赋值的两种实现方式:

      • 利用顺序占位符”?”替代具体参数,如:(类似于JDBC中的PreparedStatement对象的操作方式)

        //查询性别为"male"的员工信息
        session = HibernateUtil.getSession();
        String hql = "from Employee employee where employee.sex=?";
        Query query = session.createQuery(hql);
        query.setParameter(0, "male");
        employees = query.list();
        
      • 利用引用占位符”:parameter”替代具体参数,引用占位符是”:”与自定义参数名的组合,如:

        session = HibernateUtil.getSession();
        String hql = "from Employee employee where employee.sex=:sex";
        Query query = session.createQuery(hql);
        query.setParameter("sex", "male");
        employees = query.list();
        
  • 排序查询:使用的是对象的属性,如:

    //以年龄从小到大排序
    from Employee employee order by employee.age desc
    
  • 聚合函数,类似于SQL,如:

    select avg(employee.age) from Employee employee
    

Spring框架:

  • 由七大核心模块组成:
    • Core:支持工具类,bean容器,实现了IoC模式,包含重要的BeanFactory类
    • Context:继承BeanFactory类,Context验证、JNDI、EJB、E-mail等
    • AOP:元数据及动态代理实现
    • DAO:事务基础设施、JDBC、DAO,简化数据库厂商的异常错误
    • ORM:支持Hibernate、iBatis与JDO
    • WEB:建立在Context之上,提供了Servlet监听器的Context和Web应用的上下文
    • MVC:Web MVC框架、Web视图,实现控制逻辑和业务逻辑清晰的分离
  • Spring内置了日志组建log4j.jar,所以在使用Spring之前需要对log4j进行简单的配置,即在src根目录下创建log4j.properties 属性文件,代码如下:

    #输出级别,输出错误信息,输出源为标准出源stdout
    log4j.rootLogger=WARN.stdout
    #将stdout输出到控制台
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    #日志输出的布局类
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #指定日志输出内容的格式
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]-%m %n
    
  • 使用BeanFactory管理bean

    • BeanFactory通过从XML配置文件或属性文件中读取JavaBean的定义,来实现JavaBean的创建、配置和管理,其中XmlBeanFactory可以通过流行的XML文件格式读取配置信息来装载JavaBean,如:

      Resource resource = new ClassResource("applicationContext.xml");
      BeanFactory factory =  new XmlBeanFactory(resource);
      Test test = (Test)factory.getBean("test");
      
    • applicationContext.xml:

      
      
      
          
      
      
    • Spring中bean的生命周期:

      实例化JavaBean、初始化JavaBean、使用JavaBean、销毁JavaBean
      
  • 依赖注入:IoC(Inversion of Control):控制反转,依赖注入

    • 依赖注入的三种实现类型(Spring支持后两种):

      • 接口注
      • Setter注入,如:

        package com.michael.djh.User;
        public class User{
            private String name;
            private Integer age;
            //Getter与Setter方法
            ...
        }
        
        则Spring的配置文件applicationContext.xml为:
        
            
                Michael
            
            
                20
            
        
        
        主程序如下即可获取bean对象:
        Resource resource = new ClassPathResource("applicationContext.xml");    //load configuration file
        BeanFactory factory = new XmlBeanFactory(resource);
        User user = (User)factory.getBean("user");  //user.getName()、user.getAge()即可得到值
        
      • 构造器注入
  • Spring中的自动装配方式:
    • no属性:这是autowire采用的默认值,必须使用ref直接引用其他的bean
    • constructor属性:通过构造方法的参数类型自动装配
    • autodetect属性:会优先使用constructor方式来自动装配,然后使用byType方式
  • Srping 设置singleton模式的三种方式:(对bean请求方式类似于静态的getInstance()方法)

     //默认的即为singleton作用域
    
    
    
  • Spring IoC设置prototype的两种方式:(对bean的请求类似于new对象,每次都会重新创建一个新的)

       //设置singleton的值为false
    
    
  • Spring AOP:(面向切面编程)

    • 切入点:依据切入点织入的位置不同,提供了以下三种类型的切入点:
      • 静态切入点
      • 动态切入点
      • 其他切入点
    • 静态切入点:需要在配置文件时指定,关键配置如下:

      
          
                  //指定通知
          
          
              
                  .*getConn*.  //指定所有以getConn开头的方法名都是切入点
                  .*closeConn*.
              
          
      
      
    • 静态切入点只能应用在相对不变的位置,而动态切入点应用在相对变化的位置
  • Spring的DAO理念:

    • Spring DAO抽象提供了以下几种类:
      • JdbcDaoSupport:需要设置数据源,通过子类,能够获得JdbcTemplate来访问数据库
      • HibernateDaoSupport:需要设置Hibernate SessionFactory,通过子类能够获得Hibernate实现
    • Spring的配置文件applicationContext.xml的具体配置如下(以User类为例):

      
      
          
              com.mysql.jdbc.Driver
          
          
              jdbc:mysql://localhost:3306/db_michael
          
          
              root
          
          
              michael
           
      
      
      
      
          
              
           
      
      
  • 事务应用管理:

    • 编程式事务管理(两种实现方法:PlatformTransactionManager与TransactionTemplate(优先采用该方法)),配置文件如下:

      
      
          
              
          
          
              PROPAGATION_REQUIRED
           
      
      
      
          
              
           
      
      
    • 声明式事务管理

JSP操作XML:(使用dom4j)

  • 创建XML文档对象:

    Document document = DocumentHelper.createDocument();
    或者
    Document document = DocumentFactory.getInstance().createDocument();
    

你可能感兴趣的:(Java,web)