JSP中使用<a>标签下载PDF,如何防止浏览器直接打开?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP中使用<a>标签下载PDF,如何防止浏览器直接打开?相关的知识,希望对你有一定的参考价值。
JSP:<a href="/file/fileload.pdf" >导出PDF</a>
这样一个标签,在点击时其是直接打开这个pdf文件的,现在我要的是点击这个时直接弹出另存为的下载框,这要怎么做?
String name = request.getParameter("name");
name=Commonsub.toUtf8String(name);
response.setContentType("application/octet-stream");
response.setHeader("Location",name);
response.setHeader("Cache-Control", "max-age=100");
//filename应该是编码后的(utf-8)
response.setHeader("Content-Disposition", "attachment; filename=" + name);
File file=new File(request.getSession().getServletContext().getRealPath("")+"/output",Commonsub.ex_chinese(name));
response.setContentLength((int)file.length());
OutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, i);
outputStream.flush();
outputStream.close();
inputStream.close();
outputStream = null; 参考技术A <a href="/file/fileload.pdf" download="fileload.pdf" >导出PDF</a>
试试看!追问
这个不起作用。
20160331javaweb之JSP 标签技术
jsp的标签技术:在jsp页面中最好不要出现java代码,这时我们可以使用标签技术将java代码替换成标签来表示
1.jsp标签:sun原生提供的标签直接在jsp页面中就可以使用
<jsp:include> -- 实现页面包含,动态包含
<jsp:forward> -- 实现请求转发
<jsp:param> -- 配合上面的两个标签使用,在请求包含和请求转发时用来在路径后拼接一些请求参数
2.EL表达式:最初出现的目的是用来取代jsp页面中的jsp脚本表达式.但是随着el的发展el的功能已经不限于此了
${el表达式}
(1)获取数据:
使用中括号的地方都可以使用点号替代,除了中括号中是数字或者中括号中包含特殊字符(-.)的情况除外
在中括号中如果不用双引号引起来则是变量,先找变量的值再拿变量的值使用.如果用双引号则是常量,直接使用常量的值
~获取常量
字符串/数字/布尔类型,直接写在el表达式中,el直接进行输出
~获取域中的变量
如果el中写的是一个变量的名,则el会调用pageContext的findAttribute方法,在四大作用域中以给定的名字找对应的属性值,找到后进行输出,如果四个域中都找不到,什么都不输出
~获取数组中的数据
~获取集合中的数据
~获取Map中的数据
~获取javabean的属性
代码演示:
//我是javabean package com.dzq.domain; public class UserBean { private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
我 的 下 面 是 jsp 页 面 ,上 面 是javabean,哈哈哈
<%@page import="java.util.*" import="com.dzq.domain.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>获取javabean的属性</h1><hr> <% UserBean user=new UserBean(); user.setUsername("hello"); user.setAge(17); pageContext.setAttribute("user", user); %> ${user.username }${user.age } <h1>获取Map中的数据</h1><hr> <% Map<String,String> map=new HashMap<String,String>(); map.put("name", "当当"); map.put("age", "17"); map.put("sex","男"); map.put("addr", "山东"); pageContext.setAttribute("map",map); %> ${map["name"] } ${map["addr"] } ${map.sex } ${map.age } <h1>获取集合中的数据</h1><hr> <% List<String> list=new ArrayList<String>(); list.add("甄嬛"); list.add("果郡王"); list.add("流朱"); list.add("浣碧"); pageContext.setAttribute("list",list); %> ${list[2] } <h1>获取数组中的数据</h1><hr> <% String [] names={"滋味","hello","呵呵"}; pageContext.setAttribute("names", names); %> ${names[0]} <h1>获取域中的变量数据</h1><hr> <% String name="hello"; pageContext.setAttribute("name", name); %> ${name} <h1>获取常量数据</h1><hr> ${"发射 发射发射" } ${199 } ${true} </body> </html>
运行截图
(2)执行运算:
算数运算
+-*/
逻辑运算
比较运算
三元运算符
empty运算符
代码演示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>empty </h1>判断对象是否为空,或者字符串为空,集合为空,域的属性为空<hr> <% String str=null; pageContext.setAttribute("str", str); %> ${empty str } <h1>算数运算</h1><hr> ${1-2 } ${2-1 } ${2+"3" } //如果有非数字参加算数运算,el表达式会试图将其转化成数字 <h1>逻辑运算</h1><hr> ${1<0 &&3>4 ||10<5} <h1>比较运算</h1><hr> ${1==1 } ${3<=2 } <h1>三元运算</h1><hr> ${10>9?"yes":"no" } </body> </html>
(3)获取常用开发对象:el中内置了11个内置对象,这些对象el内置的,不需要提前定义就可以直接在el中使用
!pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
!pageScope -- page域中属性组成的Map
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
!param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
!cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map
(4)调用java方法: -- 不需要大家自己会写调用方法的过程,只要会调用别人写好的标签库就可以了 fn标签库
~写一个类其中包含要被el调用的方法,这个方法必须是静态的方法
~写一个tld文件在其中对要被调用的静态方法进行一下描述
~在jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法
先写一个java方法:
package com.dzq.util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class ELFunc { public static String myEncode(String str,String encode){ try { return URLEncoder.encode(str, encode); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }
再写tld文件
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>MyELFunc</short-name> <uri>http://www.itheima.com/MyELFunc</uri> <function> <name>URLEnc</name> <function-class>com.dzq.util.ELFunc</function-class> <function-signature> java.lang.String myEncode(java.lang.String,java.lang.String)</function-signature> </function> </taglib>
jsp中调用java方法:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.itheima.com/MyELFunc" prefix="MyELFunc" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${MyELFunc:URLEnc("上海","UTF-8") } ${fn:toLowerCase("adaddAADTFThuhuhhhhHHhhhH") } </body> </html>
3.JSTL:
<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
<body> <h1>HTML转义输出</h1><hr> <a href="#">xxx</a> <c:out value="<a href=‘#‘>xxx</a>"></c:out> <h1>输出默认值</h1><hr> <% String addr="Hello哦"; %> <c:out value="${addr }" default="呵呵呵"></c:out> <h1>输出变量</h1><hr> <% String name="张亮"; pageContext.setAttribute("name", name); %> <c:out value="${name }"></c:out> <h1>输出常量</h1><hr> <c:out value="hello"></c:out> </body>
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的 属性。
<body> <h1>设置或修改域中javabean属性的值</h1><hr> <% UserBean user=new UserBean(); pageContext.setAttribute("user", user); %> <c:set target="${user}" property="username" value="叭叭叭"></c:set> ${user.username } <h1>设置或修改域中Map值</h1><hr> <% Map<String,String> map=new HashMap<String,String>(); pageContext.setAttribute("map", map); %> <c:set target="${map }" property="cellphone" value="10010"></c:set> <c:set target="${map }" property="cellphone" value="10086"></c:set> ${map.cellphone } <h1>设置或修改域中的属性值</h1><hr> <c:set var="name" value="韦小宝"></c:set> <c:set var="name" value="阿珂"></c:set> ${name } </body>
<c:remove>标签用于删除各种Web域中的属性
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
<body> <c:catch var="e"> <% int i=1/0; %> </c:catch> ${e.message } </body>
!!<c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
<body> <c:if test="${2>1 }"> 确实是这样的 </c:if> <c:if test="${2<=1 }"> 你确定??? </c:if> </body>
!!<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<body> <% int day=3; pageContext.setAttribute("day", day); %> <c:choose> <c:when test="${day==1 }"> 星期一 </c:when> <c:when test="${day==2 }"> 星期二 </c:when> <c:when test="${day==3 }"> 星期三 </c:when> </c:choose> </body>
!!<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
<body> <h1>实验:遍历10-100的偶数,如果数字所在位置是3的倍数,则显示成红色</h1> <c:forEach begin="10" end="100" step="2" var="i" varStatus="stat"> <c:if test="${stat.index %3==0 }"> <font color="red"> ${i } </font> </c:if> <c:if test="${stat.index %3!=0 }"> <font color="blue"> ${i } </font> </c:if> </c:forEach> <h1>循环执行指定的内容若干次</h1><hr> <c:forEach begin="0" end="10" step="2" var="i"> ${i }, </c:forEach> <h1>遍历Map数据</h1><hr> <% Map map=new LinkedHashMap(); map.put("name", "hello"); map.put("jj", "hell"); map.put("heh", "hel"); pageContext.setAttribute("map", map); %> <c:forEach items="${map }" var="m"> ${m.key}:${m.value }<br> </c:forEach> <h1>遍历集合数据</h1><hr> <% List list =new ArrayList(); list.add("美国"); list.add("韩国"); list.add("额国"); pageContext.setAttribute("list", list); %> <c:forEach items="${list }" var="l"> ${l } </c:forEach> <h1>遍历数组数据</h1><hr> <% String [] city={"北京","上海","南京","云南","李静"}; pageContext.setAttribute("city",city); %> <c:forEach items="${city }" var="c"> ${c }<br> </c:forEach> </body>
!!<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
<body> <c:forTokens items="www.baidu.com" delims="." var="str"> ${str }<br> </c:forTokens> </body>
<c:param>标签 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:import> 标签,实现include操作
<body> <c:import url="../index.jsp" var="p" scope="page"></c:import> bbb cccc cccc ${p } llll </body>
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
<body> <% String url=response.encodeURL(request.getContextPath()+"/index.jsp"); %> <a href="<%=url %>">jajaj</a> <c:url value="/index.jsp" context="${pageContext.request.contextPath }" var="url" scope="page"></c:url> <a href="${url }">bbbb</a> </body>
<c:redirect>标签用于实现请求重定向
<body> <c:redirect url="/index.jsp" context="${pageContext.request.contextPath }"></c:redirect> </body>
4.自定义标签技术:
暂时省略
以上是关于JSP中使用<a>标签下载PDF,如何防止浏览器直接打开?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 <object> 禁用 JSP 中显示的 PDF 中的功能键,从而(部分)阻止保存?
javaWEB项目中JSP页面使用<object>标签中的属性basecode加载cab文件,打开页面后无法自动下载cab