1.动态代理:proxy
1.写一个类
2.目标对象:
3.写一个获得Proxy对象的方法:
4.使用JDK中的Proxy创建代理对象,这个代理对象是程序动行时产生,因此叫动态代理
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
三个参数:
参数一:代理对象是由哪个类加载器加载器UserDaoProxy.class.getClassLoader(),
参数二:代理对象要与目标对象有相同的方法iUserDao.getClass().getInterfaces(),
参数三:在代理对象中,如何去处理客户端调用的方法
5.获得动态代理对象后,强转成指定接口
6.最后一个参数是一个内部类:
1.//返回值
Object returnValue = "";
2.//获取客户端调用的方法名
String methodName = method.getName();
3.判断://如果客户端调用的方法是addUser的话
if("addUser".equals(methodName)){
1.//写日志
log.write();
2.//增加用户,并接收返回值
returnValue = method.invoke(iUserDao,args);
3.//写日志
log.write();
否则://查询用户,并接收返回值,相当于iUserDao.findAll()
else{
//查询用户,并接收返回值,相当于iUserDao.findAll()
returnValue = method.invoke(iUserDao,args);
}
4.//将返回值返回
return returnValue;
动态代理在web上应用:
解决get post请求的编码问题:(和装饰设计模式比较)
2.发送复杂邮件:
1.send.jsp发送复杂邮件:
2.生成上传地址文件夹upload
3.sendServlet:接受客户端发送的数据:
1.导包:
定义一个Map集合,用于存贮普通文本的字段名和值。
2.生成一个处理上传文件的方法:
上传文件的代码:
初始化一个文件对象。
1.创建DiskFileItemFactory对象
2.创建ServletFileUpload对象
3.设置上传文件的编码格式:
4.通过ServletFileUpload对象解析请求
5.遍历解析得到的FileItem对象
6.判断是普通文本还是附件。
7.如果是普通文本则获取名字和值,解决编码问题,且收集fieldName和fieldValue
8.如果是文件附件则获取名字并封装成一个文件对象,再获取文件对象的名字。
9.获取上传文件夹根地址:
10.封装上传文件保存的目录为文件对象:
11.写入
12.删除
13.返回获得的文件
3.创建一个复杂邮件:
处理上传文件,保存到指定的服务端目录下,并返回这个上传的文件
1.创建一个复杂邮件:
2.设置主机名:
3.权限认证:
4.设置编码
5.设置邮件发送方from
6.设置邮件接受方to
7.设置邮件主题
8.设置邮件信息:
4.权限认证:
5.判断是否有附件:
如果有附件
1.创建附件对象:
2.封装附件位置
3.封装附件标题:
4.将附件加入到上述的邮件中
6.发送邮件:
7.响应信息:
1.设置响应的编码格式:
2.向页面写入一段js代码,弹出发生成功对话框。
3.并重定向到send.jsp页面。
3.反射泛型:
1.创建sql文件,写入sql语句:
2.Student类Teacher类
3.StudentDao;TeacherDao:
4.BaseDao:
继承BaseDao:
5.要进行与数据库交互数据。所以要
导包:c3p0,数据库驱动,dbutils。
c3p0-config.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///javaweb(数据库名)</property>
<property name="user">root</property>
<property name="password">123456</property>
</default-config>
</c3p0-config>
写一个dbUtils工具类获取数据库连接池:
BaseDao中写两个方法:
findById();
findAll();
在写这两个方法时,发现问题:
1.需要动态获取表名。
2.需要动态获取class字节码文件。
解决方法是通过反射泛型来解决该问题。
BaseDao代码内容:
1.定义两个变量:
1.clazz就是Student或Teacher的字节码:
2.表名
2.通过空参构造器为实例变量设置值:
1.获得子类的字节码文件:
2.通过子类的字节码文件获得父类的泛型得到的是Type
3.父子接口强转,将Type装换为参数化类型(泛型类型)
4.返回泛型类型中的实际类型:
5.取出第一个与元素,即Student或Teacher类型
6.类名和表名有一定的关系,所以可以获得表名:
3.findById();
注意class字节码文件和表名的动态获取。
4.findAll();
注意class字节码文件和表名的动态获取。
4.反射注解:
1.演示常用的注解:
1.@Override
2.@Deprecated :注解在方法上时表示方法过时的,废弃的。
3.@SuppressWarnings :压制警告。
2.自定义注解:
语法:@interface MyAnnotation{}
@interface MyAnnotation{
//用户名
String name();
//年龄
int age();
//收入
double salary();
}
@MyAnnotation(age=22, name="哈哈", salary=7000)
public void run(){
}
可以设置初始化值:
@interface YouAnnotation{
//用户名
String name() default "嘻嘻";
//年龄
int age() default 22;
//收入
double salary() default 6500;
}
字段可以是字符串和字符串数组。value 可以省略。
3.注解的应用:用来替代配置文件。
这个注解,就相当于原来的db.properties或db.xml配置文件
@Retention(RetentionPolicy.RUNTIME)表示运行时还有效。。
@Target({METHOD})这是表示只能用在方法上
@interface DB{
String driver() default "com.mysql.jdbc.Driver";
String url() default "jdbc:mysql://127.0.0.1:3306/javaweb";
String username() default "root";
String password() default "root";
}
1.自定义一个注解:取名为DB。
2.写一个获取数据库连接的方法:getConnection();在方法上加上注解。
反射注解:
1.获取该类的字节码:
2.获取getConnection方法:
3.获取方法上的注解:
4.分别获取DB注解中的所以属性:
5.注册数据库驱动:
6.用JDBC方式获取连接对象并返回:
3.写个主方法测试结果:
三元表达式判断是否获得连接。
易发生的错误是:
1. @Retention(RetentionPolicy.RUNTIME)这是自定义注解的生命周期
这是修饰注解的注解,叫做元注解。
2.没有将注解写到方法上。
5.为字符串动态设置值:
1.创建一个模式字符串:
2.创建默认语言环境和指定模式的字符串格式对象:
3.准备3个实际参数:
4.动态为模式字符串设置值:
5.显示:
相关推荐
### .NET框架基础详解 #### 2.1 .NET基础概念 在深入探讨.NET框架之前,我们首先需要明确几个基础概念,这对于理解后续的技术细节至关重要。 ##### 2.1.1 什么是CTS、CLS和CLR .NET框架的核心在于三个关键组成...
Spring框架基础总结 一、Spring框架概述 Spring框架是一个开源的控制反转(IoC)和面向切面(AOP)的容器框架,旨在简化企业级Java应用的开发工作。Spring框架的核心价值在于其分层架构设计,使得开发者可以根据...
这个压缩包包含了Struts2框架的基础jar包,这些库是开发Struts2应用不可或缺的部分。 1. **核心库**:Struts2的核心库主要由`struts2-core.jar`组成,它包含了处理HTTP请求、执行Action逻辑、管理应用流程和视图...
这个SSH框架基础包为你提供了一个完整的开发环境,你可以在此基础上快速构建一个具备CRUD功能、事务管理、日志记录等功能的Web应用。通过学习和实践,你可以深入了解Java Web开发的各种技术,并提升你的开发效率。
在建筑工程中,框架基础梁的设置对于整个结构的稳定性和抗震性能至关重要。本文主要讨论了几个关键知识点,涉及框架计算简图的正确设定、基础拉梁层的计算模型及其设计要求。 首先,对于框架计算简图,正确的设置是...
Java框架基础是Java开发中的重要组成部分,它提供了一套预制的结构和规范,使得开发者能够更高效、便捷地构建应用程序。框架通过简化代码编写、管理依赖、自动化测试以及优化性能,极大地提升了开发效率和项目的可...
该框架旨在强化联邦政府与私营企业的合作,以增强关键基础设施部门的网络安全管理和风险应对能力。其核心是通过业务驱动因素来指导国家网络安全工作,并将网络安全风险视为组织风险管理的一部分。 框架主要由三个...
它通过Action类和配置文件定义了控制器层,使得业务逻辑和视图层分离,增强了代码的可维护性和可测试性。 Spring框架则是一个全面的企业级应用开发框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。在...
SSH三大框架,即Struts、Spring和...总的来说,SSH三大框架基础架构是Java Web开发中的基石,它们帮助开发者构建出健壮、可扩展的系统。理解并熟练掌握这三个框架的原理和使用方法,对于提升Java Web开发技能至关重要。
本主题聚焦于"C++图像处理基础框架",它为开发者提供了一套用于图像处理的基本工具和方法,便于理解和实践。源代码的提供使得初学者能够更直观地学习图像处理的原理和技巧,同时也方便了有经验的程序员快速开发相关...
XULRunner是Mozilla的一个基础平台,它提供了一套运行时环境,用于支持使用XUL(XML User Interface Language)和其他相关技术构建的应用程序。XUL类似于HTML,但专为创建桌面应用程序设计,支持跨平台运行。开发者...
为了加强关键信息基础设施的保护,文中提出了完善顶层设计的需求,这意味着需要从国家战略层面制定全面的网络安全政策。同时,技术可行性分析对于确保框架的落地实施至关重要,因为关键信息基础设施往往涉及高度复杂...
2. **PHP框架基础** PHP框架是一种用于组织和简化PHP开发的结构,通过预定义的类库和方法,可以规范开发流程,减少重复工作,提高开发效率。CanPHP作为其中之一,具有自己的优势和特点,适应不同的项目需求。 3. *...
4. **增强现实与虚拟现实集成**:AI框架可能与AR/VR技术融合,为混合现实应用提供智能支持。 5. **安全性与隐私保护**:随着数据安全和用户隐私的关注度提高,框架将集成更多的加密和隐私保护机制,保障模型训练和...
风度框架则是对这个基础架构进行定制和优化的工具,它允许用户根据自己的需求调整系统行为,实现更深层次的个性化设置。 风度框架的核心功能可能包括但不限于以下几点: 1. **权限管理**:通过风度框架,用户可以...
4. **插件系统**:允许开发者添加自定义功能,通过插件形式集成,增强框架的灵活性。 5. **模板引擎**:提供模板语言,简化视图层的编写,使界面设计和业务逻辑分离。 总结来说,"快速开发后台框架"是一个为了提高...
《数字图像处理基础框架代码》 本程序是一个用于数字图像处理的基础框架,旨在为具有相关经验的研究人员提供一个可扩展的平台,以便于理解和实践数字图像处理的各种算法。该框架的核心是VC++编程语言,利用其高效性...
《软件体系架构:Spring、SpringMVC与Mybatis框架基础》 在当今的软件开发领域,框架的应用已经变得至关重要,它们极大地提高了开发效率,降低了出错的可能性。本资源主要聚焦于三大主流Java企业级框架——Spring、...