代码仓库: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