A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天讲的是基础加强,主要介绍了注解、Servlet3.0,今天课程内容要求不高。

今日需要掌握的有:
  • 了解JDK中提供的三个注解
  • 了解自定义注解
  • 能够简单实用Servlet3.0

请同学们按照如上要求,总结今日所学。



16 个回复

倒序浏览
注解
        概述
                注释——给程序员看的
                注解——给虚拟机看的
                注解代表程序的一些特殊功能
        JDK提供的注解
                @Override
                        重写
                        1.6以后可以用在实现接口的类的方法重写上
                @SuppressWarnings(***)
                        压制警告
                        “all”——压制所有
                @Deprecated
                        描述方法过时
        自定义注解
                关键字
                        @interface
                格式
                        @interface 注解名{}
                定义带有属性的注解
                        定义
                                @interface 注解名
{
        int a();
        boolean b();
        String s();
}
                        使用
                                使用时必须保证属性有默认值
@interface 注解名(a=1,b=true,s="1")
                        属性类型限制
                                基本数据类型
                                String
                                Class
                                注解类型
                                枚举类型
                                以上类型的一维数组
                        给属性赋予初始值
                                boolean b() default false;
                        注意
                                如果注解只有一个属性名称为value,那么可以缩写
@注解名(value=值)--->@注解名(值)
        模拟JDK的@test注解
                注解默认存在阶段
                        注解只存在于源代码阶段(.java)
                        编译后(.class)不存在
                        JVM运行时不存在
                可以用元注解修改注解的存在阶段
                        元注解——指注解的注解
                        @Retention(value=RetentionPolicy.RUNTIME)
文件上传
        技术
                JSPSmartUpload——嵌入到JSP中完成文件上传,主要用于Model1年代
                FileUpload——Apache的文件上传组件
                Struts2——底层是FileUpload
                Servlet3.0——注解开发,文件上传,异步请求
        要素
                提交方式必须是post(无大小限制)
                表单中需要有元素<input type="file">,该元素必须有name属性和值
                表单<form>的enctype属性的值必须是multipart/form-data
        Servlet3.0
                注解开发
                        @WebServlet
属性名-值类型
                                urlPatterns——String
                                loadOnStartup——int
                                initParams——@WebInitParam
                    属性——值类型
                                        name——String
                                        value——String
                        @WebListener
                        @WebFilter
                                根据过滤器名称首字母顺序进行执行
                        @MultipartConfig
                                该注解解析request,使request拥有新方法Part getPart();
                                Part是3.0特有的
        举例
                //获得请求中文件上传部分
Part part = request.getPart("file");
                //获得文件名
String header = part.getHeader("Content-Disposition");               
String[] strs = header.split("filename=\"");
String fileName=strs[1].substring(0, strs[1].length()-1);
                //获得文件内容,写入硬盘
InputStream is = part.getInputStream();
String realPath = request.getServletContext().getRealPath("/upload");
OutputStream os =new FileOutputStream(realPath+"/"+fileName);
byte[] bys=new byte[1024];
int len=0;
while((len=is.read(bys))!=-1){
        os.write(bys, 0, len);
}
is.close();
os.close();
回复 使用道具 举报
王刘锁
2018-6-16-->基础加强
首先学习了注解>注解是程序的一种功能标签,让虚拟机看到这些注解指定程序具备了什么功能,在jdk

的版本1.6以后的可以用在实现接口的类中,在1.5版本只能用在类的继承,自定义注解需要用到关键字
@interface 注解名,自定义注解要注意他的属性类型只能有基本数据类型,String,Class,注解类型,枚

举类型和这些类型的一维数组,然后是使用Servlet3.0完成文件上传.完成这个案例必须的三个要素是,

上传页面的表单必须是post提交方式,因为post没有大小限制,而且表单必须有enctype属性值必须是

multipart/form-data,这样在请求体中文件信息和内容会以字符串形式存在才可以在后台获取到文件

内容,表单中必须有一个元素标签<input type="file" name="随便起">,瑕疵是它的api不完善,另外

servlet3.0的注解开发可以说是非常方便的,相比之前的配置文件开发很省力,不过维护就很难了,毕竟

