service-JSTL和EL表达式 和文件上传下载

service  服务 继承HttpServlet重写service方法

 

request.setAttribute("key",value);-----------在web里用于存放值的存在

request.getAttribute("key");-----------在web里用于存放值的存在

==============================================

socket

socket容器---用于进行tomcat服务器的传递(简单就是一个管道)

jsp

jsp------java server page -----java服务页面

是用于Java写回给浏览器做动态响应的,如果需要找到jsp页面 需要通过一下代码实现

RequestDispatcher rd = req.getRequestDispatcher("login.jsp");
rd.forward(req,res);

重定向和转发*****

转发                                                             重定向区别

forward                                                        sendRedirect

1.RequsetDispacher类                                HttpServletResponse类

2.rd.forward(req,res)                                   response.sendRedirect("path")

3.转发是服务器内部完成的 浏览器              重定向就是告诉浏览器你去找别的地方,让浏览器找其他的地方

不知道。服务器内部传递的req和res           (相当于二次请求)

简单说就是转发就是浏览器叫我做A,

我A不会 但是B会 所以我找B,但是呢浏览器不知道

反正最后相应回来之后,浏览器只知道自己发送了找A

最后响应回来之后就是A的返回值就行了

(相当于一次请求)

4.转发浏览器地址栏不变                                重定向浏览器地址栏会变 

5.

jsp有九个内置对象

HttpServletRequest          request

HttpServletResponse       response--------一次请求

HttpSession                      session-----------一次会话

ServletContext                 application-------全局

ServletConfig                   config--------------当前页面的

JspWrite                           out

Object                               page 

PageContext                    pageContext

Exception                         exception

 

其中 在jsp页面 写Java代码:

<%@   %>---- Java说明的放在头部    用来说明性质的描述

<%@ page   %>---- Java说明的放在头部   

                              contextType="text/html";charset=""UTF-8"告诉浏览器解析遵循的规则

                              language=''java''告诉jsp中含有的语言

                              pageEncoding="UTF-8" 告诉Tomcat解析jsp时候的语言

                              import=" java.util... " 导入其他的类

                              isErrorPage="true" 设置当前是异常页

                              errorPage="xxx.jsp"  当前的jsp的路径

<%@ taglib %>---- Java说明的放在头部---jstl

                                uri=" http://java.sun.com.... "        prefix = "c"

                                 引入一个标签                              为了让资源可以快速使用 设置快捷键c:xxxx

<%@ include  %>---- Java说明的放在头部----引入jsp中写好的资源

                                可以引入jsp和html

 

<%!%>----方法外部方法是jsp内部的service方法   一般作为属性方法等成员存在

<%    %>----方法外部  形式写Java代码    一般就是普通的方法

<%= %>----方法外部  这里用于打印 需要用赋值和拼接    一般就是方法的赋值拼接

=======================================================

JSTL和EL表达式

EL:   

${ XXXXScorp.getAttr... }

JSTL表达式:     

JSTL基本使用*
        描述头信息<%@ tablig uri="" prefix=""%>
        core    functions    fmt
        c:if   c:forEach
JSTL自定义
        1.自定义函数
            自己写一个类
            自己设计方法   必须是静态方法
            编写一个"说明书"    x.tld
            JSP引入头信息<%@ tablig uri="" prefix=""%>
        2.自定义标签
            自己写一个类   实现Tag接口
            重写所有的抽象方法   每一组的get/set属性补全
            如果标签中有属性<c:out value="">   类中就需要添加属性 value
            最主要的就两个    doStartTag    doEndTag
            编写一个"说明书"     x.tld
            JSP引入头信息<%@ tablig uri="" prefix=""%>

文件上传和下载

导包

commons-fileupload.jar
commons-io.jar

下载地址: www.apache.org

上传的步骤


