request請求總結

 

請求行:

請求方式,請求的地址和參數  

public class LineServlet extends HttpServlet {



protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {



//1、獲得請求方式

String method = request.getMethod();

System.out.println("method:"+method);

//2、獲得請求的資源相關的內容

String requestURI = request.getRequestURI();//客戶端地址

StringBuffer requestURL = request.getRequestURL();//有http的地址

System.out.println("uri:"+requestURI);

System.out.println("url:"+requestURL);

//獲得web應用的名稱

String contextPath = request.getContextPath();//獲得項目名

System.out.println("web應用:"+contextPath);

//地址後的參數的字符串

String queryString = request.getQueryString();

System.out.println(queryString);

//3、獲得客戶機的信息---獲得訪問者IP地址

String remoteAddr = request.getRemoteAddr();//客戶端的地址

System.out.println("IP:"+remoteAddr);//爲什麼獲得是





}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

總結:

url與URI的區別:

Stringbuffer與string的區別:有點像數組和集合的關係

String的特點是一旦賦值,便不能更改其指向的字符對象,如果更改,則會指向一個新的字符對象

StringBuffer對象可以調用其方法動態的進行增加、插入、修改和刪除操作(.append())

轉化:一旦通過StringBuffer生成最終想要的字符串,就可調用它的toString方法將其轉換爲一個String對象

     

 

請求頭:

鍵值對的形式:存儲了客戶端和請求的一些基本信息

package com.ithiema.header;



import java.io.IOException;

import java.util.Enumeration;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class HeaderServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1、獲得指定的頭

String header = request.getHeader("User-Agent");//獲得某個鍵對應的值。(用戶使用的瀏覽器的類型)

System.out.println(header);

//2、獲得所有的頭的名稱

Enumeration<String> headerNames = request.getHeaderNames();//獲得 n個鍵名,放回一個Enumeration<String>類型的數據

while(headerNames.hasMoreElements()){//.hasMoreElements()返回的是布爾類型的數據

String headerName = headerNames.nextElement();//獲得鍵

String headerValue = request.getHeader(headerName);//獲得值

System.out.println(headerName+":"+headerValue);

}

}


protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

總結:

Enumeration接口中定義了一些方法,通過這些方法可以枚舉(一次獲得一個)對象集合中的元素。(是一個迭代器)Interotar

有點像集合用於存儲對象的。只是獲取對象的方式有點不一樣(集合是通過遍歷)常用的方法,hasMoreElements(),.nextElement()

 


 


package com.ithiema.header;



import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class RefererServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {


//對該新聞的來源的進行判斷

String header = request.getHeader("referer");



if(header!=null&&header.startsWith("http://localhost")){

//是從我自己的網站跳轉過來的 可以看新聞

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write("中國確實已經拿到100塊金牌....");

}else{

response.setContentType("text/html;charset=UTF-8");

response.getWriter().write("你是盜鏈者,可恥!!");

}


}

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

String對象常用的方法:equals("字符串"):是否與某個字符串一樣startwith(字符串)以某個字符串開頭

response.setContentType("text/html;charset=utf-8");

response.setHeader("refresh", "5;http://www.baidu.com");當一個字符串的位置要傳入多個有用的參數的的時候就用; 分開來

if()括號後面沒有;加了會報錯

 

 

 

域對象:

轉發:

public class Servlet1 extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {


request.setAttribute("name", "tom");

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");

dispatcher.forward(request, response);



}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}









public class Servlet2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//從request域中取出數據

Object attribute = request.getAttribute("name");//getAttribute是獲取域中的內容

response.getWriter().write("hello haohao..."+attribute);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

請求體:

public class ContentServlet extends HttpServlet {



protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//1、獲得單個表單值

String username = request.getParameter("username");//getParameter是獲取體中的內容

System.out.println(username);

String password = request.getParameter("password");

System.out.println(password);

//2、獲得多個表單的值

String[] hobbys = request.getParameterValues("hobby");

for(String hobby:hobbys){

System.out.println(hobby);

}

//3、獲得所有的請求參數的名稱

Enumeration<String> parameterNames = request.getParameterNames();

while(parameterNames.hasMoreElements()){

System.out.println(parameterNames.nextElement());

}

System.out.println("------------------");

//4、獲得所有的參數 參數封裝到一個Map<String,String[]>

Map<String, String[]> parameterMap = request.getParameterMap();

for(Map.Entry<String, String[]> entry:parameterMap.entrySet()){//map集合的遍歷方式就是這樣的

System.out.println(entry.getKey());

for(String str:entry.getValue()){

System.out.println(str);

}

System.out.println("---------------------------");

}

}


protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

總結:

Map.Entry<String, String[]> entry:

map.entrySet()是將map裏的每一個鍵值對取出來封裝成一個Entry對象在存到一個Set裏面。

Map.Entry<String, String[]>的意思是一個泛型,

表示Entry裏裝的是兩個string的字符串,分別是allrecordmap的key和value

打斷點調試:F8是調到下一個斷點(沒有的話,直接運行到結束

F5是單步調試進入函數內部。

F6是單步調試不進入函數內部。

F7是由函數內部返回到調用處。

 

 

案例demo:

登錄:

package com.ithiema.login;



import java.io.IOException;

import java.sql.SQLException;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;



import com.ithiema.register.User;

import com.ithiema.utils.DataSourceUtils;



public class LoginServlet extends HttpServlet {



protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {



request.setCharacterEncoding("UTF-8");



//1、獲得用戶名和密碼

String username = request.getParameter("username");

String password = request.getParameter("password");

//2、調用一個業務方法進行該用戶查詢

User login = null;

try {

login = login(username,password);

} catch (SQLException e) {

e.printStackTrace();

}

//3、通過user是否爲null判斷用戶名和密碼是否正確

if(login!=null){

//用戶名和密碼正確

//登錄成功 跳轉到網站的首頁

response.sendRedirect(request.getContextPath());

}else{

//用戶名或密碼錯誤

//跳回當前login.jsp

//使用轉發 轉發到login.jsp  向request域中存儲錯誤信息

request.setAttribute("loginInfo", "用戶名或密碼錯誤");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}



}



public User login(String username,String password) throws SQLException{

QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());

String sql = "select * from user04 where uname=? and upassword=?";

User user = runner.query(sql, new BeanHandler<User>(User.class), username,password);

return user;

}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

總結:一般出現404  可能的原因:代碼的問題,  配置文件的原因。跳轉的服務器地址 或客戶端地址寫錯

 

 

註冊:

package com.ithiema.register;


import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.sql.SQLException;

import java.util.Map;

import java.util.UUID;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.apache.commons.beanutils.BeanUtils;

import org.apache.commons.dbutils.QueryRunner;

import com.ithiema.utils.DataSourceUtils;

public class RegisterServlet extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//設置request的編碼---只適合post方式

request.setCharacterEncoding("UTF-8");

//get方式亂碼解決

//String username = request.getParameter("username");//亂碼    如果參數比較多怎麼辦??

//先用iso8859-1編碼 在使用utf-8解碼

//username = new String(username.getBytes("iso8859-1"),"UTF-8");


//1、獲取數據

//String username = request.getParameter("username");//當請求體中的元素很少時。用這種

//System.out.println(username);

//String password = request.getParameter("password");

//.....



//2、將散裝的封裝到javaBean

//User user = new User();

//user.setUsername(username);

//user.setPassword(password);



//使用BeanUtils進行自動映射封裝

//BeanUtils工作原理:將map中的數據 根據key與實體的屬性的對應關係封裝

//只要key的名字與實體的屬性 的名字一樣 就自動封裝到實體中(名字要確定一樣纔會被自動賦值)

Map<String, String[]> properties = request.getParameterMap();//凡是用了這個的方法都要進行封裝。請求體比較多時用這種

User user = new User();//對象中的字段和User要一樣纔可以進行封裝,封裝不了的手動封裝

try {

BeanUtils.populate(user, properties);

} catch (IllegalAccessException | InvocationTargetException e) {

e.printStackTrace();

}



//現在這個位置 user對象已經封裝好了

//手動封裝uid----uuid---隨機不重複的字符串32位--java代碼生成後是36位

user.setUid(UUID.randomUUID().toString());



//3、將參數傳遞給一個業務操作方法

try {

regist(user);

} catch (SQLException e) {

e.printStackTrace();

}


//4、認爲註冊成功跳轉到登錄頁面

response.sendRedirect(request.getContextPath()+"/login.jsp");



}



//註冊的方法

public void regist(User user) throws SQLException{

//操作數據庫

QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());

String sql = "insert into user values(?,?,?,?,?,?,?)"; //以數據庫中的表爲標準



    int row=r

/*System.out.println(user.getUsername());

System.out.println(user.getPassword());

System.out.println(user.getBirthday());

System.out.println(user.getSex());*/

    if(row>0)

    {

     System.out.println("註冊成功");

    }

    else{

     System.out.println("註冊失敗");

    }

}



protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}




}

  

總結:一般問題彙總:404 跳轉的問題(服務器地址客戶端地址有沒有寫錯,還有配置文件) 500(【配置文件),代碼問題,,sql語句有問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章