jsp电商开发笔记

感谢bootstrap...

结构

本次未用到其他框架,单纯的理解一下开发模式,与mvc相比,个人在jsp中理解这个模式是:
servlet做控制层,javabean做model层,前面的jsp则是view层

大概流程

访问 -> 过滤器 -> jsp -> servlet -> javabean -> servlet -> jsp

过滤器

刚学jsp的时候,jsp的编码真的很恶心,动不动就是乱码。其实用一个编码过滤器就能解决了。
过滤器是对所有访问符合匹配规则的都会先经过这个filter

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }

web.xml配置:

  <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>comm.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
servlet

1、所有页面共用值,可以用session

import javax.servlet.http.HttpSession;
HttpSession session = request.getSession();
session.getAttribute("memberUser");
session.setAttribute("memberUser",member.getName());

2、servlet与jsp之间的传值用,用的是请求转发(变量可转发过去),在服务端

request.setAttribute("goods",goods);
request.getRequestDispatcher("./update_goods.jsp").forward(request, response);

3、如果在想包含一个servlet,就用下面的include方法,不能用forward跳转,不然报错是不能进行包含一个跳转页面,一般可以在页面展示信息交互多的地方使用。

request.getRequestDispatcher("./index/login.jsp").include(request, response);

在jsp中带参数的包含:

<jsp:include page="/index.do">
    <jsp:param name="aim" value="header" />
</jsp:include>

4、如果只是单纯的重定向,页面url会跳转,在客户端

response.sendRedirect("xxx");

5、在servlet中输出文字
servlet里面的System.out.println输出只是在console中,如果想让它输出在客户端的页面的话

import java.io.PrintWriter;
PrintWriter out = response.getWriter();
Message(out, "账号或者密码错误");
private void Message(PrintWriter out, String message) {
    out.println("<script>alert('" + message
        + "!');window.history.back();</script>");
    out.flush();
}
javabean

主要是对数据进行操作的一些javabean,代码重用没弄好,是对每个表弄了一个javabean,又弄了一个数据库操作的javabean,其中很多表的代码其实可以实现一个重用。

1、数据库连接

static Connection conn = null;
static String driverClass = "com.mysql.jdbc.Driver";
static String url="jdbc:mysql://ip:3306/shopping?useUnicode=true&characterEncoding=UTF8";
static String username = "xxx";
static String password = "xxx";

public static Connection getConnection(){
    if(conn!=null){
        return conn;
    }else{
        try{
            Class.forName(driverClass);
            Connection res = DriverManager.getConnection(url, username, password);
            return res;
        }catch(Exception e){
            System.out.println("Db Error:"+e.getMessage());
            return null;
        }
    }
}

2、数据查询
比如查询所有商品信息:

public List<goodsBean> getAll_goods(){
    List<goodsBean> Allgoods = new ArrayList<goodsBean>();
    try{
        Statement stmt = conn.createStatement();
        ResultSet res = stmt.executeQuery("select * from goods order by goods_id desc");
        while(res.next()){
            goodsBean goods = new goodsBean();
            goods.setAdd_time(res.getDate("add_time"));
            goods.setCategory_id(res.getInt("category_id"));
            goods.setDescription(res.getString("description"));
            goods.setGoods_id(res.getInt("goods_id"));
            goods.setImagePath(res.getString("imagePath"));
            goods.setName(res.getNString("name"));
            goods.setPrice(res.getFloat("price"));
            goods.setQuantity(res.getInt("quantity"));
            Allgoods.add(goods);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    return Allgoods;
}

3、数据操作

public void add_goods(goodsBean goods){
    try{
        PreparedStatement pStmt = conn.prepareStatement("insert into goods (`name`,`price`,`quantity`,`description`,`imagePath`,`add_time`,`category_id`) values (?,?,?,?,?,?,?) ");
        pStmt.setString(1, goods.getName());
        pStmt.setLong(2, (long) goods.getPrice());
        pStmt.setLong(3, goods.getQuantity());
        pStmt.setString(4, goods.getDescription());
        pStmt.setString(5, goods.getImagePath());
        pStmt.setDate(6, new Date(goods.getAdd_time().getTime()));
        pStmt.setLong(7, goods.getCategory_id());
        pStmt.executeUpdate();
    }catch(SQLException e){
        e.printStackTrace();
    }
}
jsp

如果servlet用的是getRequestDispatcher.forward,在jsp这样用c指令接收值

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:forEach items="${Allgoods}" var="goods">
    <tr class="active">
      <td>${goods.goods_id}</td>
      <td>${goods.name}</td>
      <td>${goods.price}</td>
      <td>${goods.quantity}</td>
      <td>
          <a href="<%=path%>/admin/adminGoods?id=${goods.goods_id}"><button class='btn btn-primary' type='button btn-sm'>修改</button></a>
          <a href="<%=path%>/admin/adminGoods?del=${goods.goods_id}"><button class='btn btn-primary' type='button btn-sm'>删除</button></a>
      </td>
    </tr>
</c:forEach>
购物车功能实现

购物车订单相对其它功能繁杂了一点,将商品弄成一个list放入session中,最后取消订单也可以很方便的直接删,但是有一个严重的问题,就是对session的验证没到位(暂没想出什么方法来实现),也就是登录注销后,其他用户可以看到这个订单。

jsp:

<%
Float Allmoney = (float)0;
try{
    List<orderBean> orderSession = (List<orderBean>)session.getAttribute("orderList");
    for(int i = 0; i < orderSession.size(); i++) {
    orderBean order = orderSession.get(i);
    Float money =  order.getPrice() * order.getBuy_quantity();
    Allmoney = Allmoney + money;
%>
<tr class="active">
    <td><%=order.getGoods_id()%></td>
    <td><%=order.getPrice()%></td>
    <td><%=order.getBuy_quantity()%></td>
    <td><%=money%></td>
</tr>
<%
    }}catch(Exception e){}
%>

servlet:

/*
* 提交订单
*/
List<orderBean> orderSession = (List<orderBean>)session.getAttribute("orderList");
Float Allmoney = (float)0;
for(int i=0;i<orderSession.size();i++){
orderModel.add_order(orderSession.get(i));
Allmoney = Allmoney + orderSession.get(i).getPrice() * orderSession.get(i).getBuy_quantity();
}

/*
* 用户money减少
*/
orderModel.d_money(Allmoney, (String)session.getAttribute("memberUser"));
session.setAttribute("orderList", null);
response.sendRedirect("./member_info.jsp");

问题总结

1、jsp页面支持el表达式,为false的时候才会解析表达式

<%@ page isELIgnored="true|false"%>

2、jsp页面乱码

<%@ page pageEncoding="utf-8"%>
posted @ 2016-07-03 22:19  l3m0n  阅读(1068)  评论(0编辑  收藏  举报