**编写BaseDao**
1.dao持久层怎么来写的?
2.编写通用的BaseDao,其他的Dao的持久层继承BaseDao,提供增删改查的方法了。
3.通用的查询的代码?
* 在BaseDao中提供有参数的构造方法,参数是class对象,子类提供的构造方法,默认调用父类的构造方法,在子类中需要传入具体的Class的类型。
4.在父类中提供构造方法,也可以获取到具体的Class的类型。
5.在Class对象中,提供了一些方法
* Type getGenericSuperclass() -- Type接口,实现类Class,子接口是ParameterizedType
* 在接口ParameterizedType中,提供了一个方法,Type[] getActualTypeArguments() 可以获取实际类型参数(<Book或者User>)。
**JDK5.0后注解**
1.注释:给程序员们看的,描述方法,参数具体的含义。
2.注解:给计算机看的,决定计算机执行的类。
3.注解的写法:@Test @Override
3.1 JDK中提供的一些注解
* @Override -- 标识子类重写父类的方法的格式。(注意:在JDK1.6之后,@Override也可以应用在接口与实现类中)
* @SuppressWarnings -- 抑制警告(黄色,不影响运行) @SuppressWarnings({ "all" })压制所有
* @Deprecated -- JDK中提供的一些过时了,但是可以通用,不推荐你使用。
4.自定义注解@MyTest,语法,声明属性。
4.1自定义注解
* 声明类使用class,声明接口使用interface,声明枚举enum,声明注解也使用关键字@interface
* 定义属性:数据类型 变量名称 ();
* 属性的默认值:数据类型 变量名称 () default 值;
* 属性的数据类型:基本数据类型、String类型、Class类型、注解类型、枚举类型、以上数据类型的一维数组
* 属性名称是value,value就可以省略不写。但是只能有一个value
* Invalid type Date for the annotation attribute Anno1.d; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
5.注解本身没有任何含义,结合反射,让注解有含义。
5.1JDK的元注解
* @Retention -- 自定义的注解进行设置,注解存在的阶段
* 值的写法:@Retention(RetentionPolicy.SOURCE)
* 值总结
* SOURCE 源代码阶段
* CLASS 编译class阶段
* RUNTIME 在运行期
5.2模拟@Test单元测试
* 先获取Class对象,通过Class对象获取Method对象
* 循环遍历拿到每一个method对象,判断该method是否有@MyTest注解
* 如果有,让方法运行。
* boolean flag = method.isAnnotationPresent(MyTest.class);判断方法上是否有注解
5.3模拟的MyJdbcUtil的工具类
6.JDK提供了元注解
* @Target -- 决定注解存在的位置。(方法,类,,,)
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE;
**Servlet3.0开发**
1.现在使用都是Servlet2.5版本
2.Servlet3.0版本比2.5多了哪些功能?
3.开发Servlet3.0必须使用JavaEE6.0版本,Tomact服务器必须是7.0版本以上
* 支持注解的开发
* 配置Servlet @WebServlet(urlPatterns={"/demo1"}) (例:@WebServlet(urlPatterns={"/demo1"},loadOnStartup=2,initParams={@WebInitParam(name="username",value="root"),@WebInitParam(name="password",value="abc123")}) )
* 配置过滤器 @WebFilter(urlPatterns={"/*"})
* 配置监听器 @WebListener
* 支持文件上传
* 做文件的上传,之前FileUpload组件,apache组织提供的。
* 前台和后台
* 前台
* 表单中的上传文件项 name="myfile"
* 表单中必须使用post提交方式
* 表单中必须使用enctype="multipart/form-data"
* 后台
* 获取文件的输入流,io读写。
<h3>Servlet3.0文件上传</h3>
<form action="${ pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
文件描述:<input type="text" name="filedesc" /><br/>
上传文件:<input type="file" name="myfile" /><br/>
<input type="submit" value="上传" />
</form>
@WebServlet(urlPatterns="/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet{
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 在FileUpload组件的时候,能不能使用req.getParameter()方法,答案是不能。
// 如果使用的Servlet3.0进行的文件上传,可以使用req.getParameter()方法
// 设置request的post请求的编码
req.setCharacterEncoding("UTF-8");
// 接收参数
String filedesc = req.getParameter("filedesc");
System.out.println("文件描述:"+filedesc);
// 处理文件的上传项
Part part = req.getPart("myfile");
// 文件的上传,操作Part对象的一些api
// 获取上传文件的大小
long size = part.getSize();
System.out.println("文件的大小"+size);
// 获取就是<input type="file" name="myfile" /> name属性的值
String name = part.getName();
System.out.println(name);
// 就是没有获取文件名称的方法 form-data; name="myfile"; filename="hello.txt"
String header = part.getHeader("Content-Disposition");
System.out.println(header);
// 获取文件名称
int index = header.lastIndexOf("filename=\"");
String filename = header.substring(index+10, header.length()-1);
System.out.println("文件的名称:"+filename);
// 文件上传
InputStream in = part.getInputStream();
// Part提供了一个方法,写入到位置
part.write("c:/upload/"+filename);
}
}
* 支持异步开发(了解)