E-Store系统详细说明

发布时间:2011-11-20 00:34:00   来源:文档文库   
字号:

EStore

详细设计说明书

开发时间:2010-6-3

结束时间:2010-7-5

开发组员:张学武 杨欢 胡蓉

刘冬冬 汪利君 何珍妮

1、说明

2、引言

2.1.编写目的

2.2. 项目背景

3、项目概述

3.1. 项目系统设计架构及理念

4、项目详细设计说明

4.1. 系统功能说明

4.2. 系统操作流程

4.3. 系统设计

4.4. 数据库设计

5、项目代码说明

5.1. 前台代码

5.2. 后台管理

6、开发过程出现的问题及解决方法

1、说明:该电子书城系统详细说明报告主要包括以下内容:

1 引言:系统的相关背景介绍

2 项目概述:E-Store系统项目组成员、设计理念及思路、项目进程

3 系统详细设计说明,包括:系统功能说明、系统架构设计

系统操作流程、ER图、数据库连接

4 系统特色技术及代码说明

5 项目过程中出现的问题及解决办法

2引言

2.1.编写目的

编写《E-Store系统详细说明报告》,是为了得出对电子商城系统准确的描述,陈列出该系统的的多种功能及其使用方法,方便系统管理管理人员及使用者操作。

该《说明》的读者是:参与系统开发的管理人员和设计人员。

2.2.项目背景

进入21世纪以来,电子商务伴随着IT的成熟,逐渐发展壮大,成为网络经济的核心。在电子商务的发展过程中,人们逐渐意识到在线 购物的无地域界限、安全、方便快捷及其价格优势,在线购物的队伍 也随之扩大。不断增长的强大需求正成为电子商务的发展动力,基础 环境的成熟与需求欲望的增长将推动电子商务与商务网站的建设不断发展。开发E-Store,能够让消费者很快就可以搜寻 到想要的书籍;例如留言板、讨论区、E-MAIL服务,更是为传统书 店提供多元化的服务。

3、项目概述

3.1. 项目系统设计架构及理念

理念

网上书店商务网站构建初始目标主要是面向广大消费者,由于图书消费属于知识型消费类,人们求知欲望没有阶层与年龄差别,因而 ,书店网站应在具有自己特色的同时应适合不同人士的需要。因此,网上书店网站定位于面向广大消费者,并突出完善售前、售中、售 后客户服务与安全保障方面的特色。售前服务提供详细的图书信息、 简便快捷的操作过程;售中服务通过采取安全措施为用户提供网上订购服务安全保障与实时支付;售后服务对用户订购的图书提供快速物流配送,并对用户所购图书提供质量保证

架构:

前台功能结构

后台功能结构

4项目详细设计说明

4.1.详细功能说明

在前台实现主要有:

1. 用户注册

2. 用户登陆

3. 查看全部图书

4. 查看图书详细情况

5. 购物车功能

6. 图书选购

7. 查看用户的订单信息

8. 显示结账页面和确认页面

9. 购买成功页面。

后台管理部分主要有:

1. 商店图书管理:添加、修改、删除、查看。

2. 用户信息管理:查看、修改、删除。

3. 订单信息管理:查看订单清单、更新订单付款、删 除订单。

4. 管理员管理:管理员添加,删除,密码修改,查询。

42 项目整体操作说明

1)顾客在进行第一次购物之前要进行注册。一般要求输入用户名和密码等基本信息。注册完后,系统会显示一个登陆页面;

2)进入网上商店,查看,挑选商品。顾客可以按产品类别检索商品,找出所关心的商品;

3)查看商品细节说明,了解价格、付款方式、购物说明 详细信息;

4)选中商品后,点击“放入购物车”按钮,将商品放入购物车;如需继续购物则点击“继续购物”按钮;

5)选购结束,检查购物车,核实商品和数量是否正确,如有出入,可以重新调整商品和数量,如无误,则点击“结帐”按钮;

6)在结账页面填写自己的相关信息,如姓名,信用账号,电话号码等基本信息,完成结账;在验证页面核对结账信息,如无误点击“确定”完成购物过程,如有误则返回结账页面进行修改。

后台管理人员的操作过程:

1.管理人员输入用户名,密码进入管理页面。

2.管理人员进入管理页面,可进行商店图书查询,添加图书资料,订单信息查询,用户信息查询。

3.管理人员点击商店图书查询页面。

