Java Web中的servlet、jsp、session等的用法。
1、當伺服器響應客戶端之後,request和response會立即銷燬,在客戶端去訪問伺服器的時候就開啟Servlet,當Servlet開啟之後就會產生request和response。
2、訪問Servlet的6種方式:通過位址列輸入網址提交訪問(直接在瀏覽器上寫網址訪問),表單訪問,超連結訪問,偽連結訪問,函式訪問,用Java程式碼訪問(不講)。
①位址列輸入網址提交訪問:http://ip:port/專案名稱/user.do<後面可以追加引數,別忘了追加前加一個’?’> ===>其中,user.do也可以寫成user.action。
其實就是get方法訪問,這種訪問方法出現的問題為:亂碼,引數在位址列可以看見且引數大小不能超過255個字元,不安全。
②表單:post提交方式無亂碼,以後用表單方式訪問時,統統採用post方式提交。
<!-- JSP --> <body> <form action="user.do" method="post"> 使用者名稱:<input type="text" name="name" /><br /> 密 碼:<input type="text" name="pwd" /><br /> <input type="submit" value="提交" /><br /> </form> </body>
訪問方式有get方式提交 ===>如要更改,可配置為post方式為:method=“post”<位址列上不顯示,安全>
post方式提交。 ===>如要更改,可配置為get方式為:method= “get”<這也是預設方式。不安全>
表單驗證方式也不安全。易造成SQL注入攻擊,程式碼如下:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //sql public class UserServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // response.setContentType("text/html;charset=UTF-8"); String name = request.getParameter("name");// 取表單資料或位址列引數的方式。 String age = request.getParameter("age"); // if(name!=null) // 解決亂碼方式,如果name的值不為空就執行下面的語句,如果為空,就不作任何處理 // { // name = new String (name.getBytes("ISO-8859-1"),"UTF-8"); // } System.out.println(name); request.setAttribute("myname", name);// 通過鍵“myname”,顯示(瀏覽器取出)值name request.setAttribute("myage", age); request.getRequestDispatcher("user.jsp").forward(request, response); // 轉發 } }
③超連結:天生就是get方法訪問,天生就會有亂碼。
<a href="http://www.baidu.com">百度</a>
<a href="user.do?name=小明&age=10">UserServlet</a>
處理亂碼的方式:
String name = request.getParameter("name");// 取表單資料或位址列引數的方式。
String age = request.getParameter("age");
if(name!=null) // 解決亂碼方式,如果name的值不為空就執行下面的語句,如果為空,就不作任何處理
{
name = new String (name.getBytes("ISO-8859-1"),"UTF-8");
}
System.out.println(name);
④偽連結:天生就是get方法訪問,天生就會有亂碼。
<script type="text/javascript">
function login()
{
window.location.href="user.do?name=小明&age=10";
}
</script>
</head>
<body>
<a href="javascript:login();">偽連線UserServlet</a>
⑤函式提交:天生就是get方法訪問,天生就會有亂碼。
<input type="button" value="函式提交" onclick="login();">
3、實際開發中,轉發技術用的較多。<主要程式碼如下>
request.getRequestDispatcher("user.jsp").forward(request, response); // 轉發
4、通過鍵“name”,顯示(瀏覽器取出)值“小明”。
request.setAttribute("name","小明");
5、取表單資料或位址列引數的方式:
String name = request.getParameter("name");
String age = request.getParameter("age");
6、可以用${ }表示式,顯示引數的內容,例如:${myname} ${myage} <通過鍵取值>。
request.setAttribute("myname",name);
request.setAttribute("myage",age);
7、多頁面跳轉<其實是通過Servlet轉發>
不通過Servlet進行轉發的<這種做法在實際中不用,違背了MVC開發模式,且頁面風格、程式碼風格不統一,難以維護。>
package com.fs.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StuServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String to = request.getParameter("to");// 取表單資料或位址列引數的方式。
if("login".equals(to)) {
this.login(request, response);
}else if("main".equals(to)) {
this.main(request, response);
}
}
//轉發到main.jsp
private void main(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("main.jsp").forward(request, response);
}
//轉發到login.jsp
public void login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
{
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
8、實際中採用MVC開發模式。V顯示:jsp,C控制:Servlet
9、會話用物件session<鍵值對>儲存。session物件就是會話物件。只要涉及到登陸的網站就會用上session技術。session和request一樣,可以裝東西。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserServlet extends HttpServlet {
public int no=100;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
no ++;
String to = request.getParameter("to");
if("login".equals(to)){
this.login(request, response);
}else if("one".equals(to)) {
this.one(request, response);
}
}
private void one(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//轉發到one.jsp
request.getRequestDispatcher("one.jsp").forward(request, response);
}
public void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
//使用資料驗證name與pwd是否正確
if("123".equals(pwd)) {
HttpSession session = request.getSession();
session.setAttribute("username", name);
// request.setAttribute("username", name);
request.setAttribute("no", no+"");
request.getRequestDispatcher("main.jsp").forward(request, response);
}else {
request.setAttribute("inf", "使用者名稱或密碼錯誤!");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
}
10、用session物件裝資料的方式,在儲存轉發過程中,資料不會丟失,session會一直在。(多執行緒的時候會在伺服器裡面產生多個session物件,且在伺服器裡儲存,各個session物件會根據你的(sessionID===>流水號(長整型))資訊進行控制,當關閉瀏覽器的時候session會自動銷燬)
11、設定超連結標籤:<a></a> ====>主要屬性引數:href="...",例如下面的程式碼
<a href="user.do?to=login">到login.jsp</a>