浏览器端
            1.写一个jsp/html做展示(选择某一个文件)
            2.必须通过表单提交
            3.必须使用post方式
                规定:ServletFileUpload类中一个属性  post
                字节数:
                    get没有限制,肯定通过URL拼串儿
                    每一个不同浏览器对于URL处理长度有所不同
                    IE 2048+35  IE 4076
                    Google  8182    FireFox 65535
                    Safari   80000    Opera 190000
                    post没有限制,需要web容器的支持,跟容器的处理性能有关
                    比如Tomcat,没有限制,可以通过配置文件
                    server.xml   <Connector port="8080" maxPostSize="0">
            4.以前的表单只有两个属性  action  method="post"
                如果想要做文件上传  表单中必须再添加一个属性
                enctype="multipart/form-date"
            5.必须使用<input type="file">通过这个组件让用户选择上传的文件
                不仅仅能得到文件名   将文件的内容读出来

<form action="saveFile" method="post" enctype="multipart/form-data">
    请输入你的名字: <input value="" name="userName" type="text"><br>
    请输入你的id:  <input name="userId" value="" type="text"><br>
    <input type="file" value="" name="这是一个文件">
    <input type="submit" value="点击提交">
</form>

 


 服务器端
            1.引入文件上传需要的jar包
                commons-fileupload-1.4.jar
                commons-io-2.6.jar
            2.使用一个DiskFileItemFactory对象
                DiskFileItemFactory factory = new DiskFileItemFactory();
               使用一个ServletFileUpload对象   包含一个factory
                ServletFileUpload upload = new ServletFileUpload(factory);
               使用upload对象解析request   得到一个List<FileItem>
                List<FileItem> itemList = upload.parseRequest(request);
            3.自己的业务逻辑
                通过遍历集合可以获取每一个item元素
                FileItem item 元素可能是一个普通组件   可能是一个文件
                item.isFormField();方法可以判断是否是一个普通文件
                如果item是一个普通的组件
                    注意:不能用原生的方式获取参数request.getParameter();
                    使用如下方式获取
                    String = item.getFieldName();获取组件的name属性
                    String = item.getString();获取组件的value属性
                    注意:不能使用原生的方式处理中文request.setCharacterEncoding();
                    使用如下方式处理

 


        try {
            request.setCharacterEncoding("UTF-8");
            //创建一个导入的jar包里的工厂
            DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
            //通过工厂对象创建一个文件上传对象
//            fileItemFactory.setSizeThreshold(102400000);//设置缓存文件的大小
//            fileItemFactory.setRepository(new File(""));//设置缓存文件的位置
            ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
//            upload.setFileSizeMax(3);//设置上传文件的单个文件大小
//            upload.setSizeMax(3);//设置上传文件的总大小
            //通过文件上传对象 解析requset 返回的是一个list<FileItem> 对象
            List<FileItem> items = upload.parseRequest(request);
//===================================================================================
            for (FileItem item : items){
                if (item.isFormField()){ //这是普通的按钮
                    //item.getString();方法重载 可以
                    System.out.println(item.getString("UTF-8"));
                    System.out.println(item.getFieldName());
                }else{//这是文件
                    //注意这里的真实的文件名字是可能会乱码的 所以需要处理真实文件名字的真实字符集
                    //以下两个方式可以 任选一个
//                    request.setCharacterEncoding("UTF-8");
//                    upload.setHeaderEncoding("UTF-8");
                    String key = item.getFieldName();//获取组件的name属性
                    String name = item.getName();//获取真实文件的名字
                    System.out.println("文件名字哦"+key+"------"+name);
                    InputStream inputStream = item.getInputStream();
                    //下面是文件的item的操作
                    item.write(new File("D://test/"+name));
                    //以下是文件原始的操作
//                    OutputStream outputStream = new FileOutputStream("D://test/"+name);
//                    byte[] bytes = new byte[1024];
//                    int length = inputStream.read(bytes);
//                    while (length!=-1){
//                        outputStream.write(bytes,0,length);
//                        outputStream.flush();
//                        length = inputStream.read(bytes);
//                    }
//                    outputStream.close();

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
     基本的流程
        1.下载jar包    apache官网下载     commons-fileupload-1.4.jar
                                  commons-io-2.6.jar
        2.浏览器端
            必须使用form表单
            必须是post方式提交
            表单中必须添加enctype属性   multipart/form-date
        3.服务器端
            写一个controller
            创建一个DiskFileItemFactory
            创建一个ServletFileUpload对象(factory)
            通过upload对象解析request    List<FileItem>

            item.isFormField();判断当前的item是否是一个普通组件
                item.getFieldName();
                item.getString("UTF-8");
            如果item判断后是一个文件
                读取文件的内容
                item.getInputStream();    
                item.write(File file);
        4.如果上传的文件较大
            产生临时文件   为了防止丢包
            默认情况下存在tomcat的temp文件夹中
            factory.setSizeThreshold(1024000);//设置缓冲区大小      默认10240
            factory.setRepository(new File("路径"));//设置缓冲区位置
            还可以设置上传文件本身的大小
            upload.setFileSizeMax();//单个上传文件的大小    1M
            upload.setSizeMax();//上传文件的总大小        3M

    ------------------------------------------------------------------------------------------------
    小总结
    文件上传需要注意的事情
    1.浏览器端需要满足三个条件    form表单    post请求     enctype属性    file组件(多个)
    2.服务器端需要满足        factory工厂对象    upload对象    解析request方法   List<FileItem>
    3.上传文件保存的路径
        放在一个固定的位置D://test    可移植性不好
        放在当前工程的根目录下
            String path = this.getServletContext().getRealPath("/");根目录
    4.最好限制一下文件上传的大小    单个   总体   缓冲区
    5.如果文件上传出现文件名冲突的问题?
        原来名字+用户+时间.原来后缀
        1_zzt_date.jpg
        用一个随机产生的名字当做保存在服务器中的文件名
        1.jpg--->xxxxx.jpg        1   xxxxx    路径    用户   上传时间
        一个随机名字创建一个文件夹
        1.jpg放在文件夹里        用户   路径   文件夹名
    6.有些时候可能上传的文件需要控制类型
        自己设计一个方法

文件下载 

	文件上传
	本质:IO读写
	1.下载jar
		apache	commons-fileupload.jar	commons-io.jar
	2.浏览器端
		form表单  post方式  enctype属性  file组件(可以不止一个)
	3.服务器端
		创建DiskFileItemFactory
			factory.setSizeThreshold(int);	设置缓冲区大小	默认10240
			factory.setRepository(file); 设置临时文件存储位置	默认存在Tomcat中的temp文件夹内
		创建ServletFileUpload
			upload.setFileSizeMax(long);设置上传单个文件的大小
			upload.setSizeMax(long);设置上传文件的总大小
			upload解析Request对象
			List<FileItem> = upload.parseRequest(request);
			
			FileItem类中的方法
			item.isFormField();是否是一个普通的组件
				普通组件
				item.getFieldName();普通组件的name属性
				item.getString("UTF-8");普通组件的value属性	
				file组件
				item.getFileName()普通组件的name属性
				item.getName();获取上传文件的文件名	(request.setCharacterEncoding("UTF-8")  upload.setHeaderEncoding("UTF-8"))
				item.getInputStream();获取输入流	配合原生的方式输出流 写入文件
				item.write(file);
	4.上传文件知识的补充
		上传的同时监督一下进度
		upload对象
		upload.setProgressListener(new ProgressListener(){
			public void update(long l, long l1, int i) {
				//  第一个参数表示 已经上传的字节个数   4096个字节
				//  第二个参数表示 上传文件的总字节数
				//  第三个参数表示 正在上传第几个组件
				System.out.println("正在上传第"+i+"个组件,已经上传"+((((double)l/(double)l1)*100))+"%");
				try {
					Thread.sleep(300);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});


	5.文件下载
		浏览器端	发送请求的按钮
			<a href="download?fileName=xxxx"></a>
		服务器端
			1.接受需要下载的文件名
			2.找到文件并创建输入流读取内容
			3.处理一下响应时的中文字符
			4.设置响应内容类型和状态
			5.response创建输出流将内容响应回浏览器
			


 

--------------------------------------------下载------------------------

    <body>
        <a href="downLoad?fileName=jdk-8u191-windows-x64.exe">下载</a>
    </body>
//1.获取请求传递的文件名(需要下载的文件)
String fileName = request.getParameter("fileName");
//2.通过fileName找到一个服务器中的真实文件(固定位置 当前工程内部)
//      找到文件需要一个输入流读取文件中的内容
InputStream inputStream = new FileInputStream("D://test/"+fileName);
//3.如果文件名含有中文,通过以下方式处理
fileName = URLEncoder.encode(fileName,"UTF-8");
//4.设置响应的contentType
//  ServletFileUpload--->FileUpload--->FileUploadBase
//  调用静态常量进行拼接字符串
response.setContentType("application/x-msdownload");
response.setHeader("Content-disposition","attachment;filename="+fileName);
//5.将内容响应回浏览器
OutputStream outputStream = response.getOutputStream();
byte[] b = new byte[1024];
int length = inputStream.read(b);
while(length!=-1){
    outputStream.write(b,0,length);
    outputStream.flush();
    length = inputStream.read(b);
}

 

---------------------------------------上传-------------------------------------

    <form action="saveFile" method="post" enctype="multipart/form-data">
      请输入名字:<input type="text" name="username" value=""><br>
      请选择文件:<input type="file" name="testFile1" value=""><br>
      请选择文件:<input type="file" name="testFile2" value=""><br>
      请选择文件:<input type="file" name="testFile3" value=""><br>
      <input type="submit" value="确定">
    </form>
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
//            request.setCharacterEncoding("UTF-8");
            //创建一个工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024*1024*1024);//设置缓冲区大小
//            factory.setRepository(new File(""));//设置缓冲区位置
            //创建一个ServletFileUpload对象(构造方法中需要factory帮忙)
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(1024*1024*1024);

            upload.setProgressListener(new ProgressListener(){
                public void update(long l, long l1, int i) {
                    //  第一个参数表示 已经上传的字节个数   4096个字节
                    //  第二个参数表示 上传文件的总字节数
                    //  第三个参数表示 正在上传第几个组件
                    System.out.println("正在上传第"+i+"个组件,已经上传"+((((double)l/(double)l1)*100))+"%");
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });



            //通过upload解析request对象(解析目的是因为请求携带的信息都在request对象中)
            List<FileItem> itemList = upload.parseRequest(request);
            //将list中所有的item元素遍历
            for(FileItem item : itemList){
                if(item.isFormField()){//是一个普通的组件
                    //注意不能使用request.getParameter("key");来获取   request对象已经被解析了
//                    System.out.println(request.getParameter("username"));
                    String key = item.getFieldName();//获取组件的name属性
                    //String value = item.getString();//获取组件的value属性
                    String value = item.getString("UTF-8");//使用重载方法传递处理字符集的key
                    System.out.println(key+"--"+value);
                }else{//是一个file文件
                    //???小悬念
                    String key = item.getFieldName();//获取组件的name属性
                    String realFileName = item.getName();//获取上传文件的真实文件名
//                    boolean result = this.testFileType(realFileName);
                    //如果传递的文件真实中文名有问题
                    //request.setCharacterEncoding("UTF-8");
                    //upload.setHeaderEncoding("UTF-8");
                    System.out.println(key+"--"+realFileName);
                    //桌面充当浏览器端  D://test充当服务器端
                    //如何获取根目录
//                    this.getServletContext().getRealPath("/");
                    item.write(new File("D://test/"+realFileName));

                    //原生的方式实现文件的上传
//                    InputStream inputStream = item.getInputStream();//获取一个输入流  读取网络传递过来的文件内容
//                    OutputStream outputStream = new FileOutputStream("D://test/"+realFileName);
//                    byte[] b = new byte[1024];
//                    int length = inputStream.read(b);
//                    while(length!=-1){
//                        outputStream.write(b,0,length);
//                        outputStream.flush();
//                        length = inputStream.read(b);
//                    }
//                    outputStream.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值