实现文件下载上传代码实现
/**
* 文件下载实现
*
* @author ZZ
*
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 通过.html文件跳转,请求中包含的文件路径,通过request对象来获得路径名
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
/*
*设置 第一个响应头:response.setHeader("Content-Type", fileType);
* 其中fileType是文件的MIME类型 第二个头:response.addHeader("Content-Disposition",
* "attachment;filename="+filename);
* 告诉浏览器这是需要下载的一个文件,即使浏览器能够直接打开,也要给我一个下载框,filename它是文件的名称
*/
// 通过文件的相对路径名来获得文件的MIME类型
String mimeType = this.getServletContext().getMimeType(filename);
// 设置第一个头Content-Type;
response.setHeader("Content-Type", mimeType);
System.out.println(filename+"--------01");
System.out.println(request.getContextPath()+"--------03");
// 通过文件的相对路径调用servletContext的方法获取一个输入流对象is
InputStream is = this.getServletContext().getResourceAsStream(filename);
// 通过获得浏览器的信息来更改浏览器提示的信息User-Agent头中包括了浏览器的信息
String user_Agent = request.getHeader("User-Agent");
// 对浏览器进行判断,分别使用不同的乱码处理方式
if (user_Agent.contains("Firefox")) {
// 说明是火狐浏览器
filename = base64EncodeFileName(filename);
} else {
// 其它浏览器使用URL编码
filename = URLEncoder.encode(filename, "utf-8");
}
System.out.println(filename+"--------02");
// 设置第二个头Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 通过response对象来获得一个输出流os
ServletOutputStream os = response.getOutputStream();
// IO流的文件复制
int length = 0;
byte[] bytes = new byte[1024];
while ((length = is.read(bytes)) != -1) {
os.write(bytes, 0, length);
}
is.close();
os.close();
}
/**
* 9.火狐浏览器解决下载框的中文乱码方法
*
* @param fileName
* @return
*/
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
文件上传
form表单上传文件
method="post"
enctype="multipart/form-data"
public String saveProduct(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 先建立一个文件工程,两个参数,一个表示存放多大后进行flush刷新,另一个表示工厂的位置
String realPath = request.getServletContext().getRealPath("/products");
// 存储10M后进行刷新
FileItemFactory factory = new DiskFileItemFactory(1024 * 1024 * 10, new File(realPath));
// 建立一个Servlet文件上传对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 设置文件上传大小的限制
fileUpload.setSizeMax(50 * 1024 * 1024);
Map map = new HashMap();
try {
// 获得所有提交数据组成的迭代器对象
@SuppressWarnings("unchecked")
List list = fileUpload.parseRequest(request);
if (list != null) {
// 说明有提交参数
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
// 遍历这个迭代器
FileItem fileItem = iterator.next();
// 判断是否是file普通域对象
if (fileItem.isFormField()) {
// 说明是普通表单域对象
// 获得提交数据的key,即name
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
map.put(name, value);
} else {
// 说明文件表单域对象,进行文件上传
// 获得文件名
String filedName = fileItem.getName();
String name = fileItem.getFieldName();
// 创建文件对象
File file = new File(realPath + "/" + filedName);
map.put(name, "products/" + filedName);
// 进行写入
fileItem.write(file);
}
}
}
// 将数据存入数据库
Product product = new Product();
BeanUtils.populate(product, map);
// 存储product对象
product.setPid(UUIDUtils.getId());
product.setPflag(0);
productService.saveProduct(product);
} catch (Exception e) {
throw new RuntimeException(e);
}
return null;
}
request.getRequestDispathcer().forword和include的区别:forword是请求转发,而include是将页面放入response中返回(等同于write整个页面的数据给前台,可以利用include自己通过ajax实现ajax.load方法)
JSP学习随笔
声明一个JSP页面
pageEncoding="UTF-8"%>
JSP的运行原理
先将JSP解析为.java文件,该.java就是一个Servlet类,然后编译为.class文件运行
JSP的9大内置对象
request --- HttpServletRequest
session --- HttpSession
application --- HttpServletContext
response --- HttpServletResponse
config --- HttpServletConfig
pageContext ---- pageContext
out
exception
page
JSP脚本:
:写在这个里面的内容相当于写在方法(_JspService(参数1,参数2))中的代码
:写在这个里面的内容相当于写在类(当前jsp翻译成的java类)中的代码
:写在这个里面的内容相当于response.getWriter.write();向浏览器输出内容
JSP注释:
:JSP注释,它会影响整个页面的最终结果
// :java注释,它会影响整个页面的最终结果
:HTML注释,它不会影响整个页面的最终结果
EL表达式中11个内置对象
param
paramValues
header
headerValues
initParam
cookie
pageContext
pageScope
requestScope
sessionScope
applicationScope
取值时,page_scope的作用?
pageContext.getAttribute("book",pageContext.REQUEST_SCOPE);
明确指出从哪个域范围中获取属性值!!!!!上面这个它不会从page域中获取数据,而是从request域中。
如果没有指定scope,那么会根据你使用的这个域对象来找
pageContext.getAttribute("book"); //从page域中查找
如果没有指定scope,调用的是findAttribute();它会从最小的访问依次向大范围查找直到找到为止,如果找到不去更大的范围找,如果连最大范围都没找到,返回null
pageContext域对象的使用
作用域为当前页面
提供了获得其他8内置对象的方法 getXXX()
域对象方法有点特别
pageContext设置了四个int类型的属性值scope
1.PAGE_SCOPE
2.REQUEST_SCOPE
3.SESSION_SCOPE
4.APPLICATION_SCOPE
域中值的操作与其他与类似,不过多了一个参数 int scope
多了一个findAttribute(name)方法,若有多个相同name,则根据域的范围大小由小至大返回
JSP指令
静态包含
--- 将指定位置的文件数据直接添加到此处,合并为一个.jsp文件
动态包含
flush表示是否刷新out.print数据
动态包含:先解析为.java再编译为.class文件,在合并为一个html文件
page指令:
常用属性:
contentType: 指定MIME类型以及页面的编码
pageEncoding:指定页面编码(它和contentType至少写出一个来,那么另外一个默认就和这个的值一样,如果写2个值必须一致)
isErrorPage: 我们可以通过设置该属性来查看9大内置对象的Exception对象!
language:指定语言 java
import:当我们在jsp页面中书写了java代码,使用的 包可以使用这个属性来引入
tomcat的目录结构
bin:存放的都是一些二进制的可执行文件(sartup.bat启动tomcat,shutdown.bat停止tocmat服务器)
logs:存放所有tomcat启动的日志信息
conf:存放一些xml形式的配置文件(web.xml server.xml需要掌握的两个配置文件!)
web.xml 除了一个servlet默认处理类和session默认存活时间以外,全都是MIME类型(浏览器能够看懂)
server.xml 在这个文件中我们可以修改服务器的端口号,还有一些加载到tomcat里面运行的项目信息。
temp:存放一些临时文件,我们可以手动删除,下次启动,自动会创建这个目录。
lib:存放tomcat依赖的所有jar包。()
webapps:存放我们自己编写 的一些项目
work:如果用户访问的是一个jsp页面,那么在这个目录里面会生成对应的java文件(session的创建)