請求行:
請求方式,請求的地址和參數
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語句有問題