我們先來了解一下request.setAttribute和request.getAttribute()這兩種方法的作用。
request.getAttribute("nameOfObj"); 可得到jsp頁面表單中輸入框內的value。(其實表單控件中的Object的name與value是存放在一個哈希表中的,所以在這里給出Object的name會到哈希表中找出對應它的value)
request.setAttribute(position,nameOfObj);屬於頁面之間的傳值,從a.jsp到b.jsp一次傳遞,之后這個request就會失去他的作用范圍,再傳就要重新設一個request.setAttribute()。(使用session.setAttribute()會在一個過程中始終保持這個值)
注:javascript與jsp中不能相互傳值,因為javascript運行在客戶端,jsp運行在服務器端。若想使他們能夠相互傳參數,可以在jsp頁面中設置一個hidden屬性的控件,用它的value來傳遞所需的數值。
1、把js直接寫在了JSP頁面,所以能獲取到。如果單獨把JS抽離出來是不可能獲取到的。前者服務端解析能或許到,后者客戶端解析獲取不到。
2、js里是在客戶端執行的,不能直接獲取,因為EL表達式是在服務器的時候被解析的,所以可以獲取到。一個是客戶端的東西,一個是服務器端的東西。
3、jsp能取到,那是因為他本身就是servlet。js不可能有方法直接獲取到HttpServletRequest里面的屬性值。
4、setAttribute是服務器行為,到了客戶端就無效了,也談不上如何用。除非你在jsp的時候就寫到js變量里,或者使用ajax請求你需要的數據。
下面開始進入正題:
java后台通過:
request.setAttribute("msg","成功!!");
在jsp/html頁面就可以通過EL表達式獲取到request中設置的屬性值:
<div>${msg}</div>
js中獲取request中的值,就有兩種方式:
第一種:
var msg="<%=request.getAttribute("msg")%>"; alert(msg);
第二種:
var msg="${msg}"; alert(msg);
這里不能寫在引入的js頁面中,上面已經說了,他們解析的方式不同,寫在外部的js中識別不了,可以通過在html.jsp頁面中設置一個隱藏域,然后獲取它的value值。如:
JSP中: <input type="hedden" value="${student.name}" id="stuName"/> javascript中: var stuName=$('stuName').value;
我的后台代碼:
@RequestMapping(value = "showList", method = RequestMethod.POST) private void showList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 前台獲取的設備台賬名 String sbtzname = request.getParameter("sbtzname"); // mongodb數據庫名 String mongodbname = "filecollection"; String sssmid = request.getParameter("sssmid"); Mongo mongo = new Mongo(); DB db = mongo.getDB(mongodbname); GridFS gridFS = new GridFS(db,sbtzname); DBObject query = new BasicDBObject("userId", 1); List<GridFSDBFile> gridFSDBFileList = gridFS.find(query);// 查詢所有的檔案文件 try { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); carDataService = (CarDataService) ctx.getBean("carDataService"); DBCollectionInfo collection = new DBCollectionInfo(mongodbname, sbtzname); Map<String, Object> mapData = new HashMap<String, Object>(); mapData.get("smid"); DBCollectionInfo mapdbCollection = new DBCollectionInfo(mongodbname,sbtzname); Map<String, Object> whereClause = new HashMap<String, Object>(); whereClause.put("smid", sssmid); List<Map<String, Object>> lstResult = carDataService.getlistdata(mapdbCollection); lstResult = carDataService.getlistdata(mapdbCollection, whereClause);// 所有collection檔案表 // 根據sssmid判斷是否有檔案數據 if (lstResult.size() != 0) { Map<String, Object> mapUser = lstResult.get(0); // 拿到的總的collection檔案名字 String mapString = (String) mapUser.get("filename"); int a = gridFSDBFileList.size(); int b = 0; // 循環所有文件 for (int s = 0; s < a; s++) { // s-b是動態變化的,否則會報越界錯誤,因為gridFSDBFileList移除后size會改變 String listname = (String) gridFSDBFileList.get(s - b).get("filename"); // 如果文件名不包含就刪除 if (!mapString.contains(listname)) { if (s == 0) { gridFSDBFileList.remove(s); // 記錄刪除次數 b = b + 1; } else { gridFSDBFileList.remove(s - b); // 記錄刪除次數 b = b + 1; } } else { // 如果文件名包含不做操作,保留數據 } } } else {// 檔案中無此ssmid,全部為空 gridFSDBFileList = null; } String wanliid = sssmid; //將設備台賬名字返回文件詳情頁面 request.setAttribute("sbtzname",sbtzname); request.setAttribute("wanli", wanliid); request.setAttribute("gridFSDBFileList", gridFSDBFileList); request.getRequestDispatcher("/fileList.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); request.setAttribute("gridFSDBFileList", gridFSDBFileList); request.getRequestDispatcher("/fileList.jsp").forward(request, response); } }
我的前台代碼:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <% String path = request.getContextPath() + "/"; %> <!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> <script src="js/jquery.min.js"></script> <script type="text/javascript"> function goback(){ history.go(-2); } </script> </head> <body style="background-color:#000022"> <form > <c:if test="${empty gridFSDBFileList}"> <div align="center"><h1><b><font color="red">無文件!</font></b></h1></div> </c:if> <c:if test="${!empty gridFSDBFileList}"> <%-- <p><a href="<%=path %>/downLoadZipServlet.do?id=${o.id}">全部打包下載</a></p> --%> <c:forEach items="${gridFSDBFileList}" var="o"> <%-- <img src="<%=path %>fileServlet?method=downloadFile&id=${o.id }" width="109" height="87" /> --%> <b><font color="red">檔案名稱:${o.filename}</font></b>
<!--前台從后台取值-->
<br/><a href="<%=path %>downloadFile.do?id=${o.id}&sbtzname=${sbtzname}">下載</a> <a href="<%=path %>delete.do?id=${o.id}&wanliid=${wanli}&sbtzname=${sbtzname}">刪除</a></p> </c:forEach> </c:if> </form> </body> </html>