zoukankan      html  css  js  c++  java
  • JavaWeb之基础加强(二十)

    泛型基本知识回顾

    1. 泛型基本概述

    定义:)ArrayList<E>  :  <>typeof
    E:类型形式参数
    (用带有泛型的类:)new ArrayList<Integer>()
    Integer:类型实际参数
    ArrayList<E>  :泛型类型
    ArrayList<Integer> :参数化的类型   (在Java中是有一个类型来表示的ParameterizedType)

    2. 泛型基本定义

    1. 如何定义一个自己的泛型,用T代表一个泛型类型
    2. 泛型使用前要先声明,声明的位置在返回值之前,用<T>进行声明
    3. 当一个类的实例方法都是用泛型时,可以进一步简化,就是将这个类声明泛型类
    4. 如何声明一个类为泛型类? 就是在类声明时,同时在类名后加上<T>
    5. 如果一个类声明泛型类,内部实例方法就不用声明泛型了
    6. 如果一个类声明泛型类,静态方法必须声明泛型
    
    public static <T> T fillBean(Map map, Class<T> clazz) throws Exception {//静态方法,不管类有没有声明泛型,静态方法必须声明泛型
    
    	T bean = clazz.newInstance();
    	BeanUtils.populate(bean, map);
    	
    	return bean;
    }

    3. 泛型简单应用

    1. 编写一个泛型,实现指定位置交换
    public static <T> void swap (T t[], int x, int y) {
    	
    	T temp = t[x];
    	t[x] = t[y];
    	t[y] = temp;
    }
    2. 将任意数组反转
    public static <T> void reverse(T t[]) {
    	
    	for(int start=0, end=t.length-1; start<=end; start++,end--) {
    		swap(t,start,end);
    	}
    }

    Dao设计模式及泛型的反射

    Class clzz1 = this.getClass();//this指代当前的类   在测试类JDaoTest中,new CustomerDaoImpl();的是谁,this就指谁
    //2.找当前clzz1的泛型父类
    Type type = clzz1.getGenericSuperclass();
    ParameterizedType pt = (ParameterizedType)type;
    //3.找泛型父类的参数的Class
    clz = (Class)pt.getActualTypeArguments()[0];//取数组的下标为0的值

    注解(Annotation)

    1. 注解的基本知识

    JDK中自带的注解
    		@Override     //JDK1.6+才能使用接口中方法重写时的override
    		@Override  //JDK1.5+才能使用父类中方法重写时的override
    
    	        @Deprecated  //代表该方法已过时,可能有更好的方法替代   在系统更新维护很有用
    		@SuppressWarnings({ "all"  })//消除一些警告信息"unused", "rawtypes", "unchecked"
    
    如何自定义注解
    	1. 如何定义注解
    		public @interface 注解的名称{}
    
    	2.注解中能写什么?
    		1). 只能写属性
    			1.必须是一个公有的
    			2.属性后面要加一个()
    		2). 如果要加默认值  default  默认值   如:public int a() default 1;      
    		3). 注解中只能写什么类型的属性?
    		only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays 
            基本类型                    Class   注解              枚举                     以及它们构成的一维数组

    2. 注解的反射

    1. 注解获取方式
    	java.lang.reflect.AnnotatedElement
    	T getAnnotation(Class clazz):得到指定的注解类型
    	Annotation[] getAnnotations():得到所有的注解类型
    	Annotation[] getDeclaredAnnotations():得到自己上面的直接的注解类型
    	boolean isAnnotationPresent(Class clazz):有没有指定的注解
    
    	Class、Method、Field、Constructor等都实现了该接口。
    
    	比如:Class clazz = Object.class;
    	Boolean b = clazz.isAnnotationPresent(MyAnn1.class);
    
    判断Object这个类上面有没有MyAnn1的注解
    2、注解的生命周期:
    	2.0元注解:只能用在注解上的注解,就是元注解。
    
    	2.1@Retention:改变注解的生命周期
    	RetentionPolicy.SOURCE 
    	RetentionPolicy.CLASS(默认的) 
    	RetentionPolicy.RUNTIME
    	2.2@Target:指示注解能用在何处
    	ElementType:枚举
    	2.3@Documented:注解是否出现在JavaDoc文档中
    	2.4@Inherited:使用了注解的类的子类是否自动拥有注解
     

    Servlet3.0的新特性

    1.使用Servlet3.0前提条件?
    	JDK1.6+   Tomcat7.0或以上
    
    2.Servlet注解配置
    	@WebServlet()
    	@WebServlet(value={"/servlet/HelloServlet","/1.jpg"},initParams={@WebInitParam(name="encoding",value="UTF-8")
    			,@WebInitParam(name="cgx",value="aj")
    
    	//ServletConfig可以取出注解中的初始化参数
    	ServletConfig sconfig = getServletConfig();
    	String encodingValue = sconfig.getInitParameter("encoding");
    	System.out.println(encodingValue);
    	
    	//获取多个初始化参数
    	Enumeration<String> enumsss =sconfig.getInitParameterNames();
    	while (enumsss.hasMoreElements()) {
    		String paramName = (String) enumsss.nextElement();//得到参数名
    		String paramValue = sconfig.getInitParameter(paramName);
    		System.out.println(paramName+":"+paramValue);
    	}
    
    3.Servlet注解配置实现文件上传
    	commons-fileupload-xxx.jar是Apache
    					   Tomcat也是Apache------------->Tomcat7.0+集成了文件上传的功能(使用这个功能,就是加一个注解)
    											 @MultipartConfig
    		@MultipartConfig    //代表当前的这个Servlet有能力处理文件上传的功能
    		Part--------->request.getPart("filename").write("磁盘路径“);
    
    		示例:文件上传时的相关代码
    		response.setContentType("text/html;charset=UTF-8");
    		request.setCharacterEncoding("UTF-8");//解决普通字段的乱码问题  <input type="text" name="username"/>
    		String username = request.getParameter("username");
    		response.getWriter().write(username);
    		
    		//文件上传
    		Part part = request.getPart("photo1");//<input type="file" name="photo1">
    		
    		//由相对路径images,得到绝对路径  getServletContext().getRealPath("/images"):返回c:/tomcat7/webapps/day22/images/1.jpg
    		part.write(getServletContext().getRealPath("/images")+File.separator+i+".jpg");
    		response.getWriter().write("文件上传成功,<a href='"+request.getContextPath()+"/01upload.jsp'>返回</a>");
    
    4.Listener配置:@WebListener
    
    5.过滤器的注解配置  @WebFilter
    	注意://多个过滤器的顺序问题?看过滤名字的字典序
     

    Log4J日志管理器

    1. 它是什么?  Log for Java  主要用于记录日志信息的  (谁在什么时候用哪台机器登录我的网站)
    	文件(IO)或数据库(sql)
    2.用一种最快捷的方式 实现日志信息的保存
    
    3.平时Log4j用在哪些地方?
    	取款(sql (执行减法),取款机出钱)------>异常(Log4j记录日志   (id=324323取款  1000 ,ATM机没有出钱)   ---->相反的操作)
    		权限日志,异常日志
    
    4.开发中如何使用日志?
    	1.log4j-xxxx.jar包
    	2.写配置文件  默认(src/log4j.properties)
    	3.使用
    	
    5. log4j使用
    	log4j.properties可以在MyEclipse中目录搜索选择apache目录下的log4j.properties
    	
    	#log4j.rootCategory=INFO, CONSOLE, LOGFILE		这里可以把注释去掉,启用文件日志
    	log4j.appender.LOGFILE.File=axis.log		指定日志存放的目录
    	
    	模版日志格式log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m
    
    
    

    今天案例

    1. 客户信息改写Hibernate入门

    Hibernate入门,是轻量级应用的持久层解决方案
    	1. ORM映射工具:JavaBean--->数据库
    	2. 通过操作JavaBean,相当于操作数据库
    
    Hibernate环境搭建
    	1. 导包
    		拷贝Hibernate发型包hibernate3.jar(1个)
    		拷贝Hibernate发型包lib
    equired下的所有jar(6个)
    		拷贝Hibernate发型包libjpa下的jar(1个)
    		拷贝Log4j的核心jar包(1个)
    		拷贝slf4j发型包slf4j-log4j12-*.jar(1个)
    		还有你的数据库驱动jar(MySQL就1个)
    		如果用到日志,拷贝Hibenate发型包projectetclog4j.properties到构建路径中
    	
    第一个入门案例		
    	1. 创建数据库表和实体
    		private Integer id;
    		private String name;
    		private Date birthday;
    	2. 在实体类所在的包中,创建Java对象与数据库的映射文件。文件名为"实体类名-hbm.xml"
    	可以参考hibernate发行包下搜索*.hbm.xml
    	3. 框架连接数据库
    		在类路径中创建Hibernate的配置文件hibenate.cfg.xml,并告知映射文件的路径(参考Hibernate发型包projectetchibernate.properties)
    		url、用户名、密码、连接池大小、方言、当前线程对象绑定、二级缓存、控制台是否显示sql
    		是否创建表结构、映射文件在哪
    	
    	4. 工具类
    	5. PersonDaoDemo/CRUD
    	
    -----------------------------------------------------------------------
    Dao设计模式	
    原始重复代码
    	1. PersonDao接口
    	2. CustomerDao接口分页
    	3. 两个实现接口 
    	
    改写
    	1. 抽取公共Dao定义泛型T,方法CRUD
    		void add(T t);
    		void update(T t);
    		void delete(Serializable pk);
    		T findOne(Serializable pk);
    	2. CustomerDao继承Dao<Customer>
    		特有方法List<Customer> findAll();
    	3. 实现类抽取BaseDao<T>实现Dao<T>
    		3.1 工具类HibernateUtil
    		3.2 clazz依赖注入,使用泛型反射,反射到父类泛型
    		3.3 CRUD方法:增加开启事务,	
    				增加
    				Session s = HibernateUtil.getSession();
    				Transaction ts = s.beginTransaction();
    				s.save(t);
    				ts.commit();
    				s.close();
    				查找
    				Session s = HibernateUtil.getSession();
    				T bean = (T) s.load(clazz, pk);
    				return bean;
    	4. 实现类,继承BaseDao,实现Customer接口	
    	5. 修改配置文件
    	6. 测试

    2. 反射注解案例

    利用注解实现银行取款操作
    1. 定义注解类Limit
    	@Retention(RetentionPolicy.RUNTIME)		//为了在运行期间存在,所以这里要加上runtime
    	public @interface Limit {
    
    		public double value() default 0;
    	}
    	
    2. 	AccountDao类
    	@Limit(value=5000.0)
    	public void drawMoney(double money) throws Exception {
    		
    		if(money > balance) {
    			throw new RuntimeException("余额不足");
    		}
    		
    //		获取注解中的值
    		Method method = this.getClass().getMethod("drawMoney", double.class);
    		boolean b = method.isAnnotationPresent(Limit.class);
    		
    		double limitMoney = -1;
    		if(b) {
    			Limit limit = method.getAnnotation(Limit.class);
    			limitMoney = limit.value();
    		}
    		
    		if(money>limitMoney && limitMoney!=-1) {
    			throw new RuntimeException("单笔超限!");
    		}
    		
    		balance = balance - money;
    		System.out.println("取款成功,当前余额:" + balance);
    	}

    3. 自定义的单元测试注解

    自定义的单元测试注解
    1. 定义单元测试注解MyTest
    	设置属性timeout默认值为-1,添加注解运行期,Target作用在方法上
    	
    2. 定义单元测试后台运行类
    	1). 首先获取这个类的所有方法
    	2). 遍历所有所有方法
    	3). 得到方法上为Mytest注解
    	4). 取出注解的timeout属性值
    	5). 定义开始时间
    	6). 执行invoke方法
    	7). 获取结束时间
    	8). 判断实际运行时间是否大于timeout的值
    	
    3. 测试单元测试方法
    	@MyTest(timeout=3132731)
    	public void testAdd() {
    		System.out.println("successful!");
    	}

    4. Log4J日志管理

    1. 配置文件在Myeclipse目录中搜索log4j.properties,该文件看到是在apache就复制这个,错误格式可以参考MyEclipse的日志格式
    2. 测试Log4J
    	Logger log = Logger.getLogger("UserManager");
    
    	log.fatal("fatal 断电了");
    	log.error("系统有问题啦,error");
    	log.warn("警告信息warn");
    	log.info("详细信息,info");
    	log.debug("调试,debug");

    5. Servlet3.0案例

    1. 利用Servlet3.0特性设置初始化参数
    	1). @WebServlet(urlPatterns={"/servlet/ParameterServletDemo1","/1.jpg"},initParams={@WebInitParam(name="encoding",value="GBK"),@WebInitParam(name="aj",value="cgx")})
    	2). 取出方式
    	ServletConfig sc = getServletConfig();
    			
    	Enumeration<String> en = sc.getInitParameterNames();
    	while(en.hasMoreElements()) {
    		String paramName = en.nextElement();
    		String paramValue = sc.getInitParameter(paramName);
    		
    		System.out.println(paramName + ": " + paramValue);
    	}
    
    2. 利用Servlet3.0特性实现文件上传
    	1). @WebServlet(urlPatterns={"/servlet/UploadServletDemo2"})
    	@MultipartConfig
    	2). 文件上传首先获取请求的part
    	Part part = request.getPart("photo");
    	File path = new File(getServletContext().getRealPath("/images"));
    	if(!path.exists())
    		path.mkdirs();
    	
    	part.write(new File(path,"1.jpg").getPath());
    
    3. 利用Servlet3.0特性实现监听
    	加上注解就行了@WebListener
    
    4. 利用Servlet3.0特性实现过滤(注意事项如果是多个Filter的话,拦截顺序是按字典顺序进行拦截的)
    	1). @WebFilter(urlPatterns="/*",initParams={@WebInitParam(name="aj",value="cgx")})
    	2). 获取初始化参数
    	private FilterConfig config;
    	public void init(FilterConfig config) throws ServletException {
    		this.config = config;
    	}
    	
    	System.out.println("放行前");
    	String paramValue = config.getInitParameter("aj");
    	System.out.println(paramValue);
    	
    	chain.doFilter(request, response);
    	
    	System.out.println("放行后");	
  • 相关阅读:
    bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏
    spoj gss2 : Can you answer these queries II 离线&&线段树
    hduoj 1077 Catching Fish 求单位圆最多覆盖点个数
    HDUOJ Clear All of Them I 状压DP
    bzoj 1013: [JSOI2008]球形空间产生器sphere 高斯消元
    bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列
    Cocos2d-x Lua中生命周期函数
    Cocos2d-x Lua中使用标签
    Cocos2d-x Lua中Sprite精灵类
    Cocos2d-x Lua Node与Node层级架构
  • 原文地址:https://www.cnblogs.com/codingpark/p/4280742.html
Copyright © 2011-2022 走看看