springmvc(2)手写springmvc框架

springmvc手写框架

前置阶段:DispatcherServlet

  • 初始化spring容器
    getBeansByType
    Aware和BeanFactoryWare
    初始化了HandlerMapping集合
    初始化处理器类和url的映射关系
    初始化了HandlerAdapter集合

1.如何编写处理器代码

  • 制定标准(接口)
    HttpRequestHandler接口
    SimpleControllerHandler接口

2.如何编写处理器映射器代码

  • BeanNameURLHandlerMapping
    SimpleUrlHandlerMapping

3.如何编写处理器适配器代码

  • HttpRequestHandlerAdapter
    是否适配
    SimpleControllerHandlerAdapter

4.使用注解方式去实现处理器

springmvc处理流程图
springmvc处理流程
以下为具体代码

springmvc.servlet包

AbstractServlet 类继承 HttpServlet 类

  • 负责具体的请求分发
public abstract class AbstractServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doDispatch(request, response);
	}

	public abstract void doDispatch(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

DispatcherServlet 类继承 AbstractServlet类

  • 只需要接收【Servlet请求】、需要【处理结果】,同时负责将请求【分发给具体的处理类】。
public class DispatcherServlet extends AbstractServlet {

	private static final long serialVersionUID = 1L;

	private DefaultListableBeanFactory beanFactory;

	// 存储了各种处理器查找策略
	private List<HandlerMapping> handlerMappings = new ArrayList<HandlerMapping>();
	// 存储了各种适配器策略
	private List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();

	@Override
	public void init(ServletConfig config) throws ServletException {
		String location = config.getInitParameter("contextConfigLocation");
		// 加载spring容器
		initSpringContainer(location);

		// 饿汉式创建所有的spring中的bean实例
		beanFactory.getBeansByType(Object.class);

		// 从spring容器中获取HandlerMapping的实例,然后存储到handlerMappings集合中
		handlerMappings = beanFactory.getBeansByType(HandlerMapping.class);
		handlerAdapters = beanFactory.getBeansByType(HandlerAdapter.class);
	}

	private void initSpringContainer(String location) {
		beanFactory = new DefaultListableBeanFactory();

		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		Resource resource = new ClasspathResource(location);
		InputStream inputStream = resource.getResource();
		beanDefinitionReader.loadBeanDefinitions(inputStream);
	}

	@Override
	public void doDispatch(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			// 根据请求找到具体处理该请求的处理类(springmvc不是要指定处理器标准)
			// springmvc要求:当扩展一种处理器类型的时候,提供对应的适配器就可以。

			// Handler:处理器类
			// springmvc提供了几种类型的写法:HttpServletRequestHandler\SimpleController\纯注解(@Controller)
			Object handler = getHandler(request);

			if (handler == null) {
				return;
			}

			// 处理器处理请求(我们的处理器类和DispatcherServlet不兼容)---需要使用好的方式方法让他们可以一起工作。
			// 例子:handler就好比笔记本电脑。谁生产的这个电脑,谁给我匹配一个电源适配器,目的是让电脑和插座可以一起兼容工作。

			// 根据找到的处理器,去查找对应的处理器适配器
			HandlerAdapter ha = getHandlerAdapter(handler);
			if (ha == null) {
				return;
			}
			// 找到处理器适配器之后,让它去执行对应的处理器。
			ha.handleRequest(handler, request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private HandlerAdapter getHandlerAdapter(Object handler) {
		if (handlerAdapters != null && handlerAdapters.size() > 0) {
			for (HandlerAdapter ha : handlerAdapters) {
				if (ha.supports(handler)) {
					return ha;
				}
			}
		}
		return null;
	}

	private Object getHandler(HttpServletRequest request) {
		// 映射关系存放在properties文件中
		// Object handler = null;
		// handler = getHandlerFromProperties(uri);
		// 如果handler不为null,返回handler
		// 如果handler为null,那么继续
		// 映射关系存放在xml文件中
		// handler = getHandlerFromXml(uri);
		// 如果handler不为null,返回handler
		// 如果handler为null,那么继续
		// 映射关系存放在xml文件中
		// handler = getHandlerFromXml(uri);、

		if (handlerMappings != null && handlerMappings.size() > 0) {
			for (HandlerMapping hm : handlerMappings) {
				Object handler = hm.getHandler(request);
				if (handler != null) {
					return handler;
				}
			}
		}
		// 使用HandlerMapping面向对象的思维加上策略模式去解决扩展性的问题。
		return null;
	}
}

spring.bean.aware 包

Aware 接口

public interface Aware {
}

BeanFactoryAware 继承 Aware

public interface BeanFactoryAware extends Aware {

	public void setBeanFactory(DefaultListableBeanFactory beanFactory);
}

spring.bean.factory 包

BeanFactory 接口

  • 根据bean的名称去ioc容器中获取实例
public interface BeanFactory {

	Object getBean(String name);

	Object getBean(Class<?> type, String name);
}

AutowireCapableBeanFactory 接口继承 BeanFactory接口

  • 具体负责BeanFactory的Bean实例的创建和装配
public interface AutowireCapableBeanFactory extends BeanFactory{

}

ListableBeanFactory 接口继承BeanFactory 接口

  • 获取指定类型的所有子类的bean实例集合
public interface ListableBeanFactory extends BeanFactory {

	<T> List<T> getBeansByType(Class<T>clazz);
}

spring.bean.factory.support 包

AbstractBeanFactory 抽象类 继承DefaultSingletonBeanRegistry 实现BeanFactory 接口

  • 一个接口中同名方法设计重载时,更多的是为了更方便的给使用者使用
  • DefaultSingletonBeanRegistry 此类具体代码链接
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

	@Override
	public Object getBean(String name) {
		Object bean = doGetBean(name, null);
		return bean;
	}

	@Override
	public Object getBean(Class<?> type, String name) {
		Object bean = doGetBean(name, type);
		return bean;
	}

	private Object doGetBean(String name, Class<?> type) {
		// 先查询单例bean集合是否存在该bean实例
		Object singleton = getSingleton(name);
		// 有则直接返回
		if (singleton != null) {
			return singleton;
		}
		// 没有则需要查询BeanDefinition集合中是否存在该BeanDefinition
		BeanDefinition beanDefinition = getBeanDefinition(name);
		// 没有BeanDefinition则返回null
		if (beanDefinition == null) {
			return null;
		}
		// 有BeanDefinition则判断是单例还是多例
		if (beanDefinition.isSingleton()) {
			singleton = createBean(beanDefinition);

			addSingleton(name, singleton);
		} else if (beanDefinition.isPrototype()) {
			singleton = createBean(beanDefinition);
		}
		return singleton;
	}

	public abstract Object createBean(BeanDefinition beanDefinition);

	public abstract BeanDefinition getBeanDefinition(String name);
}

AbstractAutowireCapableBeanFactory 抽象类继承 AbstractBeanFactory抽象类

  • 该工厂是负责Bean的创建和装配的
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {

	@Override
	public Object createBean(BeanDefinition beanDefinition) {
		// 实例化 new
		Object bean = createInstance(beanDefinition);
		if (bean == null)
			return null;
		// 属性填充 set
		populateBean(bean, beanDefinition);
		// 初始化 init
		initBean(bean, beanDefinition);
		return bean;
	}

	private void initBean(Object bean, BeanDefinition beanDefinition) {
		//Aware接口会在此时被处理
		if(bean instanceof Aware) {
			if(bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory((DefaultListableBeanFactory) this);
			}
		}

		invokeInitMethod(bean, beanDefinition);
	}

	private void invokeInitMethod(Object bean, BeanDefinition beanDefinition) {
		// bean标签配置了init-method属性
		String initMethod = beanDefinition.getInitMethod();
		if (initMethod == null || initMethod.equals("")) {
			return;
		}
		ReflectUtils.invokeMethod(bean, initMethod);
		// TODO bean标签实现了InitializingBean接口
	}

	private void populateBean(Object bean, BeanDefinition beanDefinition) {
		List<PropertyValue> propertyValues = beanDefinition.getPropertyValues();
		for (PropertyValue pv : propertyValues) {
			String name = pv.getName();
			Object value = pv.getValue();
			Object valueToUse = null;
			if (value instanceof TypedStringValue) {
				TypedStringValue typedStringValue = (TypedStringValue) value;
				String stringValue = typedStringValue.getValue();
				Class<?> targetType = typedStringValue.getTargetType();
				if (targetType == String.class) {
					valueToUse = stringValue;
				} else if (targetType == Integer.class) {
					valueToUse = Integer.parseInt(stringValue);
				} // ....
			} else if (value instanceof RuntimeBeanReference) {
				RuntimeBeanReference reference = (RuntimeBeanReference) value;
				String ref = reference.getRef();

				// 创建一个bean的时候,根据依赖注入情况,自动去创建另一个bean去注入
				valueToUse = getBean(ref);
			}
			ReflectUtils.setProperty(bean, name, valueToUse);
		}
	}

	private Object createInstance(BeanDefinition beanDefinition) {
		// TODO 可以通过静态工厂去创建????
		// TODO 可以通过实例工厂去创建????

		try {
			String clazzName = beanDefinition.getClazzName();
			Class<?> clazzType = resolveClass(clazzName);
			Object bean = ReflectUtils.createObject(clazzType);

			return bean;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private Class<?> resolveClass(String clazzName) {
		try {
			Class<?> clazz = Class.forName(clazzName);
			return clazz;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}
}

DefaultListableBeanFactory 类继承AbstractAutowireCapableBeanFactory 抽象类实现BeanDefinitionRegistry,ListableBeanFactory 接口

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry,ListableBeanFactory {

	
	private Map<String, BeanDefinition> beanDefinitions = new HashMap<String, BeanDefinition>();

	@Override
	public BeanDefinition getBeanDefinition(String name) {
		return this.beanDefinitions.get(name);
	}

	@Override
	public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
		this.beanDefinitions.put(name, beanDefinition);
	}

	@Override
	public <T> List<T> getBeansByType(Class<T> clazz) {
		List<T> results = new ArrayList<T>();
		for(BeanDefinition bd: beanDefinitions.values()) {
			String clazzName = bd.getClazzName();
			Class<?> type = resolveClassName(clazzName);
			if(clazz.isAssignableFrom(type)) {
				//判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同
				Object bean = getBean(bd.getBeanName());
				results.add((T) bean);
			}
		}
		return results;
	}

	private Class resolveClassName(String clazzName) {
		try {
			Class<?> type = Class.forName(clazzName);
			return type;
		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public List<BeanDefinition> getBeanDefinitions() {
		List<BeanDefinition> beanDefinitionList = new ArrayList<>();
		// TODO 自动生成的方法存根
		for(BeanDefinition beanDefinition : beanDefinitions.values()) {
			beanDefinitionList.add(beanDefinition);
		}
		return beanDefinitionList;
	}
}

springmvc.mapping.iface包

HandlerMapping 接口

public interface HandlerMapping {

	Object getHandler(HttpServletRequest request);
}

springmvc.mapping 包

BeanNameUrlHandlerMapping 类实现了HandlerMapping, BeanFactoryAware

  • 处理器映射器的实现类:
    1.对外提供根据请求查找处理器的功能
    2.初始化请求和处理器的映射集合
public class BeanNameUrlHandlerMapping implements HandlerMapping, BeanFactoryAware {
	private Map<String, Object> urlHandlers = new HashMap<String, Object>();

	private DefaultListableBeanFactory beanFactory;

	/**
	 * 初始化方法,需要配置bean标签的时候,指定一下。
	 */
	public void init() {
		// 读取springmvc.xml获取其中的bean标签信息
		List<BeanDefinition> beanDefinitions = beanFactory.getBeanDefinitions();
		for (BeanDefinition beanDefinition : beanDefinitions) {
			String beanName = beanDefinition.getBeanName();
			if (beanName.startsWith("/")) {
				urlHandlers.put(beanName, beanFactory.getBean(beanName));
			}
		}
		// 解析bean标签的name属性和class属性,然后将映射关系存储到map集合中
	}

	@Override
	public Object getHandler(HttpServletRequest request) {
		String uri = request.getRequestURI();
		return urlHandlers.get(uri);
	}

	public void setBeanFactory(DefaultListableBeanFactory beanFactory) {
		this.beanFactory = beanFactory;
	}
}

RequestMappingHandlerMapping 实现 HandlerMapping接口

  • 注解方式处理器映射器的实现类:
    1.对外提供根据请求查找处理器的功能
    2.初始化请求和处理器的映射集合
public class RequestMappingHandlerMapping implements HandlerMapping, BeanFactoryAware {

	private Map<String, HandlerMethod> urlHandlerMethods = new HashMap<>();
	private DefaultListableBeanFactory beanFactory;

	/**
	 * 初始化方法,需要配置bean标签的时候,指定一下。
	 */
	public void init() {
		// 获取所有的BeanDefinition信息
		List<BeanDefinition> beanDefinitions = beanFactory.getBeanDefinitions();
		// 遍历BeanDefinition集合
		for (BeanDefinition beanDefinition : beanDefinitions) {

			// 获取BeanDefinition中的class类型信息
			String clazzName = beanDefinition.getClazzName();
			// 获取对应的Class对象
			Class<?> clazz = getClass(clazzName);
			// 判断是否是处理器类型(通过反射判断该类是否被@Controller注解)
			if (isHandler(clazz)) {
				// 如果是,则从该类中获取所有的方法
				Method[] methods = clazz.getDeclaredMethods();
				for (Method method : methods) {
					// 判断方法是否被RequestMapping注解
					if (isRequestMethod(method)) {
						// 解析RequestMapping注解,获取其中的url
						StringBuffer sb = new StringBuffer();
						// 类上的URL
						RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class);
						if (requestMapping != null) {
							String firstUrl = requestMapping.value();
							if (firstUrl != null && !firstUrl.equals("")) {
								sb.append(firstUrl);
								sb.append("/");
							}
						}
						requestMapping = method.getAnnotation(RequestMapping.class);
						String secondUrl = requestMapping.value();
						sb.append(secondUrl);

						// 根据Controller的bean的名称去ioc容器中获取Controller实例对象
						String beanName = beanDefinition.getBeanName();
						Object controller = beanFactory.getBean(beanName);

						// 当前正在被解析的方法,就是Method方法对象
						// 将Controller对象和Method对象封装到HandlerMethod类中
						HandlerMethod handlerMethod = new HandlerMethod(controller, method);
						// 建立url和HandlerMethod的映射关系
						urlHandlerMethods.put(sb.toString(), handlerMethod);
					}
				}
			}

		}

	}

	private boolean isRequestMethod(Method method) {
		return method.isAnnotationPresent(RequestMapping.class);//如果指定类型的注释存在于此元素上,则返回 true,否则返回 false
	}

	private boolean isHandler(Class<?> clazz) {
		return clazz.isAnnotationPresent(Controller.class);
	}

	private Class<?> getClass(String clazzName) {
		try {
			return Class.forName(clazzName);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
	}

	@Override
	public Object getHandler(HttpServletRequest request) {
		String uri = request.getRequestURI();
		return this.urlHandlerMethods.get(uri);
	}

	@Override
	public void setBeanFactory(DefaultListableBeanFactory beanFactory) {
		this.beanFactory = beanFactory;
	}

}

HandlerMethod 类

  • 封装Controller对象和对应的Method对象
public class HandlerMethod {

	// Controller对象
	private Object controller;

	// Method方法
	private Method method;

	public Object getController() {
		return controller;
	}

	public void setController(Object controller) {
		this.controller = controller;
	}

	public Method getMethod() {
		return method;
	}

	public void setMethod(Method method) {
		this.method = method;
	}

	public HandlerMethod(Object controller, Method method) {
		super();
		this.controller = controller;
		this.method = method;
	}
}

SimpleUrlHandlerMapping 实现 HandlerMapping 接口

  • 处理器映射器的实现类:
    1.对外提供根据请求查找处理器的功能
    2.初始化请求和处理器的映射集合
public class SimpleUrlHandlerMapping implements HandlerMapping {

	private Map<String, Object> urlHandlers = new HashMap<String, Object>();

	/**
	 * 初始化方法,需要配置bean标签的时候,指定一下。
	 */
	public void init() {
		urlHandlers.put("/queryUser", new QueryUserHandler());
		urlHandlers.put("/addUser", null);
	}

	@Override
	public Object getHandler(HttpServletRequest request) {
		String uri = request.getRequestURI();
		return urlHandlers.get(uri);
	}
}

springmvc.adapter.iface 包

HandlerAdapter 接口

  • 查看处理器和当前的适配器是否适配
public interface HandlerAdapter {

	boolean supports(Object handler);
	void handleRequest(Object handler, HttpServletRequest request, HttpServletResponse response) throws Exception;

}

springmvc.adapter 包

HttpRequestHandlerAdapter 实现HandlerAdapter

public class HttpRequestHandlerAdapter implements HandlerAdapter {

	@Override
	public void handleRequest(Object handler, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		((HttpRequestHandler) handler).handleRequest(request, response);
	}

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof HttpRequestHandler);
	}
}

RequestMappingHandlerAdapter 实现HandlerAdapter

  • 注解方式处理器适配器
public class RequestMappingHandlerAdapter implements HandlerAdapter {

	@Override
	public void handleRequest(Object handler, HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		// 从HandlerMethod对象中获取Controller对象和Method对象,目的是利用反射执行该方法
		HandlerMethod handlerMethod = (HandlerMethod) handler;
		Object controller = handlerMethod.getController();
		Method method = handlerMethod.getMethod();

		// 将请求参数,赋值给Controller类中带有RequestMapping注解的方法参数上面
		Object[] args = resolveParameters(request, method);
		Object returnValue = method.invoke(controller, args);

		// 对于执行之后的结果,可以针对@ResponseBody注解进行处理
		handleReturnValue(returnValue, method, response);
	}

	private void handleReturnValue(Object returnValue, Method method, HttpServletResponse response) {
		try {
			if (method.isAnnotationPresent(ResponseBody.class)) {
				if (returnValue instanceof Map) {
					response.setContentType("application/json;charset=utf-8");
					response.getWriter().write(JsonUtils.object2Json(returnValue));
				} else if (returnValue instanceof String) {
					response.setContentType("text/plain;charset=utf-8");
					response.getWriter().write(returnValue.toString());
				}
			} else {
				// 页面处理
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private Object[] resolveParameters(HttpServletRequest request, Method method) {

		List<Object> params = new ArrayList<Object>();

		// 获取请求中的所有参数和参数值的映射集合
		Map<String, String[]> parameterMap = request.getParameterMap();

		if (parameterMap.isEmpty()) {
			return null;
		}

		// 从Method对象中获取参数信息
		Parameter[] parameters = method.getParameters();
		for (Parameter parameter : parameters) {
			String name = parameter.getName();
			Class<?> type = parameter.getType();

			String[] strings = parameterMap.get(name);

			// 类型处理
			handleParameterType(strings, type, params);

		}
		return params.toArray();
	}

	private void handleParameterType(String[] strings, Class<?> type, List<Object> params) {
		// TODO
		if (type == Integer.class) {
			params.add(Integer.parseInt(strings[0]));
		} else if (type == String.class) {
			params.add(strings[0]);
		} // ...
	}

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof HandlerMethod);
	}

}

SimpleControllerHandlerAdapter 实现HandlerAdapter

public class SimpleControllerHandlerAdapter implements HandlerAdapter {

	@Override
	public void handleRequest(Object handler, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		((SimpleControllerHandler) handler).handleRequest(request, response);
	}

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof SimpleControllerHandler);
	}
}

springmvc.handler.iface包

HttpRequestHandler 接口

  • 最开始springmvc不要求我们突然对于Servlet编程有太大的转变
public interface HttpRequestHandler {

	void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

SimpleControllerHandler 接口

  • 我们返回一个ModelAndView对象的目的,是可以针对处理结果和要响应的视图进行拦截处理
public interface SimpleControllerHandler {

	ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

spring.handle 包

QueryUserHandler 类实现HttpRequestHandler 接口

  • 按照HttpRequestHandler的标准去处理请求
public class QueryUserHandler implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.setContentType("text/plain;charset=utf8");
		response.getWriter().print("开课吧NB。。。。QueryUserHandler11111");
	}
}

QueryUserHandler 类实现HttpRequestHandler 接口

  • 按照HttpRequestHandler的标准去处理请求
public class QueryUserHandler2 implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.setContentType("text/plain;charset=utf8");
		response.getWriter().print("开课吧NB。。。。QueryUserHandler2");
	}
}

springmvc.annotation 包

Controller

@Retention(RUNTIME)
@Target(TYPE)
public @interface Controller {

	//@Controller(value="")
	String value() default "";
}

RequestMaping

@Retention(RUNTIME)
@Target({ TYPE, METHOD })
public @interface RequestMapping {
	String value() default "";
}

ResponseBody

@Retention(RUNTIME)
@Target(METHOD)
public @interface ResponseBody {

}

springmvc.controller 包

UserController

  • 使用注解的方式去编写处理器代码,但是UserController不是我们真正的处理器类。
  • 此种写法,真正的处理器类是UserController类中的某一个使用RequestMapping注解的方法。
  • 也就是说,真正的处理器类是HandlerMethod(Controller类+Method方法)
@Controller
public class UserController {

	@RequestMapping("/queryUser3")
	@ResponseBody
	public Map<String, Object> queryUser(Integer id, String name) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", id);
		map.put("name", name);
		return map;
	}
	@RequestMapping("/queryUser3")
	@ResponseBody
	public Map<String, Object> queryUser2(Integer id, String name) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", id);
		map.put("name", name);
		return map;
	}

	@RequestMapping("/saveUser")
	@ResponseBody
	public String saveUser() {
		return "添加成功";
	}
}

