servlet、jsp跳轉(傳值)總結及URL傳參數__js
最後更新:2018-07-30
來源:互聯網
上載者:User
Servlet傳值總結 1) redirect方式 [ 效率不高 ]
request和response沒有傳給目標頁面
response.sendRedirect("/a.jsp");
頁面的路徑是相對路徑。sendRedirect可以將頁面跳轉到任何頁面,不一定局限於本web應用中,如:
response.sendRedirect("URL");跳轉後瀏覽器地址欄變化。
這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。
傳值:HttpSession session =request.getSession();
session.setAttribute("bbbb", 1111111111);
取值:session.getAttribute("bbbb");
傳值:RequestDispatcher rd =application.getRequestDispatcher("/queryResult.jsp?a="+000);
取值:request.getParameter("a")
2) forward方式 [ 更多地使用此方法進行伺服器端的跳轉 ]
Servlet Context application =this.getServletContext(); //this是這個頁面
RequestDispatcher rd = application.getRequestDispatcher("/目標頁面");
rd.forward(request, response);
Servlet頁面跳轉的路徑是相對路徑。forward方式只能跳轉到本web應用中的頁面上,跳轉後瀏覽器地址欄不會變化。
使用這種方式跳轉,傳值可以使用三種方法:url中帶parameter,session,request.setAttribute
傳值:request.setAttribute("a", 00);
取值:request.getAttribute("a");
傳值:HttpSession session =request.getSession();
session.setAttribute("bbbb", 1111111111);
取值:session.getAttribute("bbbb");
傳值:RequestDispatcher rd =application.getRequestDispatcher("/queryResult.jsp?a="+000);
取值:request.getParameter("a");
getParameter()只能傳遞字串,而setAttribute()/getAttribute()還可以傳遞對象
其次getParameter方法傳遞的資料,會從Web用戶端傳到Web伺服器端,代表HTTP請求資料。
只能是頁面發送到後台或者Web用戶端傳到Web伺服器端
=======================================================================
servlet 和 jsp 跳轉頁面的幾種方法
跳轉分兩部分:
一是發生在servlet,一是在JSP,其實JSP也就是servlet,不過還是有點差異滴。當然,在servlet中,一般跳轉都發生在doGet, doPost等方法裡面。
Servlet:
(1)redirect 方式
response.sendRedirect("/a.jsp");
頁面的路徑是相對路徑。
sendRedirect可以將頁面跳轉到任何頁面,不局限於本web應用中,如:response.sendRedirect(http://www.ycul.com);
跳轉後瀏覽器地址欄變化。
這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。
(2) forward方式
request.getRequestDispatcher("/a.jsp").forward(request, response);
或
getServletContext().getRequestDispatcher("/a.jsp").forward(request, response);
頁面的路徑是相對路徑。
forward方式只能跳轉到本web應用中的頁面上。
跳轉後瀏覽器地址欄不會變化。
使用這種方式跳轉,傳值可以使用三種方法:url中帶parameter,session,request.setAttribute
JSP
1)response.sendRedirect();
和servlet的response.sendRedirect()方式一樣。
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)....
跳轉後瀏覽器地址欄變化
如果要跳到不同主機下,跳轉後,此語句後面的語句會繼續執行,如同新開了線程,但是對response的操作已經無意義了;
如果要跳到相同主機下,此語句後面的語句執行完成後才會跳轉
2)response.setHeader("Location","");
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉後瀏覽器地址欄變化
此語句後面的語句執行完成後才會跳轉.
3)<jsp:forward page="" />
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
跳轉後瀏覽器地址欄不變,但是只能跳到當前主機下
此語句後面的語句執行完成後才會跳轉 ==============================================================
例題:login.jsp---->LoginServlet.java----->UserDAO.java----->success.jsp
請看下面項目部署結構: web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>loginservlet</servlet-name>
<servlet-class>com.laolu.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginservlet</servlet-name>
<url-pattern>/loginservlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>login.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="loginservlet" method="post">
使用者名稱:<input type="text" name="uname" /><br/>
密碼:<input type="password" name="ps" /><br/>
文本域:<textarea rows="10" cols="30" name="text"></textarea><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
LoginServlet.java:
package com.laolu.servlet;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.laolu.dao.UserDAO;
public class LoginServlet extends HttpServlet{
public void doGet (HttpServletRequest request,HttpServletResponse response){
String name = request.getParameter("uname");
byte[] b;
try {
b = name.getBytes("iso8859-1");
String username = new String(b,"UTF-8");
String password = request.getParameter("ps");
String text = request.getParameter("text");
//設定session範圍屬性
request.getSession().setAttribute("china", "李靜");
//設定request範圍屬性
request.setAttribute("n", "肖人");
UserDAO user = new UserDAO();
boolean flag = user.findUser(username,password);
if(flag){
//將需要轉寄或發送的地址進行轉碼操作。這樣在目標頁面更好取值,以免亂碼產生
String url = "forward/success.jsp?first=傳遞第一個參數&second=傳遞第二個參數";
url = new String(url.getBytes("UTF-8"),"ISO8859-1");
//用戶端跳轉。只有session範圍的屬性及url中參數會被傳遞下去
//response.sendRedirect(url);
//伺服器端跳轉。request對象、url中的參數會被傳遞下去
request.getRequestDispatcher( url).forward(request, response);
}else{
response.sendRedirect("forward/error.jsp");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response){
doGet(request, response);
}
}
success.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
servlet登入成功。<br/><br/>
<!-- 取得在servlet中設定的session範圍屬性值 -->
<%= "session中取得的屬性值"+ session.getAttribute("china") %><br/>
<!-- 取得通過url傳遞的參數的值。並進行解碼。否則會亂碼 -->
<%="url中第一個參數:"+ new String(request.getParameter("first").getBytes("ISO8859-1"),"UTF-8") %>
<br/>
<%="url中第二個參數:"+ new String(request.getParameter("second").getBytes("ISO8859-1"),"UTF-8") %>
<br/>
<!-- 取得在servlet中設定的request的屬性值。並進行解碼。否則會亂碼 -->
<%="request中取得的屬性值:"+ request.getAttribute("n") %>
<br/>
<!-- 取得表單提交過來的資料。同樣需要進行解碼-->
<%=new String(request.getParameter("text").getBytes("ISO8859-1"),"UTF-8") %>
</body>
</html>
error.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
servlet輸入錯誤,<a href="forward/login.jsp">請重新登入</a>
</body>
</html>
UserDAO:
package com.laolu.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UserDAO {
Connection conn = null;
//去串連資料庫,查詢userInfo表中的資料
//1.串連資料庫
public Connection getCon(){
//1.載入資料庫驅動程式:微軟公司開發的資料庫驅動程式jar包,添加到WEB-INF/lib目錄下
String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DataBaseName=abc";
try {
Class.forName(driver);
try {
conn = DriverManager.getConnection(url,"sa",&