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("放行后");	
  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/codingpark/p/4280742.html
Copyright © 2011-2022 走看看