您的位置:首页 > 编程语言 > Java开发

javaWeb项目总结

2015-07-29 23:17 411 查看
        这篇博客是对我学习的记录。

---------------------------------------------------------------------2015-07-29晚---------------------------------------------------------------

最近几个月都在学习java,我当初为什么要选择技术,其实我当初是看中了技术的薪水,但是后来发现技术不仅仅是要看中薪水,还要看重技术,因为我觉得技术是一门非常美丽的艺术,至少我是这么认为的,在现在的社会当中,人们越来越离不开电子科技了,而很多的电子科技都是开发人员拼死拼活做出来的,当然作为一个程序员的话,编码的过程可以说是血泪与欢笑的交替。好了,不罗嗦了,直接进入正题。

        最近学习完了java WEB,要一个小组合作完成一个小型的项目(类似于淘宝网),其实做的东西也不多,主要是要我们熟悉正式编代码的时候走的流程。

因为需求文档和页面以及数据库都是现成的了,所以我们只做后台也前台交互就可以了。当然前台也需要稍微调整,例如拿到后台的数据再把它们显示在页面上。

这次的项目使用的是STS(Spring Tool Suit)开发工具,这个开发工具其实就是对eclipse进行了自定义改造。使用起来也没多大的差别,就是多了一些插件而已。然后项目使用的框架是SpringMVC+hibernate,目前市场上应该主流的有几个搭配:SSH,SpringMVC+hibernate,SpringMVC+mybatis我目前知道的就这三种搭配。

这次的项目我做的部分是页面的显示,当打开首页的时候就需要使用一个forward标签来进行跳转到后台取数据,之后再跳转回首页,将拿到的数据进行显示。此处需要注意的地方是:如果单单写了个forward标签而不加以判断的话就会出现死循环。所以在进入后台之后要把一些要显示的数据设置到applicationScope里面或者是SessionScope里面,个人觉得,只要在整个网站中所有人见到的东西都一样的话就设置成applicationScope,这样既方便又简洁。

<c:if test="${(applicationScope.brands)==null }">
<jsp:forward
page="${pageContext.request.contextPath }/../page/toIndex.do"></jsp:forward>
</c:if>


这里面的brands是所有的商标的意思。如果是首次进入index.jsp页面时这个brands是空的,所以就需要跳转到后台拿数据,第二次进入index.jsp的时候brands不为空,所以就不需要在调到后台的controller里面了。

首页当然不仅仅只有商标,还有产品,产品也是需要在第一次跳到后台的时候拿到数据,这些数据一般都是经过处理的,例如经过了特定的要求排好序的一个产品集合。首页拿到数据后在使用jstl的标签foreach遍历出来并显示在页面上。

<c:forEach var="brand" items="${applicationScope.brands }">
<dl>
<dt>
<a href="${pageContext.request.contextPath }/product/product_list.do?selectType=1&&pageCount=1" title="${brand.name }"><img src="${pageContext.request.contextPath }/pages/${brand.logo}" alt="${brand.name }" width="88" height="38" border="0"></a>
</dt>
<span style="white-space:pre">	</span><dd>
<a title="${brand.name }" href="${pageContext.request.contextPath }/product/product_list.do?selectType=1&&pageCount=1">${brand.name }</a>
</dd>
</dl>
</c:forEach>


以上是循环遍历从applicationScope里面拿到的数据,这里只演示一下循环遍历商标的信息并显示在页面上。产品的遍历同出一辙。

对了,大家都发现在淘宝的最顶端那一栏会有一个注册登录的按钮吧。这个就得判断用户是否已经登陆,若没有登陆则显示这两个按钮,若已经登陆了则显示“欢迎您,***”,其实这个也是挺好做的,就是登陆成功之后将用户对象保存到sessionScope里面,然后再页面上判断该session到底有没有值,是不是空,如果是空则显示登陆注册按钮,反之显示“欢迎您,***”;

<pre name="code" class="html"><c:if test="${(sessionScope.s_user)!=null }">
您好,<font class="f4_b">${s_user.name }</font>, 欢迎您回来! [
<a href="${pageContext.request.contextPath }/userUndo/doUserUndo.do" rel="nofollow">退出
<span style="white-space:pre">	</span></a> ]
</c:if> 
<c:if test="${(sessionScope.s_user)==null }">
<span style="white-space: pre;">	</span><a href="${pageContext.request.contextPath }/product/isLogin.do?pageInfo=index">[ 登录
<span style="white-space:pre">	</span></a>|
<a href="${pageContext.request.contextPath }/product/isLogin.do?pageInfo=index"> 注册 ]
<span style="white-space:pre">	</span></a>
</c:if>