4.管理人员点击添加图书资料页面:输入需添加的图书信息,管理人员点击提交向后台数据库提交信息。提交成功的话,页面显示新图书资料提交成功,否则显示数据库操作失败。

5.管理人员点击订单查询页面:页面显示出已接到订单,其中包括 图书名称,作者,图书类别,单价,数量以及总金额,总数量。

6 管理人员点击用户信息查询页面:页面显示出用户的基本信息。管理员可以进行用户的删除查找动作。删除成功后,页面显示删除成功。

4.3.系统操作流程

前台流程

后台流程:

4.4.数据库设计

书本信息表:titles用来存储书本相关信息

书本类别表:tb_bigType 用来保存书本类别信息

书本类别表:tb_samllType 用来保存书本类别信息

订单信息表:tb_order 用来保存前台用户提交的订单信息

详细订单表:tb_orderDetail 用来保存用户提交订单的详细信息

友情链接表:tb_link 存储商城中超链接的各个网站

商城信息表:tb_info 用于存储商城公告信息

用户信息表:tb_user 用于存储商城注册用户信息

管理员信息表:tb_manager 用于存储后台管理员信息

5、项目代码说明

5.1. 前台代码

A、前台会员管理模块

1、会员登录模块

流程分析与设计

功能实现流程设计

程详解:

1login.jsp页面中提供会员或管理员登录的信息输入,由会员或后台管理员输入登录名和密码,以请求参数的形式提交给LoginResult.jsp处理。

2LoginResult.jsp页面获取页面请求参数用户名与密码。

3)以会员名(后台管理员)为参数调用UserDaoMemberDao)类的selectUserEntityselectMemberEntity)方法,查询数据库表。

4)查询结果为空,提示会员不存在,请重新登录或“管理员不存在,请重新登录”,否则将方法返回的会员信息表实体对象保存。

5)对实体对象的密码与页面请求参数密码(即会员(管理员)在登录时输入的密码)比较,密码不一致,登录失败,页面提示重新登录,系统页面跳转到首页。

6)会员密码验证一致,则登录成功,系统显示成功信息,页面跳转至前台商品展示页面,同时将会员信息保存在会话中,以供会员本次在网站访问时使用 。同样,后台管理员登陆成功后进入后台页面,也将信息保存在会话中,以供管理员在进行后台管理时使用。

2、会员注册模块

功能实现流程设计

编程详解

1、在uesrRegister.jsp中提供功能入口链接

注册

2、创建userRegister.jsp,页面设计提交表单

3 创建User.jsp,该页面实现实际数据库操作,并不生成返回浏览器的页面,数据库操作结果以JSP隐含对象request的属性将请求转发到doRegister.jsp显示

3、会员信息修改

功能实现流程设计

编程详解:

1、修改main.jsp

2、判断会员是否登录

因为在会员登录后会将会员信息以类UserEntity的对象形式在JSP隐含对象session中存放,故可使用判断session对象是否存有会员信息对象来判断是否登录。

<% String userlink="userLoginPlease.jsp";

//user是会员登录后存放在 session对象上的属性名

if (session.getAttribute("user") == null) {}

UserEntity user = UserEntity) session.getAttribute("user");

userlink="userUpdate.jsp?name="+user.getName(); %>

4 、会员找回密码

功能实现流程设计

编程详解:

login.jsp中添加找回密码的链接,链接到密码找回功能的起始页面findPass.jsp.jsp

创建findPass.jsp,页面风格与主页保持一致,在页面中设计一个提交表单,用于提交找回密码的会员名称,会员输入会员名称后,将作为请求参数以post方法提交到页面findPass1.jsp中,提交之前使用JavaScript函数checkEmpty(form)进行合法性验证

在页面中引入数据库会员信息表操作类和实体类,使用操作类的selectUserEntity方法以findPass1.jsp提交的请求参数会员名称做参数查询数据库,查询结果存放在页面对象user

还可以在findPass2.jsp页面中重新设置密码,成功之后跳转到login.jsp页面,重新登录。

B、前台商品检索

流程分析与设计

商品检索功能由两部分页面构成:搜索内容的提交页面和搜索结果显示页面。考虑到搜索功能应是用户常用的功能,而且搜索内容的提交页面元素不需要许多,因而将搜索提交页面设计在通用框架上侧包含的页面index.jsp中,以页面的表单元素searchForm存在,并设计该表单提交的目的地址为执行搜索操作并显示搜索结果的页面kind.jsp