代码越简单逻辑越复杂,.关于注解开发需要了解的有三个注解@WebServlet("/名字")-->Servlet的

web.xml中的url-pattern标签中的名字;@WebListener-->监听器,@WebFilter-->过滤器;接下来说一下

文件上传的案例:首先上传文件到后台,我们需要获取文件的文件名和内容.因为这些信息全部封装成了

字符串.,所以要先把这个字符串获取,用到方法Part part=request.getPart("上面随便起的名字")
这个part对象就是文件信息字符串封装的,然后获取到文件名所在的请求头,String

header=part.getHeader("Content-Disposition"),再截取header获取文件名,先获取要截取的开始位

置int i =header.lastIndexOf("filename=\(转义)"")再根据位置获取文件名String filename=
header.subString(i+10,header.length()-1)-->因为i是filename中f所在的位置因此要+10才能截取

到文件名,并且最后面还有一个引号不能要所以length-1;这里可以用随机的UUID来拼接一个唯一的文

件名,然后获取文件内容,用方法:InputStream is = part.getInputStream()-->获取的是一个流,流内

是文件内容,然后获取要存放的地址全路径String path= request.getServletContext

().getRealPath("/upload"),这里可以用算法来生成多级目录,用文件名的hashcode&0xf获取到一级目

录,然后移位再做同样运算获取次级目录,,用得到的路径创建一个file判断file是否已经存在,不存在

就创建,然后创建输出流写文件,FileOutputStream os = new FileOutPutStream(path

+"/"+filename);,下面就是正常的写文件了,
回复 使用道具 举报
陈叶隆
2018.6.16-基础加强
1. 文件上传的要素:
* 表单的提交的方式必须是POST.
* 表单中需要有文件上传的表单元素:这个元素必须有name属性和值:<input type=”file” name=”upload”>
* 表单的enctype属性的值必须是multipart/form-data.
案例:使用Servlet3.0完成一个文件上传的功能:
【步骤一】:设置一个文件上传页面.
【步骤二】:点击提交,提交到Servlet中.
【步骤三】:在Servlet中接收参数.
【步骤四】:获得服务器的文件上传的路径.
【步骤五】:通过流写到该路径下就OK了.
主要代码:
@WebServlet("/UploadServlet")
@MultipartConfig
                // 接收普通数据:
                request.setCharacterEncoding("UTF-8");
                String filedesc = request.getParameter("filedesc");

                // 接收文件:
                Part part = request.getPart("upload");
                               
                // 获得文件名:
                String header = part.getHeader("Content-Disposition");
                int idx = header.lastIndexOf("filename=\"");
                String fileName = header.substring(idx+10, header.length()-1);

                // 获得文件内容:
                InputStream is = part.getInputStream();
                // 获得upload的路径:
                String path = this.getServletContext().getRealPath("/upload");
                OutputStream os = new FileOutputStream(path+"/"+fileName);
                byte[] b = new byte[1024];
                int len = 0;
                while((len = is.read(b))!=-1){
                        os.write(b, 0, len);                }
               
回复 使用道具 举报
何平波
基础加强1
@Test注解
概述:注解和注释的区别
注释:了解代码的编写思路,让程序员看得懂
注解:让虚拟机解析,让虚拟机看程序中的注解,注解代表程序的一些特殊功能.
注解(annotation)分类:
1.@Overide(重写)
2.@SuppressWarning(消除压制安全警告)
@SuppressWarning("all")消除压制全部安全警告
3.@Deprecated:描述方法过时的
定义注解的格式
@interface
自定义注解
注解中的属性需要加括号  例如 int a();
在需要重写的方法定义值
注解的属性类型:基本数据类型,String类型,Class类型,注解类型,枚举类型
默认的自定义注解只会存在源码阶段,在生成class及运行阶段就不存在了
默认的自定义注解只会存在源码阶段,需要让注解的存在时间更长,就需要用到元注解.
@Retention(value=RetentionPolicy.RUNTIME)
让自定义的注解的存在时间更长

使用Servlet3.0完成文件的上传
文件上传
将本地的文件写到服务器上(Servlet3.0)  
注解开发,文件上传,异步请求
文件上传的3要素:
1.表单的提交方式必须是post
2.表单中需主要上传的表单元素,这个元素必须有name属性和值<imput type="xxx",name="xxx">
3.表单enctype属性的值必须是multipart/form-data

Servlet3.0的注解开发  
WebServlet
WebListener
WebFilter
注意:使用servlet3.0不用创建web.xml
WebServlet("servlet的路径")
文件上传原理分析】
没有设置enctype属性的时候:只能获得文件的名称,而没有文件内容.
设置enctype属性为multipart/form-data:获得到文件名及文件内容.
Servlet3.0与Servlet2.5的区别
提供了3个新特性
注解开发:
文件上传:有些api不是特全
异步请求:

Servlet的文件上传需要加@MultipartConfing,不然接收的文件数据为null

上传的文件要去tomcat下的webapps项目工程下去找

随机文件名的总结
public static String getUUID(String filename) {
  //randomUUID()随机生成一个随机码,转换成字符串类型,replace        
//随机码原来的格式为xxxx-xxxx-xxxx-xxxx   replace方法替换-为空
                return UUID.randomUUID().toString().replace("-", "");
        }

0xf  16进制  0123456789abcdef   ==  x=a=10;f=15;0=10
       
//接收普通数据的方法是没有 enctype="multipart/form-data" //解码
request.setCharacterEncoding("UTF-8"); //接收文件描述 String
String filedepict = request.getParameter("filedepict");
System.out.println("文件描述"+filedepict);
                 
                //接收文件
                request.setCharacterEncoding("UTF-8");
                Part part = request.getPart("fileUpload");
                long size = part.getSize();
                System.out.println("文件的大小是"+size);
                //获取文件名
                //先获取响应头
                String headers = part.getHeader("Content-Disposition");
                //获取响应头最后的位置filename=\"
                int lastIndexOf = headers.lastIndexOf("filename=\"");
                //截取filename=\"之后的10个参数,到倒数第二个,因为最后一个是一个",不做截取
                String filename = headers.substring(lastIndexOf+10, headers.length()-1);
               
                //获得文件内容
                //用Part获取字节输入流
                InputStream is = part.getInputStream();
                //获取想写入的路径
                String realPath = request.getServletContext().getRealPath("/upload");
                //写入  利用字节输出流     realPath是全局的一个字符串路径/filename是字符串文件名
                //获取随机文件名
                String uuid = UuidUtils.getUUID(filename);
                request.setCharacterEncoding("UTF-8");
                FileOutputStream os = new FileOutputStream(realPath+"/"+uuid);
                byte[] byt=new byte[1024];
                int len=0;
                //字节输出流需要读取字节数组,不然读取不到上传文件的内容
                while((len=is.read(byt))!=-1){
                        os.write(byt, 0, len);
                }
                //关流
                os.close();
                is.close();
                response.setContentType("text/html;charset=utf-8");
                response.getWriter().print("文件上传成功");
回复 使用道具 举报
常小天
今天学习了java程序中的注解。与注释不同,注解是给虚拟机看的,是让虚拟机知道被注解的程序是具有一些特殊功能的。今天还做了一个文件上传的案例,并在这个案例中应用到注解。本案例的jsp部分除了正常编写一个带有上传标签的表单外,还有三点特殊要求。一是表单的提交方式必须是post。这是因为上传的文件可能很大,而get提交方式有大小限制,post没有大小限制。二是表单中要有文件上传的表单元素,而且必须要有name属性和值。三是表单(<form>)的enctype属性的值必须是multipart/form-data。Jsp页面编写完成后,编写servlet时也要几点要求。首先是需要添加一个注解。Servlet3.0版本没有web.xml,而是通过注解给servlet配置路径,所以编写的servlet本身有一个注解:@WebServlet ("/路径")。除了这个注释外,还需要一个注释:@MultipartConfig。接下来就开始编写上传文件部分的代码。上传文件的两个必要元素是文件名和文件内容。Servlet3.0无法直接获得文件名,需要从头信息中获得Content-Disposition信息,从中截取出filename属性的值,在通过this. getServletContext().getRealPath("/upload")方法获得文件写入的路径,和获得的文件名拼接得到完整的写入路径,将路径传入outputstream的构造方法获得输出流。输入流可通过part.getInputStream()方法获得,之后二流对接完成文件上传。
回复 使用道具 举报
陈强
基础加强的一天;
首先是关于注解的学习,之前使用的测试方法就使用到了注解,就是@test,
----JDK给我们提供了三种注解:@override\@supperssWarnings\@Deprecated
注解这部分的东西还是相对好理解的;
然后就是学习了关系servlet3.0的新特性:注解开发\文件上传\异步请求
---使用servlet3.0完成文件上传的案例
文件上传就是将本地的文件写到服务器上;
然后使用servlet3.0完成文件上传要注意三要素:
--1\表单的提交方式必须是post请求
--2\表单中需要有文件上传的表单元素,即type=file
--3\表单的enctype属性值必须将默认值改为multipart/form-data
完成前期的准备工作和注意事项后,就可以进行案例的代码实现了~~
---1\从JSP页面中提交相关信息到servlet
---2\servlet中接收参数
---3\注意记得加上注解---@MultipartConfig
---4\获取文件内容所在部分的信息,根据type=file这个表单中的name属性来获取
---5然后就可以获得这部分中的头信息\文件名\文件内容等
                -----注意文件名获取的时候的截取
---6\最后在WebContent中去创建一个要上传文件的文件夹,然后根据其获取一个真实路径
---7\最后就是进行文件的写入了,采用的就是IO流的方式了
---8\文件上传完成后,是要去Tomcat的目录下去查找,不是在eclipse中的目录查找
然后根据UUID处理关于文件的重名,对这个案例进行了改善
OK~~~
回复 使用道具 举报
郭明杰:
注释是给程序员看|||注解是给虚拟机看的,虚拟机可以看到程序中的注解,注解代表程序的一些特殊的功能.

*@Override :描述子类重写父类的方法
*SuppressWarnings :压制警告
@Deprecated:描述方法过时.

自定义注解:@interface
        自定义注解的属性必须加() 括号
        注解的属性类型:
            基本数据类型:
            String类型
            class类型.
            ....

[Servlet 3.0]
*文件上传技术   注解开发   异步请求(通常用AJAX)

*文件上传的要素
        *表单的提交方式必须是POST
        *表单中需要有上传的表单元素:必须有name属性 .并且必须有值
        *表单的enctype属性的值必须是multipart/from-data
回复 使用道具 举报
郑雪平

今天学习了自定义注解来模拟@test功能和使用Servlet3.0来完成文件上传,注解和之前讲的注释是有区别的,注解是给虚拟机看的,注释则是给程序员看的。@Override:描述子类重写父类的方法:   @SuppressWarnings:压制警告.@Deprecated:描述方法过时.自定义注解:  
         1.定义类:class2. 定义接口:interface3. 定义枚举:enum4.定义注解:@interface   
         
          注解的属性的类型:1. 基本数据类型:2.String类型:  3.Class类型:4.注解类型:5.枚举类型:6以上  类型的一维数组:
文件上传:指的是将本地的文件 写到 服务器上.文件上传必须要具备的三个要素:1.表单的提交的方式必须是POST.2.表单中需要有文件上传的表单元素:这个元素这个元素必须有name属性和值:<input type=”file” name=”upload”>3.表单的enctype属性的值必须是multipart/form-data.
    设计文件上传的页面时,没有设置enctype属性的时候:只能获得文件的名称,而没有文件内容,只有设置enctype属性为multipart/form-data才获得到文件名及文件内容.在进行文件上传时经常会遇到的问题:1.文件重名;2.同个目录下存放的文件过多。解决的方法有:1按时间分:一个月一个目录,一个星期一个目录,一天一个目录;2. 按数量分:一个目录下存5000个文件,创建一个新的目录,再去存放.3.按用户分:为每个用户创建一个单独目录 存放文件.
回复 使用道具 举报
郑志祥

注解的概述
注解与注释的区别
注释:是写给程序员看的
注解:是写给jdk虚拟机看的



源代码-->class文件-->类加载器区
jdk提供的注解

@Override:描述子类重写父类的方法:
* JDK1.5版本的时候 该注解只能应用在 类的继承上.
* JDK1.6版本的时候 该注解可以应用在 类的实现上.
@SuppressWarnings        :压制警告.(all)表示压制所有
@Deprecated:描述方法过时. 例如date里面的tolocalString



文件上传
概述:将本地的文件写到服务器上面
文件上传技术
Servlet3.0 注解开发,可以完成文件的上传,异步请求
jspSmartUpload 嵌入
FileUpload   Aapche的文件上传组件
Struts2 底层是FileUpload(企业用)

文件上传的要素
1.表单的提交方式必须是post  (应为get提交回受到大小的限制)
2.表单中需要文件上上传的表单元素 ,这个元素必须要有name属性,和值<input type='file' name='upload'
3.表单的enctype属性必须是multtipart/from-data  写到表单enctype(只有设置这个才能上传文件里面的内容,不然上传的是文件名字)
回复 使用道具 举报
吴鹏
总结

注解和注释:
注释是给人看的,描述程序的含义,步骤等
注解是给虚拟机看的,注解代表程序的一些特殊的功能

JDK(提供了三个注解):
1 @Override
描述子类重写父类的方法(类似规范一样的东西),JDK1.5时候,只能用在类的集成上,1.6以后可以用在类的实现上

2 @SupperessWarnings()
用来压制警告

3 @Deprecated
用来标记方法过时,我们能拿来自己用

---------------------------------------------
自定义注解:
定义枚举:enum
定义注解:@interface
定义一个注解,后面写上注解名,就可以用@注解名来调用定义的注解
定义一个有属性的注解:
@interface Anno2{
    int a();
}
属性必须要有赋值,可以在引用注解后加个括号(),在括号里面赋值;
或者在定义属性的注解里面的括号后面用default+值;来赋值;

注解的属性类型只能由基本数据类型,字符串,class类型,注解类型,枚举类型,或者包含以上类型的一位数组;

特殊的属性名称 value
当属性之定义了一个的时候,应用注解可以在括号里面省略掉value,只需写属性值;

----------------------------------------------------

1 获得测试类的class(反射)
2 获得测试类的所有的方法
3 遍历所有的方法,判断是否带有指定的注解
4 将代有注解的方法执行

注解存在的阶段:
默认注解只存在与源代码阶段,在编译和执行阶段就消失了
自定义注解默认存在于源码阶段,需要让注解存在的时间更长,就使用元注解(修饰其它注解的称之为元注解)

Retention(value=RetentionPolicy.Runtime)
设置注解存在与运行阶段;

---------------------------------------------------------------------------

servlet 3.0的新特性(实现文件的上传和下载)_:
多了注解开发功能;
@WebServlet
@WebFilter
@WebListener

文件上传的功能;
1 设置一个文件上传页面
2 提交页面指向一个Servlet(多加一个注解 @MultipartConfig后才能使用part对象和他的方法)
3 在Servlet中接收参数
4 获得服务器的文件上传路径
5 通过流写到该路径下

异步请求的功能

JSPSmartUpload(嵌入到JSP中完成文件上传,朱永用于 model阶段
FlieUpload apache的文件上传组件;
Struts2 底层是FileUpload

文件上传的要素:
1 表单提交的方式必须是POST;
2 表单中需要有文件上传的表单元素,元素必须有name属性和值;<input type="file" name="upload">值为upload
3 表单的enctype的属性值为mulipart/form-data;在<form enctype=>标签中;(改变传递参数的方式)
    没有设置enctype的话,传过去的只是文件名,而没有文件的内容
    有设置的话,传过去的是文件名和文件内容,服务器可以获得的内容,然后写入到本地数据;


回复 使用道具 举报
谢洪彬:
注解开发及文件上传
动态工程3.0版本的新特性:
1.注解开发
2.文件上传
3.异步
在我们使用3.0版本进行开发时,没有WEB.XML,这是我们需要进行文件的配置是就可以使用注解开发去进行完成,注解开发以@开头,例子如下:
Servlet:        @WebServlet("路径")
Filter:        @WebFilter(urlpatterns=“拦截路径”)

文件上传:
3.0版本的新特性
不管使用什么工具去完成文件的上传都必须满足以下三个条件:       
1.提交方式必须为Post(get有大小限制)
2.<input  type=”file”  name=”upload”>        标签必须要有name属性
3.<form>标签中enctype=”multipart/form-data”        属性
思路分析:
1.在进行抓包分析的时候我们可以看到是按部分进行划分的,这时我们就可以调用getpare(),获取属于表单中name属性的那一部分内容的对象
2.通过获取到的对象调用getHeader(“Content-Disposition”)可以获取这个头中的一些信息,然后利用字符串进行切割得到文件名;
3.通过获取到的对象调用getInputstream()来读取文件中的内容
4.创建OutputStream()来写到服务器上;
注:在进行文件上传是注解必须多加一个@MultipartConfig
回复 使用道具 举报
许剑鸿         webDay24


Servlet3.0与Servlet2.5提供了三个新特性: * 注解开发:方便    * 文件上传    * 异步请求(了解):

注解(用到了反射)
注解与注释的区别:
        注释:给程序员看的
        注解:给虚拟机看的(让虚拟机看到程序中的注解,注解代表程序的一些特殊的功能)
JDK的3个注解:@Override  @SuppressWarnings @Deprecated

自定义注解:* 定义类:class  * 定义接口:interface* 定义枚举:enum* 定义注解:@interface

完成文件上传案例(使用servlet3.0) 无web.xml文件而是注解@WebServlet(urlPatterns="/ServletDemo1")

文件上传必须达成的3个要素
* 表单的提交的方式必须是POST.
* 表单中需要有文件上传的表单元素:这个元素这个元素必须有name属性和值:<input type=”file” name=”upload”>
        使用getpart(name)能够获得文件的名称与内容
* 表单的enctype属性的值必须是multipart/form-data.(能够得到上传文件内的内容)
       
回复 使用道具 举报
张裕
                        注解
概述: 给JVM(虚拟机)看的  程序中的注解 注解代表程序的一些特殊功能
自定义注解: @interface xxx
                属性定义需要加()
                属性类型:基本数据 String class 注解 enum类型以上类型的一维数组
                default赋予初始化值
                特殊属性名称 value
                        如果使用注解的时候,只出现了value属性,value属性可以不用加前缀直接赋值

注解存在的阶段
        阶段: 源码阶段 class阶段 JVM阶段
        自定义的注解只存在于源码阶段 想要使用需要使用元注解来设置注解存在的阶段



                        Servlet3.0
和2.5版本不同 没有xml配置文件 路径配置在注解里
文件上传
        要素: 表单提交方式必须是post ,表单中有input标签file元素 有name和value
                enctype属性的值必须是multipart/form-data:可以获得文件名和文件内容

异步请求        需要设置注解asyncSupported=true 允许异步

文件上传的操作步骤
        1 获取文件响应对象
        2 获取响应头信息
        3 截取文件名称
总结可能会迟到 但永远不会缺席
回复 使用道具 举报
万冕


模拟仿写@Test(了解)

注解给JVM看,代表程序的一些特殊功能

注解的属性类型(基本数据类型,String,class,注解类型,枚举类型,以上类型的一维数组)

文件上传

Servlet3.0的一个特性就是没有web.xml了,直接用@的方式(@WebServlet("/UploadServlet")    @MultipartConfig)
上传三要素(1.表单的提交方式必须是post,2.必须要有name属性3.enctype属性,multipart/form-data)

在写代码的时候,一定要加上@MultipartConfig!!!

今天还提到了一个文件重名问题,也是用UUID来进行解决,还有一个算法,位运算 有一个小小的方式可以巧记入门

1  1  1  1
8  4  2  1
                                                                                      8  2
出现是1的才可以代表下面的数字,如果是零就不算数字  例如 1010 则就是10,非常好记
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马