以上就是简单的判断。

        接下来再说一下分页的功能吧!如果商品有很多,我们总不能把全部商品一次性从数据库中读取出来,然后全部显示在页面中吧,这不科学。所以才出现了分页显示的功能。就好像一本书有很多文字,我们也不会把全部的文字都放在一页纸上吧,我们通常的做法都是讲文字分成每一页显示多少个字符,分为多少页来显示,这样让人看起来一点也不揪心。

分页其实也是蛮简单的,由于我这个项目使用的是mysql-connector-java-5.1.16-bin.jar,大家应该都知道mysql的分页是最简单的,只需要一个limit关键字就可以轻松实现,相对于SQL
Server , Oracle的分页来说简单太多了。

SQL语句固然简单,但如何才能把读取到的数据返回给页面并显示出来呢?而且还要注意一些细节上的问题。例如:当前页是第一页是就隐藏掉“上一页”这个按键,如果当前页是最后一页就隐藏掉“下一页”这个按键,用户体验也会好很多。还有就是想要选择第几页直接就跳转到该页就需要输入一个自己想要的页码数,传到后台,后台处理完后再将相应的数据返回给页面。

c:if test="${sessionScope.currentPageNum >1}">
<span class="previou1"><a class="previou1"
href="${pageContext.request.contextPath }/product/product_list.do?selectType=${sessionScope.selectType }&&pageCount=${sessionScope.currentPageNum -1}"  rel="nofollow">上一页</a></span>
</c:if>

<c:if test="${sessionScope.currentPageNum<pageNum }">
<a href="${pageContext.request.contextPath }/product/product_list.do?selectType=${sessionScope.selectType }&&pageCount=${sessionScope.currentPageNum +1}"
class="next2" rel="nofollow">下一页</a>
</c:if>


<td class="pagebt">
<a href="${pageContext.request.contextPath }/product/product_list.do?selectType=${sessionScope.selectType }&&pageCount=${pageNum }" rel="nofollow">末页   
</a>
跳转到第 <input id="pageCode" name="pageCount" type="text" id="curpage" />页
<input name="pagebt" type="submit" id="pagebt" value="确定" />
</td>


以上就是上一页,下一页以及选择第几页的做法。

接下来我想讲的是购物车这块,其实我讲的地方都是我自己提醒我自己要注意的地方,也是我在做项目的过程中遇到的问题,之后又通过各种途径解决之后的成果。

今天就先到这吧,快一点了,明天再继续...keep moving and stay strong!!!

---------------------------------------------------------------------2015-07-30晚---------------------------------------------------------------


好了,继续昨天晚上没有写完的。

购物车,其实我一开始的时候是直接在页面上操作,意图在页面完成添加到购物车之后的各种计算功能,但是后来发现这种做法是比较麻烦的。后来在老师的指点之下,选择了使用VO(通常用于业务层之间的数据传递,和POJO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.),把购物车所需要的所有数据封装到一个VO里,这样子,操作VO的时候就可以操作购物车了.

当然,在点击添加到购物车的时候需要将产品的id传给后台,后台通过产品id查询到该产品实体,在把这个产品set到一个包含产品详情的POJO类的模型,通常是建立一个继承原POJO类的VO,将该产品set到这个VO里面后,在设置其他参数,例如订单表,隐藏域的值(作为判断是否是同一个订单,作为该订单的唯一标识符),该产品的数量,单价,以及总价等信息。然后拿到数据之后就可以对购物车进行单独的操作了,购物车是暂时放到一个sessionScope里面,当点击结算中心时才会插入到数据库中。对购物车的删除单个产品以及清空整个购物车的功能都不难实现,只需要传入一个产品id给后台,后台remove掉session里面的这个id的产品,清空就是removeAll。比较难做的就是购物车的更新了,每当在购物车更新了产品数量并点击更新购物车的时候,就要把整个购物车的各种数值刷新一遍。