<jsp:include page="goodsShowSort.jsp" flush="true">jsp:include>td>

<td valign="middle"><form name="searchForm" method="post" action="goodsShowSearch.jsp" onSubmit="return checkEmpty(searchForm)">

<table>

编程详解

1.在GoodsDao类中,添加按商品名称查询方法public List selectGoodsSearch(String search),方法参数为String类型的对象,表示商品的名称,方法返回符合查询条件的商品链表

2.在页面index.jsp中,添加搜索条件提交表单,表单设计输入文本,负责接受用户需要查询的商品名称,并将此信息以请求参数search提交给页面goodsShowSearch.jsp处理。

<td style="top-padding:5px;" width="150 ">

<input name="search" type="text" size="30" align="left" class="inputStyle" onMouseOver="this.className='inputStyleMove'" onMouseOut="this .className='inputStyle'" >td>

3.页面kind.jsp处理用户的商品搜素先从页面请求参数search中获取要查询的商品名称,然后以此作方法参数调用数据库商品信息表操作类BooksDaoselectGoodsSearch()方法

// 搜索商品

BooksDao dao = new BooksDao();

String search =request.getParameter("search");//获取在上页面search中输入的搜索内容

List searchList = (List) dao.selectGoodsSearch(search);

int pageNumber = searchList.size(); // 计算出有多少条记录

int maxPage = pageNumber; // 计算有多少页数

4、编写goodsShowSearch.jsp页面

C前台购物车管理

1)商品详细信息显示

编程详解:

1、创建goodsShowSelectOne.jsp,在页面中引入数据库商品信息表操作类BooksDao和实体类BooksEntity,实现利用BooksDaoselectGoodsOne方法从数据库中检索出会员想购买的商品,检索条件为商品编码,该商品编码通过页面请求参数获得。

<%@ page import="com.mycompany.dao.BooksDao"%>

<%@ page import="com.mycompany.entity.BooksEntity"%>

2、页面添加生成数据库商品信息表操作类BooksDao的对

象,调用selectGoodsOne方法检索商品信息放入BooksEntity

对象goods中。

public ActionForward goodSelect(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

List list = null;

list = dao.selectGoods();

int pageNumber = list.size(); // 计算出有多少条记录

int maxPage = pageNumber; // 计算有多少页数

String number = request.getParameter("i");

if (maxPage % 6 == 0) {

maxPage = maxPage / 6;

} else {

maxPage = maxPage / 6 + 1;

}

if (number == null) {

number = "0";

}

request.setAttribute("number", String.valueOf(number));

request.setAttribute("maxPage", String.valueOf(maxPage));

request.setAttribute("pageNumber", String.valueOf(pageNumber));

request.setAttribute("list", list);

return mapping.findForward("goodSelect");

}

2)、添加商品到购物车

编程详解

1创建cartAdd.jsp,在页面中引入java实用工具类Vector和代表会员所选商品的临时实体类GoodsCart,类Vectorjava常用的集合类型,用于生成购物车,购物车里商品GoodsCart的实例对象是Vector类实例中的元素,可以利用Vector类的方法方便的实现对购物车进行维护。

<%@ page import="java.util.*"%>

<%@ page import="com.mycompany.cart.CartGoods"%>

2页面添加到购物车的商品信息商品编号和价格是由页面goodsShowOne.jspform表单提交的,使用request对象的getParameter方法获取。

String goodsID=(request.getParameter("goodsId"));

float goodsPrice=Float.parseFloat(request.getParameter("price"));

3)显示购物车

编程详解

创建cartShow.jsp,在页面中引入java实用工具类Vector和代表会员所选购商品信息的临时实体类GoodsCart,以及商品信息表操作类BooksDao类,Vector类用于生成对象存放会员的购物车,GoodsCart用于存放遍历购物车中的商品购买信息,BooksDao类用于获取商品的其他信息。

<%@ page import="java.util.*"%>

<%@ page import="com.mycompany.cart.CartGoods"%>

<%@ page import="com.mycompany.dao.BooksDao"%>

<% BooksDao dao = new BooksDao(); %>

4)修改及清空购物车、

编程详解

1使用session对象的getAttribute方法获取购物车存入Vector类对象cart中,并生成新购物车newcart

Vector cart=(Vector)session.getAttribute("cart");

Vector newcart=new Vector();

