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();
}
}