我的做法是,将该修改的数量以一个数组的形式(request.getParameterValues("changeCount");)发送给后台,其实也可以使用SpringMVC 里面的list数据绑定,这里暂不做介绍。拿到数组之后在与原来session里面的值进行对比,看看那个产品的数量变化了,然后再更新该产品的总价,以及整个购物车的总价,到这里,整个购物车就算是完成了。

/**
* 对购物车进行刷新和清空。
*
* @param request
* @return
* @author frank
*/
@RequestMapping(value = "/operateCart.do", method = RequestMethod.GET)
public String operateCart(ShoppingCart shoppingCart,HttpServletRequest request,
HttpSession session) {
ShoppingCart cart = (ShoppingCart) session
.getAttribute("s_productList_shopCart");

String operation = request.getParameter("operation");
System.out.println(operation + "购物车中的产品");
if ("refresh".equals(operation)) {
// 获取表单中所有name为changeCount的值
String[] values = request.getParameterValues("changeCount");

for (int i = 0; i < values.length; i++) {
Integer productCount = new Integer(values[i]);
if (cart.getOrderDetails().get(i).getProductCount() != productCount) {
cart.getOrderDetails().get(i).setProductCount(productCount);
cart.getOrderDetails()
.get(i)
.setProductPrice(
cart.getOrderDetails().get(i).getProduct()
.getSpecialPrice()
* productCount);
}
}
float totalPrice = 0;
for (OrderDetailModel oModel : cart.getOrderDetails()) {
totalPrice = oModel.getProductPrice() + totalPrice;
}
// 封装一个购物车对象
cart.getUserOrder().setTotalPrice(totalPrice);
session.setAttribute("s_productList_shopCart", cart);

} else if ("removeAll".equals(operation)) {

float totalePrice = 0;
// 如果集合不为空才清空集合,否则会报空指针异常。
if (cart.getOrderDetails() != null
&& cart.getOrderDetails().size() > 0) {
cart.getUserOrder().setTotalPrice(totalePrice);
cart.getOrderDetails().removeAll(cart.getOrderDetails());
}
session.setAttribute("s_productList_shopCart", cart);
}
return "cart";
}

/**
* 将商品添加到购物车。
*
* @param modelMap
* ModelMap对象,用于将对象传递给页面。
* @param id
* product的ID.
* @return 返回相应的跳转信息。
* @author frank
*/
@RequestMapping(value = "/{productId}/addToCart.do", method = RequestMethod.POST)
public String addToCart(ModelMap modelMap,
@PathVariable(value = "productId") int id, HttpSession session,
HttpServletRequest request, int number) {
Product product = productServiceImpl.getProductById(id);
String token = request.getParameter("token");
System.out.println("token的值--------------->" + token);

Iterator<String> tokenIterator = tokens.iterator();
boolean tokenFlag = true;
while (tokenIterator.hasNext()) {
if (tokenIterator.next().equals(token)) {
tokenFlag = false;
}
}
if (tokenFlag) {
ShoppingCart shopCart = new ShoppingCart();
if (session.getAttribute("s_productList_shopCart") != null) {
ShoppingCart shoppingCart = (ShoppingCart) session
.getAttribute("s_productList_shopCart");

shopCart.getOrderDetails().addAll(
shoppingCart.getOrderDetails());
}

Iterator<Product> iterator = cartList.iterator();
boolean flag = true;
// 循环迭代购物车集合,如果有重复的就不添加。
while (iterator.hasNext()) {
if (iterator.next().getId() == product.getId()) {
flag = false;
}
}
if (flag == true) {
float totalPrice = 0;
OrderDetailModel orderModel = new OrderDetailModel();
orderModel.setProduct(product);
orderModel.setSid(System.currentTimeMillis() + "");
orderModel.setProductPrice(product.getSpecialPrice() * number);
orderModel.setProductCount(number);
shopCart.getOrderDetails().add(orderModel);
List<OrderDetailModel> orderDetailModels = shopCart
.getOrderDetails();
for (OrderDetailModel oModel : orderDetailModels) {
totalPrice = oModel.getProductPrice() + totalPrice;
}
// 封装一个购物车对象
shopCart.getUserOrder().setTotalPrice(totalPrice);
}
session.setAttribute("s_productList_shopCart", shopCart);
tokens.add(token);
return "cart";

} else {
tokens.add(token);
modelMap.put("product", product);
return "cart";
}
}

好了,这里就暂时告一段落了。也算是我对这个项目的一个小总结。可能多年回过头来看的时候又是另一番风味。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息