2遍历购物车cart内的商品,每件商品的购买数量由页面参数numX获得,将所有购买数量不为0的商品添加到新购物车newcart

for(int i=0;i

CartGoods cartGoods=(CartGoods)cart.elementAt(i); //取出各件购物车中的商品

for(int i=0;i

CartGoods cartGoods=(CartGoods)cart.elementAt(i);

String num=request.getParameter("num"+i);

try{

int newnum=Integer.parseInt(num);

cartGoods.number=newnum;

if(newnum!=0){

newcart.addElement(cartGoods); }

3、清空购物车

在清空购物车cartClear.jsp页面上,使用session对象的removeAttribute方法,实际上不仅清除购物车中的商品,也删除了购物车,会员如果继续购物,将会重新生成购物车。

session.removeAttribute("cart");

response.sendRedirect("cartShow.jsp");

<% request.setCharacterEncoding("GBK");

String isbn[] = request.getParameterValues("ISBN");

String num[]=request.getParameterValues("newNum");

Map cart = (Map) session.getAttribute("cart");

for(int i=0;i

System.out.println("isbn="+isbn[i]+"数量="+num[i]);

if(Integer.parseInt(num[i])>=1){

CartItemBean cartItem = (CartItemBean) cart.get(isbn[i]);

cartItem.setQuantity(Integer.parseInt(num[i]));

cart.put(isbn[i],cartItem);

}else{

out.println("");

return; } }

session.setAttribute("cart",cart);

response.sendRedirect("viewCart.jsp");

%>

前台会员订单查询功能分析:

会员在登录进入网上商城后可以查看自己所有的订单(包括已经出货和尚未出货的订单),既可以单独查看自己已经出货的订单,也可以单独查看自己尚未出货的订单;同时还可以对每个订单进行详细信息的查询。用户在前台JSP页面(cartSelect.jsp)可以提交四种请求:

1.查看自己的所有订单。

2.在自己所有的订单中查看已经出货的订单。

3.在自己所有的订单中查看尚未出货的订单。

4.查看自己某一订单的详细信息。

EServlet的配置

1Servlet的名称、类和其它选项的配置

web.xml文件中配置Servlet时,首先必须指定Servlet的名称、Servlet类的路径,还有选择性的给Servlet添加描述信息,并且指定在

发布时显示的名称和图标。具体如下:

<servlet>

<servlet-name>orderServletservlet-name>

<servlet-class>com.mycompany.servlet.orderServletservlet-class>

servlet>

元素之间的内容是Servlet的名称

元素之间的内容是Servlet类的路径。

2) 初始化参数

Servlet可以配置一些初始化参数,如下代码:

<init-param>

<param-name>configparam-name>

<param-value>/WEB-INF/struts-config.xmlparam-value>

init-param>

代码说明:

指定number的参数值是1000。在servlet中可以通过init()方法体中调用getInitParameter()方法进行访问。

3)Servlet的映射

web.xml配置文件中可以给一个Servlet做多个映射,因此可以通过不同的方法访问这个Servlet

<servlet-mapping>

<servlet-name>orderServletservlet-name>

<url-pattern>/orderServleturl-pattern>

servlet-mapping>

代码说明:指定名称为OrderServletServlet的映射路径为/OrderServlet

F创建Servlet过滤器和实现其编程接口

1、建立一个实现Filter接口的类public class SessionFilter implements Filter

所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法,分别为doFilterinitdestroy

(1) public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain)

throws IOException, ServletException {

//System.out.println("使用以下方法对请求进行编码:encoding="+targetEncoding);

HttpServletRequest request = (HttpServletRequest)srequest;

// 设置字符编码格式

request.setCharacterEncoding(targetEncoding);

// 把处理权发送到下一个

chain.doFilter(srequest,sresponse);

}

每当调用一个过滤器(即,每次请求与此过滤器相关的servletJSP页面)时,就执行其doFilter方法。正是这个方法包含了大部分过滤逻辑。第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器,大多数过滤逻辑是基于这个对象的。如果处理HTTP请求,并且需要访问诸如getHeadergetCookies等在ServletRequest中无法得到的方法,就要把此对象构造成HttpServletRequest

doFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servletJSP页面相关的下一个过滤器。如果没有另一个相关的过滤器,则对doFilter的调用激活servletJSP本身。