springmvc.utils 包

JsonUtils 工具类

  • SON工具类(使用的是jackson实现的)
public class JsonUtils {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 将对象转换成json字符串。
     * @param data
     * @return
     */
    public static String object2Json(Object data) {
    	try {
			String string = MAPPER.writeValueAsString(data);
			return string;
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
    	return null;
    }
    
    /**
     * 将json结果集转化为对象
     * 
     * @param jsonData json数据
     * @param clazz 对象中的object类型
     * @return
     */
    public static <T> T json2Pojo(String jsonData, Class<T> beanType) {
        try {
            T t = MAPPER.readValue(jsonData, beanType);
            return t;
        } catch (Exception e) {
        	e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将json数据转换成pojo对象list
     * @param jsonData
     * @param beanType
     * @return
     */
    public static <T>List<T> json2List(String jsonData, Class<T> beanType) {
    	JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
    	try {
    		List<T> list = MAPPER.readValue(jsonData, javaType);
    		return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
    	
    	return null;
    }    
}

xml文件

spring.xml文件代码

<beans>
	<bean name="/queryUser2"
		class="com.kkb.springmvc.handler.QueryUserHandler2"></bean>
	<bean name="/queryUser"
		class="com.kkb.springmvc.handler.QueryUserHandler"></bean>
		

	<!-- 使用注解方式编写的处理器类 -->
	<bean class="com.kkb.springmvc.controller.UserController"></bean>

	<!-- 处理器映射器的配置 -->
	<bean class="com.kkb.springmvc.mapping.BeanNameUrlHandlerMapping"
		init-method="init"></bean>
	<bean class="com.kkb.springmvc.mapping.SimpleUrlHandlerMapping"
		init-method="init"></bean>
	<bean
		class="com.kkb.springmvc.mapping.RequestMappingHandlerMapping"
		init-method="init"></bean>

	<!-- 处理器适配器的配置 -->
	<bean class="com.kkb.springmvc.adapter.HttpRequestHandlerAdapter"></bean>
	<bean
		class="com.kkb.springmvc.adapter.SimpleControllerHandlerAdapter"></bean>
	<bean
		class="com.kkb.springmvc.adapter.RequestMappingHandlerAdapter"></bean>
</beans>

pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.kkb</groupId>
	<artifactId>springmvc-custom12</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<dependencies>
		<!-- servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>com.kkb</groupId>
			<artifactId>spring-framework-custom-12</artifactId>
			<version>0.0.1-SANPSHOT</version>
		</dependency>

		<!-- jackson依赖 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.6</version>
		</dependency>
		<!-- 专门用来进行xpath语法解析 -->
		<dependency>
			<groupId>jaxen</groupId>
			<artifactId>jaxen</artifactId>
			<version>1.1.6</version>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.5</version>
		</dependency>
		<dependency>
			<groupId>com.kkb</groupId>
			<artifactId>spring-framework-custom-12</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- 配置Maven的JDK编译级别 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
					<!-- 通过反射获取方法参数时,需要设置以下参数才能保证获取到的方法参数是有意义的 -->
					<compilerArgs>
						<arg>-parameters</arg>
					</compilerArgs>
				</configuration>
			</plugin>

			<!-- 配置tomcat7插件,不需要安装本地tomcat -->
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>80</port>
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值