补充 反射Web的代码
在cn.bosp包里面的pojo包下的Userlnfo里面
package cn.bosp.pojo;
public class Userlnfo {
private String uname;
private int age;
private String cardNo;
public Userlnfo() {
}
public Userlnfo(String uname, int age, String cardNo) {
this.uname = uname;
this.age = age;
this.cardNo = cardNo;
}
public void setUname(String uname) {
this.uname = uname;
}
public void setAge(int age) {
this.age = age;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getUname() {
return uname;
}
public int getAge() {
return age;
}
public String getCardNo() {
return cardNo;
}
@Override
public String toString() {
return "Userlnfo{" +
"uname='" + uname + '\'' +
", age=" + age +
", cardNo='" + cardNo + '\'' +
'}';
}
}
在cn.bosp包里面的servlet包下的UserlnfoServlet里面
package cn.bosp.servlet;
import cn.bosp.pojo.Userlnfo;
import cn.bosp.util.BeanUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebEndpoint;
import java.io.IOException;
@WebServlet(name="userInfoServlet",urlPatterns={"/user"})
public class UserlnfoServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Userlnfo userlnfo=(Userlnfo) BeanUtil.convert(request,Userlnfo.class);
System.out.println(userlnfo);
}
}
在cn.bosp包里面的util包下的BeanUtil里面
package cn.bosp.util;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
public class BeanUtil {
//将请求中的参数的值 封装到 tergetType类所对应的对象的属性中
public static <T, method> T convert(HttpServletRequest request, Class<T> targetType) {
T t = null;
try {
//获得请求中的所有参数(参数名 , 参数值)
Map<String, String[]> param = request.getParameterMap();
//判断请求中是否含有参数,如果没有参数 直接返回null
if (param.size() == 0) {
return null;
}
t = targetType.newInstance();//类对应的对象
//通过反射获得targetType中的所有set方法
Method[] methods = targetType.getMethods();
for (int i = 0; i < methods.length; i++) {
Method temp = methods[i];
String methodName = temp.getName();
if (methodName.startsWith("set")) {//判断方法名是否所set开头
//如果以set开头,判断set方法的参数个数(只要一个参数的set方法)
if (temp.getParameterTypes().length == 1) {//获得方法的参数列表
//假设有一个set方法,名字叫做setUname,类中的属性名 uname,参数的名字也是uname
//根据方法名可以获得此set方法对应的属性名(也就获得到参数名)
String fieldName = methodName.substring(3, 4).toLowerCase() + methodName.substring(4);
if (param.containsKey(fieldName)) {//判断请求中是否含有此参数
String[] values = param.get(fieldName);//根据参数名获得参数值
//将请求中的参数值的类型转为类中的属性的类型
Object value = parseValue(values, temp.getParameterTypes()[0]);
//调用set方法,给属性赋值
if (value != null) {
temp.invoke(t, value);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
//将String类型的参数值,转为目标类型(???)
private static Object parseValue(String[] values,Class type) {
try {
String value = values[0];
if (type == String.class) {
return value;
} else if (type == int.class) {
return Integer.parseInt(value);
} else if (type == Date.class) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd");
return sdf.parse(value);
} else if (type == double.class) {
return Double.parseDouble(value);
} else if (type == byte.class) {
return Byte.parseByte(value);
} else if (type == short.class) {
return Short.parseShort(value);
} else if (type == long.class) {
return Long.parseLong(value);
} else if (type == float.class) {
return Float.parseFloat(value);
} else {
throw new UnConverterException("不支持的类型");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
在cn.bosp包里面的util包下的UnConverterException里面
package cn.bosp.util;
public class UnConverterException extends RuntimeException{
public UnConverterException() {
}
public UnConverterException(String message) {
super(message);
}
public UnConverterException(String message, Throwable cause) {
super(message, cause);
}
public UnConverterException(Throwable cause) {
super(cause);
}
public UnConverterException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
web新的内容
1.
package cn.chy.pojo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Student {
private int id;
private String stuName;
private Date birtday;
public Student() {
}
public Student(int id, String stuName, Date birtday) {
this.id = id;
this.stuName = stuName;
this.birtday = birtday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Date getBirtday() {
return birtday;
}
public void setBirtday(Date birtday) {
this.birtday = birtday;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
public String toString() {
return "Student{" +
"id=" + id +
", stuName='" + stuName + '\'' +
", birtday=" + sdf.format(birtday) +
'}';
}
}
2.
package cn.chy.servlet;
import cn.chy.pojo.Student;
import cn.chy.util.BeanUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name="userInfoServlet",urlPatterns={"/user"})
public class lndexServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student convert= BeanUtil.convert(req,Student.class);
}
}
3.
package cn.chy.util;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
public class BeanUtil {
public static <T>T convert(HttpServletRequest request,Class<T>targetType){
T t=null;
Map<String,String[]> param=request.getParameterMap();
try{
if (param.size()==0){
return null;
}
t=targetType.newInstance();
Method[]methods=targetType.getMethods();
for (int i=0;i<methods.length;i++){
Method temp=methods[i];
String pName=temp.getName();
if (temp.getParameterTypes().length==1){
if (pName.startsWith("set")){
String fieldName=pName.substring(3,4).toLowerCase()+pName.substring(4);
if(param.containsKey(fieldName)){
String[] strings = param.get(fieldName);
Object obj = parseObject(strings, temp.getParameterTypes()[0]);
if(obj != null){
temp.invoke(t,obj);
}
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}
return t;
}
public static Object parseObject(String[] value, Class type){
String val=value[0];
System.out.println(val);
try{
if(type==String.class){
return val;
}else if (type == int.class){
return Integer.parseInt(val);
}else if (type== Date.class){
SimpleDateFormat sdf =new SimpleDateFormat("yyy-MMM-dd");
return sdf.parse(val);
}else {
throw new ThrowExecptionTest("指定类型不存在");
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
4.
package cn.chy.util;
public class ThrowExecptionTest extends RuntimeException {
public ThrowExecptionTest(){
}
public ThrowExecptionTest(String message) {
super(message);
}
public ThrowExecptionTest(String message, Throwable cause) {
super(message, cause);
}
public ThrowExecptionTest(Throwable cause) {
super(cause);
}
protected ThrowExecptionTest(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
反射的导图梳理
目前刚刚开始制作这个可能会有很多不完整的地方后面为会更新后面的内容以及补充