(2 public void init(FilterConfig config) throws ServletException {

this.filterConfig = config;

this.targetEncoding = config.getInitParameter("encoding");

}

Init()方法只在此过滤器第一次初始化时执行,不是每次调用过滤器都执行它。对于简单的过滤器,可提供此方法的一个空体,但有两个原因需要使init()方法。首先,FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。因此,普遍的办法是利用init()方法将FilterConfig对象存放在一个字段中,以便doFilter方法能够访问Servlet环境或过滤器名;其次,FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。

(3)public void destroy( )

大多数过滤器简单地为此方法提供一个空体,不过,可利用它来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。

2、将过滤行为放入doFilter方法

doFilter方法为大多数过滤器的关键部分。每当调用一个过滤器时,都要执行doFilter。对于大多数过滤器来说,doFilter执行的步骤是基于传入的信息的。因此,可能要利用作为doFilter的第一个参数提供的ServletRequest。这个对象常常构造为HttpServletRequest类型,以提供对该类的更特殊方法的访问。

3、调用FilterChain对象的doFilter方法

Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时,激活下一个相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时,激活ServletJSP页面自身。但是,链中的任意过滤器都可以通过不调用其FilterChaindoFilter方法中断这个过程。在这样的情况下,不再调用JSP页面的Serlvet,并且中断此调用过程的过滤器负责将输出提供给客户端。

4Servlet配置中对于过滤器的配置

<filter>

<filter-name>encodingfilter-name>

<filter-class>com.mycompany.servlet.EncodingFilterfilter-class>

<init-param>

<param-name>encodingparam-name>

<param-value>gb2312param-value>

init-param>

filter>

<filter-mapping>

<filter-name>encodingfilter-name>

<url-pattern>/*url-pattern>

filter-mapping>

<filter>

<filter-name>SessionFilterfilter-name>

<filter-class>com.mycompany.servlet.SessionFilterfilter-class>

<init-param>

<param-name>logonStringsparam-name>

<param-value>index.jsp;books.jsp;land_back.jsp;landResult.jsp;

userLoginResult.jsp;userRegister.jsp;userRegisterResult.jsp;userPasswordFind1.jsp;

userPasswordFind2.jsp;userPasswordFind3.jsp;userPasswordFind4.jsp; OnlineCount.java

param-value>

init-param>

GServlet监听器实现

第一步:创建监听器类OnlineCount.java,通过NEW命令创建一个

Class文件,准备ServletContextListenerHttpsessionListener接口

的监听处理器类,生成代码如下:

public class OnlineCount

implements ServletContextListener,HttpSessionListener{

public void contextInitialized(ServletContextEvent sce){

  //应用程序初始化时启动}

public void contextDestroyed(ServletContextEvent sce){

//应用程序卸载时启动}

public void sessionCreated(HttpSessionEvent se){

//当有用户访问时启动}

public void sessionDestroyed(HttpSessionEvent se){

//当有用户退出时启动}

}

第二步:为监听行为添加代码:

1) 为用户访问监听行为添加代码:

public void sessionCreated(HttpSessionEvent se){

HttpSession session=se.getSession();

ServletContext context=session.getServletContext();

Integer counter=(Integer)context.getAttribute("counter");

counter=new Integer(counter.intValue()+1);//在线人数增1

context.setAttribute("counter", counter);

}

第二步:为监听行为添加代码:

2)为用户退出监听行为添加代码:

public void sessionDestroyed(HttpSessionEvent se){

HttpSession session=se.getSession();

ServletContext context=session.getServletContext();

Integer counter=(Integer)context.getAttribute("counter");

counter=new Integer(counter.intValue()-1);//在线人数减1

context.setAttribute("counter", counter);

}

第三步: session监听器配置到web.xml配置文件中:

<listener>

<listener-class>com.mycompany.servlet.OnlineCountlistener-class>

listener>

第四步:显示在线用户的监听结果

在需要显示的JSP页面frameTopt.jsp中加入如下代码:

<td><font color="orange">  在线人数<%if(application.getAttribute("counter")!= null){

%>  <%=application.getAttribute("counter")%><%

}else{ %>  1<%}%>font>

td>

5.2. 后台管理

后台管理用了struts技术

1

编程详解

在页面index_back.jsp单击超级链接后台管理员

后台管理员

参数action =1调用ManagerAction 中的ManagerSelect方法查询所有管理员

2

编程详解

1、单击超级链接“会员管理”

memberAction.do?action=2 class=a3>

2MemberAction调用MemberDAOselectMember方法获得所有会员信息

3、跳转到页面selectMember.jsp,显示所有会员信息。

4、在selectMember.jsp页面单击详细信息链接。

href=memberAction.do?action=3&id=<%=form.getId()%>>详细信息

5MemberAction调用MemberDAOselectOneMember方法获得当前会员的详细信息。

6、调转到selectMember.jsp页面显示当前会员的详细信息。

编程详解

在页面index_back.jsp单击超级链接后台管理员

managerAction.do?action=1 class=a3>后台管理员

参数action =1调用ManagerAction 中的ManagerSelect方法查询所有管理员

从数据库中提取管理员的相关信息点击添加管理员可以跳转到ManagerInsert.jsp页面,添加管理员点击删除就可以删除相应的管理员。

4密码修改

点击修改您的密码链接就跳转ManagerUpdatePassword.jsp页面

5)订单管理:

编程详解

从数据库中提取订单的相关信息点击操作栏中的详细信息就可以查询相应订单的详细信息。点击删除就可以删除对应的订单。由OrderServlet处理

6)商品查询:

编程详解

1.点击index.jsp的查询链接BigTypeAction处理

调用DAO包查询数据库,进入查询页面中,点击添加大类别可以进入BigTypeInsert.jsp页面添加大类别。

2. 创建模型组件BookBean.java

为了避免产生路径错误,建议使用配置向导进行struts配置

3. 创建控制器组件TitleBean.javaControl

GetTitles()方法

public List getTitles() {

List titlesList = new List();

String sql = "SELECT * from titles ORDER BY goodsName";

// 获取书籍列表

try {

connection = ConnectionManager.getConnction();

titlesQuery = connection.prepareStatement(sql);

ResultSet results = titlesQuery.executeQuery();

// 读取行数据

while (results.next()) {

BookBean book = new BookBean();

book.setId(results.getString("id"));

book.setGoodsName(results.getString("goodsName"));

book.setBigId(results.getInt("bigId"));

book.setSmallId(results.getInt("smallId"));

book.setImageFile(results.getString("imageFile"));

book.setOriginalPrice(results.getFloat("originalPrice"));

book.setCurrentPrice(results.getFloat("currentPrice"));

book.setIntroduce(results.getString("introduce"));

book.setCreateTime(results.getString("createTime"));

book.setDiscount(results.getInt("discount"));

book.setNumber(results.getInt("number"));

titlesList.add(book);

}

}

为了实现分页,需要获得记录总数,总页数,当前页数,结果集对象列表等

信息。

<%

TitlesBean titlesBean = new TitlesBean();

//调用访问数据库的方法,返回所有书籍的信息列表

List titles = titlesBean.getTitles();

BookBean currentBook;

// store titles in session for further use

//将书籍列表放入会话中,名称为titles

session.setAttribute( "titles", titles );

int pageNumber = titles.size(); // 计算出有多少条记录

int maxPage = pageNumber; // 计算有多少页数

String strNumber = request.getParameter("pageNum");

int number = 0;

if (maxPage % 9 == 0) { //每页显示九个

maxPage = maxPage / 9;

} else {

maxPage = maxPage / 9 + 1;

}

if (strNumber == null) {

number = 0;

} else {

number = Integer.parseInt(strNumber);

}

int start = number *9; //开始条数

int over = (number + 1) * 9; //结束条数

int count = pageNumber - over; //还剩多少条记录

if (count <= 0) {

over = pageNumber;

}

%>

点击图片或书名链接:

<a href =

"displayBook.jsp?id=<%= currentBook.getId() %>">     <%= subStr(currentBook.getGoodsName() + ", " +

currentBook.getOriginalPrice()) %>a>

<A href="displayBook.jsp?id=<%= currentBook.getId() %>"><IMG

height=110 src="/E-Store/images/<%=currentBook.getImageFile() %>" width=90

border=0>A>

(7)商品添加功能

编程详解:

public ActionForward saveGoods(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

UploadFile uploadFile = new UploadFile();

GoodsForm goodsForm = (GoodsForm) form;

String dir = servlet.getServletContext().getRealPath("/images");

FormFile formFile = goodsForm.getFormFile();

String getType = formFile.getFileName().substring(

formFile.getFileName().lastIndexOf(".") + 1);

String result = "添加商品信息失败";

String imageType[] = { "JPG", "jpg", "gif", "bmp", "BMP" };

for (int ii = 0; ii < imageType.length; ii++) {

if (imageType[ii].equals(getType)) { goodsForm.setBigId(Integer.valueOf(request.getParameter("bigId"))); goodsForm.setSmallId(Integer.valueOf(request.getParameter("smallId"))); goodsForm.setGoodsName(request.getParameter("goodsName")); goodsForm.setOriginalPrice(Float.valueOf(request.getParameter("originalPrice"))); goodsForm.setCurrentPrice(Float.valueOf(request.getParameter("currentPrice"))); goodsForm.setIntroduce(request.getParameter("introduce"));

goodsForm.setImageFile("images/"+uploadFile.upload(dir, formFile));

dao.insertGoods(goodsForm);

result = "添加商品信息成功";

}

}

6、开发过程出现的问题及解决方法

问题:在Jsp页面跳转过程中出现的Servlet action is not available错误,Jsp页面不能正确跳转

问题分析:该问题主要出现后台页面中,可能是配置文件struts-config.xml或者是web.xml中路径不匹配产生的问题

解决办法:.项目出错或发生异常时会发生页面跳转错误,后台strutsAction作出响应完成跳转,所以检查struts-config.xmlaction-mapping……片断中的语句中的路径,并且重启Tomcat服务器即可。

问题二:连接数据库有出错 for input String id

问题分析 这主要是在数据库表中定义的数据类型跟你在连接数据库时获取的数据类型不一致。

解决办法:打开相对应的表,修改数据类型即可,然后执行SQL语句,刷新一下。

问题三:后台中不能添加新的商品信息

问题分析:后台添加商品信息,是由GoodDaoGoodAction作出响应,并对数据库进行操作,如果插入信息不成功,主要应该检查它们中间对于插入商品信息的处理是不是出了问题。

解决办法:,修改BooksDao类中的insertGoods方法和BooksAction中的saveGoods方法之后,并对其进行试验。

问题四中文乱码问题

问题分析JSP源文件中很可能包含有中文,而JSP源文件的保存方式是基于字节流的,如果JSP编译过程中,使用的编码方式与源文件的编码不一致,就会出现乱码,而JSP获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。

解决办法

解决这类乱码问题的基本方法是在页面获取参数之前,强制指定

request获取参数的编码方式:

request.setCharacterEncoding(GBK)

request.setCharacterEncoding(gb2312)

如果在JSP将变量输出到页面时出现了中文乱码问题,则可以通过在

页面代码中设置

response.setContentType("text/html;charset=GBK") response.setContentType("text/html;charset=gb2312")

问题:获取当前在线人数出错

问题分析:由于获取在线人数是由ServletOnlineCount类来处理的,如果获取不到当前在线人数或者说获取人数有错,那么首先应该考虑OnlineCount中有没有出错。

解决办法:在OnlineCount类中,对于当前人数统计中的初始值定义有错误,修改过后的代码:

ServletContext context=sce.getServletContext();

Integer counter=new Integer(0);

context.setAttribute("counter", counter);

问题:在后台中添加商城公告信息,添加友情链接等内容时,可能出现乱码

问题分析:每次添加的内容,页面能够获取到,但是输入的是中文字符,却不能识别,说明是编码方式出了问题。

解决办法:由于在前台搜索页面中出现了类似的问题,所以在每个获取添加的新内容的Jsp页面中加上<% request.setCharacterEncoding("GBK");%>语句,但是添加结果依旧是乱码。后来,通过检查和试验,发现是com.mycompany.servlet包中没有文字编码的设置类(EncodingFilter SessionFilter),并且在web.xml配置文件中需要加入编码设置语句:

<filter>

<filter-name>encodingfilter-name>

<filter-class>com.mycompany.servlet.EncodingFilterfilter-class>

<init-param>

<param-name>encodingparam-name>

<param-value>gb2312param-value>

init-param>

filter>

<filter-mapping>

<filter-name>encodingfilter-name>

<url-pattern>/*url-pattern>

filter-mapping>

问题:在导入项目时会出错

问题分析因为后台用到了struts技术,在电脑上没有部署运行坏境。

解决办法先把src包导入到项目中,这时项目会报错,右击项目名,在My Eclipse中选择Add Struts Capabilities……,添加struts 运行坏境,然后再导入WebRoot即可。

本文来源:https://www.2haoxitong.net/k/doc/bad032a5284ac850ad02421e.html

《E-Store系统详细说明.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式