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元注解:只能用在注解上的注解,就是元注解。

	[email protected]:改变注解的生命周期
	RetentionPolicy.SOURCE
	RetentionPolicy.CLASS(默认的)
	RetentionPolicy.RUNTIME
	[email protected]:指示注解能用在何处
	ElementType:枚举
	[email protected]:注解是否出现在JavaDoc文档中
	[email protected]:使用了注解的类的子类是否自动拥有注解
 

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\n

今天案例

1. 客户信息改写Hibernate入门

Hibernate入门,是轻量级应用的持久层解决方案
	1. ORM映射工具:JavaBean--->数据库
	2. 通过操作JavaBean,相当于操作数据库

Hibernate环境搭建
	1. 导包
		拷贝Hibernate发型包\hibernate3.jar(1个)
		拷贝Hibernate发型包\lib\required下的所有jar(6个)
		拷贝Hibernate发型包\lib\jpa下的jar(1个)
		拷贝Log4j的核心jar包(1个)
		拷贝slf4j发型包\slf4j-log4j12-*.jar(1个)
		还有你的数据库驱动jar(MySQL就1个)
		如果用到日志,拷贝Hibenate发型包\project\etc\log4j.properties到构建路径中

第一个入门案例
	1. 创建数据库表和实体
		private Integer id;
		private String name;
		private Date birthday;
	2. 在实体类所在的包中,创建Java对象与数据库的映射文件。文件名为"实体类名-hbm.xml"
	可以参考hibernate发行包下搜索*.hbm.xml
	3. 框架连接数据库
		在类路径中创建Hibernate的配置文件hibenate.cfg.xml,并告知映射文件的路径(参考Hibernate发型包\project\etc\hibernate.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. 反射注解案例

时间: 2024-10-12 16:42:29

JavaWeb之基础加强(二十)的相关文章

C#基础概念二十五问

1.静态成员和非静态成员的区别? 答: 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问 不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 静态函数的实现里不能使用非静态成员,如非静态变量.非静态函数等 2.const 和 static readonly 区别? 答: const 用 const 修饰符声明的成员叫常量,是在编译期

IOS 基础之 (二十二) 创建控制器

一 创建控制器 第1种方式 通过代码控制器 HKUIViewController.h #import <UIKit/UIKit.h> @interface HKUIViewController : UIViewController @end HKUIViewController.m #import "HKUIViewController.h" @implementation HKUIViewController @end AppDelegate.m - (BOOL)appl

java基础(二十)IO流(三)

这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是比较清晰的!如果你有需要可以在评论中留下您的邮箱我看到一定会免费发给你的!感谢这个平台让我们大家共同进步吧!! 记住 程序员是无私的!!! 也非常欢迎到我的博客内观看 博客地址:http://www.cnblogs.com/duscl/ /* 1:字符流(掌握) (1)字节流操作中文数据不是特别的方

JavaEE基础(二十六)/网络

1.网络编程(网络编程概述) A:计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. B:网络编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 2.网络编程(网络编程三要素之IP概述) 每个设备在网络中的唯一标识 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址. ipconfig:查看本机IP192.168.1

JavaEE基础(二十五)/多线程、GUI

1.多线程(单例设计模式) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类中定义一个本类的对象.Singleton s; (3)提供公共的访问方式. public static Singleton getInstance(){return s} 单例写法两种: (1)饿汉式 开发用这种方式. //饿汉式 class Singleton { //1,私有构造函数 private Singl

JavaEE基础(二十)/IO流

1.IO流(IO流概述及其分类) 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流. 流按操作类型分为两种: 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的 字符流 : 字符流只能操作纯字符数据,比较方便. 2.IO流常用父类 字节流的抽象父类: InputStream OutputStream 字符流的抽象父类: Reader Writer 3.IO程序书写 使

JavaEE基础(二十四)/多线程

1.多线程(多线程的引入) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时和多个人一起视频 服务器同时处理多个客户端请求 2.多线程(多线程并行和并发的区别) 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行.(需要多核CPU) 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于

JavaEE基础(二十二)/IO流

1.IO流(序列流) 1.什么是序列流 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推. 2.使用方式 整合两个: SequenceInputStream(InputStream, InputStream) FileInputStream fis1 = new FileInputStream("a.txt"); //创建输入流对象,关联a.txt FileInputStream fis2 = new F

python基础(二十)

1.Django请求的生命周期路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统/index/ -> 函数或类.as_view()/detail/(\d+) -> 函数(参数) 或 类.as_view()(参数)/detail/(?P<nid>\d+) -> 函数(参数) 或 类.as_view()(参数)/detail/ -> include("app01.urls")/detail/ nam