代碼倉庫:https://gitee.com/DerekAndroid/ServletLoginJsp.git
效果:
sql語句:
create database day11;
use day11;
create table customer(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
email varchar(20),
name varchar(20),
sex varchar(10),
birthday date
);
問題:註冊頁面時,存入的birthday字段是date類型的數據爲null
原因:從頁面獲取到的只能是String類型的參數,如果要獲取其他類型的需要進行轉換
package com.itheima.bean;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
public class TestCustomer {
public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
//獲取前臺錄入的數據 map
Map<String, String[]> map = new HashMap<>();
map.put("name", new String[]{"xiazdong"});
map.put("sex", new String[]{"man"});
map.put("birthday", new String[]{"2010-10-10"});
//創建bean
Customer cus = new Customer();
//date轉換
DateConverter dateConverter = new DateConverter();
dateConverter.setPattern("yyyy-MM-dd");
ConvertUtils.register(dateConverter, java.util.Date.class);
//把map中的數據拷貝到bean中
BeanUtils.populate(cus, map);
System.out.println(cus.getName());
//測試通過
System.out.println(cus.getBirthday());//Sun Oct 10 00:00:00 CST 2010
}
}
反射方式實現
package com.itheima.utils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;
public class MyBeanUtils {
public static <T> T populate (Class<T> beanClass , Map<String,String[]> properties) {
try {
//1反射創建實例
T bean = beanClass.newInstance();
//2時間轉換器
DateConverter dateConverter = new DateConverter();
dateConverter.setPattern("yyyy-MM-dd");
//3註冊轉換器
ConvertUtils.register(dateConverter, Date.class);
BeanUtils.populate(bean,properties);
return bean;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
測試:
private static void testMyBeanUtils() {
//獲取前臺錄入的數據 map
Map<String, String[]> map = new HashMap<>();
map.put("name", new String[]{"xiazdong"});
map.put("sex", new String[]{"man"});
map.put("birthday", new String[]{"2019-10-28"});
Customer populate = MyBeanUtils.populate(Customer.class, map);
System.out.println(populate.getName());
System.out.println(populate.getBirthday());//Mon Oct 28 00:00:00 CST 2019
}
servlet使用
package com.itheima.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Date;
import java.util.Map;
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 com.itheima.bean.Customer;
import com.itheima.service.RegisterService;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//處理post方式亂碼
request.setCharacterEncoding("utf-8");
//處理響應亂碼
response.setContentType("text/html;charset=utf-8");
//獲取前臺錄入的數據 map
Map<String, String[]> map = request.getParameterMap();
//創建bean
Customer cus = new Customer();
//birthday字段:string轉換date
DateConverter dateConverter = new DateConverter();
dateConverter.setPattern("yyyy-MM-dd");
ConvertUtils.register(dateConverter, java.util.Date.class);
//把map中的數據拷貝到bean中
BeanUtils.populate(cus, map);
System.out.println(cus.getName());
System.out.println(cus.getBirthday());
//創建service
RegisterService rs = new RegisterService();
//調用service方法
rs.saveCustomer(cus);
//根據異常判斷是否註冊成功
response.getWriter().print("註冊成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
response.getWriter().print("註冊失敗");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
get表單提交中文亂碼問題
原因:html設置了瀏覽器在傳遞請求參數時,編碼的時候是UTF-8,但是解碼採用iso-8859-1
java模擬瀏覽器效果
package com.itheima.lmServlet;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class LmDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "湯姆";
System.out.println(s);
//html設置了瀏覽器在傳遞請求參數時,編碼的時候是UTF-8,但是解碼採用iso-8859-1
//模擬瀏覽器
String s1 = URLEncoder.encode(s, "utf-8");
System.out.println(s1);
//模擬服務器
String s2 = URLDecoder.decode(s1, "iso-8859-1");
//瀏覽器亂碼的效果
System.out.println(s2);
//第一種方式
//使用iso-8859-1編碼
String s3 = URLEncoder.encode(s2, "iso-8859-1");
System.out.println(s3);
//使用utf-8解碼
String s4 = URLDecoder.decode(s3, "utf-8");
System.out.println(s4);
//第二種方式
//把亂碼的數據打成iso-8859-1的字節數組
byte[] bytes = s2.getBytes("iso-8859-1");
//在把字節數組使用utf-8的編碼方式重新組裝成字符串
String s5 = new String(bytes, "utf-8");
System.out.println(s5);
//簡寫方式
String s6 = new String(s2.getBytes("iso-8859-1"), "utf-8");
System.out.println("s6="+s6);
}
}
結果:
lm_form.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day11/lm" method="get">
username:<input type="text" name="username"/><br>
password:<input type="password" name="password"><br>
hobby:<input type="checkbox" name="hobby" value="smoking">
<input type="checkbox" name="hobby" value="drink">
<input type="checkbox" name="hobby" value="tHead">
<input type="submit" value="get方式提交">
</form>
<hr>
<form action="/day11/lm" method="post">
username:<input type="text" name="username"/><br>
password:<input type="password" name="password"><br>
hobby:<input type="checkbox" name="hobby" value="smoking">
<input type="checkbox" name="hobby" value="drink">
<input type="checkbox" name="hobby" value="tHead">
<input type="submit" value="post方式提交">
</form>
</body>
</html>
運用到servlet中
package com.itheima.lmServlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LmServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//這種方式get提交中文會出現亂碼
//從post方法中移過來的
// request.setCharacterEncoding("utf-8");
// //獲取username
// String username = request.getParameter("username");
// System.out.println(username);
// //獲取hobby
// String[] hobbys = request.getParameterValues("hobby");
// System.out.println(Arrays.toString(hobbys));
// //獲取所有
// Map<String, String[]> map = request.getParameterMap();
// for(String key:map.keySet()){
// System.out.println(key+":"+Arrays.toString(map.get(key)));
// }
//獲取username
String username = request.getParameter("username");
System.out.println(new String(username.getBytes("iso-8859-1"),"utf-8"));
//獲取hobby
String[] hobbys = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbys));
//獲取所有
Map<String, String[]> map = request.getParameterMap();
for(String key:map.keySet()){
System.out.println(key+":"+new String(Arrays.toString(map.get(key)).getBytes("iso-8859-1"),"utf-8"));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
// //針對於post請求 亂碼解決方式
// request.setCharacterEncoding("utf-8");
// //獲取username
// String username = request.getParameter("username");
// System.out.println(username);
// //獲取hobby
// String[] hobbys = request.getParameterValues("hobby");
// System.out.println(Arrays.toString(hobbys));
// //獲取所有
// Map<String, String[]> map = request.getParameterMap();
// for(String key:map.keySet()){
// System.out.println(key+":"+Arrays.toString(map.get(key)));
// }
}
}
日誌:
username:[阿根]
password:[123]
hobby:[drink, tHead]
request請求域
M發送請求數據到B,B獲取到數據
直接訪問X,返回null
MeServlet
package com.itheima.red;
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 MeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String money = request.getParameter("money");
System.out.println("我說:咋了");
System.out.println("甲說:沒錢,借"+money);
System.out.println("我說:沒有");
System.out.println("我說:我去幫你借!");
//把money放入request域中
request.setAttribute("moneyx", money);
//請求轉發到bzr
request.getRequestDispatcher("/bzr").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
BzrServlet
package com.itheima.red;
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 BzrServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//從上一次請求中獲取moneyx
String moneyx=(String)request.getAttribute("moneyx");
System.out.println("班主任:嘎哈來了!");
System.out.println("我說:甲同學回家沒錢了,借"+moneyx);
System.out.println("班主任:給你500");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
結果:
我說:咋了
甲說:沒錢,借50
我說:沒有
我說:我去幫你借!
50
package com.itheima.red;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class XxServlet
*/
public class XxServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String xx = (String)request.getAttribute("moneyx");
System.out.println(xx);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
結果:
null