web层
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//获取子类字节码对象
Class clazz = this.getClass();
System.out.println(this);
//获取method方法名参数,作为获取方法对象的参数
String m = request.getParameter("method");
if(m==null){
m="index";
}
System.out.println(m);
//获取方法对象
Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class);
//让方法执行,返回值为请求转发路径
String s = (String) method.invoke(this, request, response);
System.out.println(s);
//判断次路径是否为空,不为空请求转发到次路径
if(s != null){
request.getRequestDispatcher(s).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
public class OrderServlet extends BaseServlet {
/**
* 生成订单
* @param request
* @param response
* @return
* @throws Exception
*/
public String add(HttpServletRequest request, HttpServletResponse response) throws Exception {
//0判断用户是否登录
User user = (User) request.getSession().getAttribute("user");
if(user == null) {
request.setAttribute("msg", "请先登录~~~~~");
return "/jsp/msg.jsp";
}
//1封装数据
Order order = new Order();
//1.1 封装订单id
order.setOid(UUIDUtils.getId());
//1.2封装订单时间
order.setOrderTime(new Date());
//1.3封装订单金额
//获取session中的购物车
Cart cart = (Cart) request.getSession().getAttribute("cart");
order.setTotal(cart.getTotalPrice());
//1.4封装订单项
//从购物车中获取购物车项,遍历购物车中的购物车项,得到每个订单项中的数据
for (CartItem cartItem : cart.getCartItem()) {
OrderItem oi = new OrderItem();
//设置订单项id
oi.setItemid(UUIDUtils.getId());
//设置订单项包含的商品
oi.setProduct(cartItem.getProduct());
//设置包含于那个订单
oi.setOrder(order);
//设置订单项中的商品数
oi.setCount(cartItem.getCount());
//设置定单项的小计
oi.setSubTotal(cartItem.getSubTotal());
//添加订单项到order对 象中
order.getItems().add(oi);
}
//1.5设置用户
order.setUser(user);
//调用service,完成对订单的添加
OrderService os = (OrderService) BeanFactory.getBean("OrderService");
os.add(order);
//将order对象放入request域
request.setAttribute("order", order);
//将以前的购物车中的东西,即将以前的从购物车清除了
request.getSession().removeAttribute("cart");
//请求转发到订单详情页面
return "/jsp/order_info.jsp";
}
}
service层
public interface OrderService {
void add(Order order) throws Exception;
}
public class OrderServiceImpl implements OrderService {
/**
* 将订单数据添加到数据库中
* @throws Exception
*/
@Override
public void add(Order order) throws Exception{
try {
//1对者两个添加要加入事务
DataSourceUtils.startTransaction();
//2在order添加一条数据
OrderDao od = (OrderDao) BeanFactory.getBean("OrderDao");
od.add2Order(order);
//在orderitem中添加n条数据
for (OrderItem oi : order.getItems()) {
od.add2OrderItem(oi);
}
//提交事务
DataSourceUtils.commitAndClose();
} catch (Exception e) {
e.printStackTrace();
//事务回滚
DataSourceUtils.rollbackAndClose();
throw e;
}
}
}
dao层
public interface OrderDao {
void add2Order(Order order) throws Exception;
void add2OrderItem(OrderItem oi) throws Exception;
}
public class OrderDaoImpl implements OrderDao{
/**
* 添加一条订单
/
@Override
public void add2Order(Order order) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into order values(?, ?, ?, ?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(),
order.getState(), order.getAddress(), order.getName(),
order.getPhone(), order.getUser().getUid());
}
/*
* 添加一条订单项
*/
@Override
public void add2OrderItem(OrderItem oi) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into orderitem values(?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(),sql, oi.getItemid(), oi.getCount(), oi.getSubTotal(), oi.getProduct().getPid(), oi.getOrder().getOid());
}
}
出错后jsp页面显示不出,所报异常
java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
... 28 more
七月 08, 2017 12:01:24 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [OrderServlet] in context with path [/store] threw exception
java.lang.RuntimeException
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
com.local.web.servlet.OrderServlet@8bc0b9
add
我用debug方式看了看了下order在dao用dbutils插入时的数据,数据是封装进去的,就name,address,phone,三项没有封装。并已经接图。以前在mysql中插入数据页是可以插入空数值的,
为何会报NullPointerException,困扰了好些时候了,各位大神有时间的话帮着看一下呀!