JSP中使用<a>标签下载PDF,如何防止浏览器直接打开?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP中使用<a>标签下载PDF,如何防止浏览器直接打开?相关的知识,希望对你有一定的参考价值。

JSP:<a href="/file/fileload.pdf" >导出PDF</a>
这样一个标签,在点击时其是直接打开这个pdf文件的,现在我要的是点击这个时直接弹出另存为的下载框,这要怎么做?

前台jsp实现下载
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,如何防止浏览器直接打开?的主要内容,如果未能解决你的问题,请参考以下文章

jsp用 超链接 A标签如何实现页面跳转

如何使用 <object> 禁用 JSP 中显示的 PDF 中的功能键,从而(部分)阻止保存?

javaWEB项目中JSP页面使用<object>标签中的属性basecode加载cab文件,打开页面后无法自动下载cab

(JSP)关于手机端(尤其是苹果手机)pdf文件无法打开的解决方案

如何用js在pc页面不打开新页面就直接下载PDF的方式

如何在 JSP 页面的脚本标签中使用 <c:forEach>?