课程设计报告
(本科/专科)
课程:
Javaweb程序设计
学号:
姓名:
班级:
教师:
朱强
时间:
20191118
计算机学院


设计名称:
基于Javaweb的小米商城
设计内容、目的与要求:
内容:
在客户端综合编程实验的基础上,结合JSP&JDBC等技术,完成商城后台管理系统的主体模块(登录、产品、产品信息等),实现相应信息的数据动态显示和后台操作功能,主要包括相关数据库设计以及用户登录功能、产品列表动态数据库表内容列表展示功能、购物车添加及与数据库的后台交互功能等,并能够借助开发工具进行服务端代码调试。
目的:
通过JSP&JDBC的综合运用,掌握中小型Java Web应用系统服务端数据库编程的基本原理和常用技术,具备进行服务端数据库表设计和JSP页面JDBC编程的基本动手能力。具体包括:
1) 编写Java代码,熟悉并掌握JDBC的使用,包括Connection、Statement、PreparedStatement和ResultSet等对象的原理和常用方法;
2) 编写JSP页面,熟悉并掌握JDBC在JSP页面中的应用语法、控制结构,掌握JSP内置对象的使用以及服务端调试技术;
3) 实现JSP&JDBC等服务端编程技术的融汇贯通,掌握对单表和关联关系表进行CRUD等常规数据操作,并达到服务端页面的合理代码布局、动态网页呈现和实时性交互。
要求:
1) 数据库表的合理设计,包括自增主键设计、合理主外键关联设计、基础数据表设计等;
2) JDBC开发包和驱动包的概念和作用,面向接口编程思想的理解;
3) JDBC驱动包在Java Web工程中的引入机制;
4) java.sql.*开发包下Connection、Statement、PreparedStatement、ResultSet等常用JDBC对象的应用;
5) Statement对象和PreparedStatement对象在不同场合的灵活运用,及其发送SQL语句的不同使用方式;
6) ResultSet对象的遍历运用;
7) JDBC编程步骤;
8) JSP JDBC模块编程的开发步骤和基本规范;
9) JSP页面传递请求参数的不同方式,包括表单传递、超链接传递等;
10) JDBC代码嵌入JSP页面,并与前续实验客户端技术相结合,完成客户端与服务端的动态交互效果,并能够进行服务端程序调试。
11) 写出实验报告
计划与进度安排:
1、 创建数据库
1118-1119
小组讨论
2、 设想商城功能
  1119-1120
  小组讨论
3、 编程功能代码
1120-1123
小组分工
4、 测试
1123-1124
设计过程、步骤(可加页):
1、 数据库
1创建数据库代码:
CREATE DATABASE  `MI`
2)创建用户信息表user
CREATE TABLE `users`  (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`upwd` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
3)创建分类信息表type
CREATE TABLE `type`  (
  `typeID` int(11) NOT NULL AUTO_INCREMENT,
  `typename` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`typeID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
4创建商品表
CREATE TABLE `product`  (
  `productID` int(11) NOT NULL AUTO_INCREMENT,
  `productname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `price` decimal(10, 2) NOT NULL,
  `discribe` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `image` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `typeID` int(11) NOT NULL,
  `discribe2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `color` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `num` int(11) NOT NULL,
  `edition` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`productID`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 71 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
2导入实验2,在此基础上开发登陆界面,利用用户表信息实现登录判断,登录成功转向首页,失败给予提示
1    登录界面设计,其样式全部写在style.css
<div class="login_input">
    <input type="text" placeholder="请输入账号" class="login_username" name="username">
    </div>
    <div class="login_input">
    <input type="password" placeholder="请输入密码" class="login_password"  name="password">
</div>
<div class="">
    <input class="login_btn sure" type="button" value="登录" onclick="check()">
    <input class="login_btn cancle" type="reset" value="重置 " >
    </div>
2)判断当用户名和密码为空时,弹出提示信息
function check() {
    form.username.value=="")
    {
    alert("请输入账号!!");
    form.username.focus();
    return false;
    }
form.password.value=="")
    {
    alert("请输入密码!!");
    form.password.focus();
        return false;
            }
        form.submit();
        }
3)判断登录的账号是否在数据库中,建立DBUtil 类,在其中连接数据库
/**
* 数据库连接管理类
*
* @author 502
*
*/
public class DBManager {
    public static final String DEFAULT_PWD = "123456";
    public static final String DEFAULT_UID = "root";
    public static final String DEFAULT_URL = "jdbc:mysql://localhost:3306/mi";
    public static final String DEFAULT_DRIVER = "sql.jdbc.Driver";
    public static Connection getConn() {
        Connection con = null;
        try {
            Class.forName(DEFAULT_DRIVER);
            con = Connection(DEFAULT_URL, DEFAULT_UID, DEFAULT_PWD);
        } catch (ClassNotFoundException e) {
            System.out.println("数据库驱动加载失败");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("数据库连接失败");
            e.printStackTrace();
        }
        return con;
    }
4)建立登录界面判断的servlet为LoginServlet,在其中进行判断输入的用户名和密码是否存在。在其dopost()方法中写入;
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
基于javaweb的美食食谱网站request.setCharacterEncoding("UTF-8");
   
        String uname = Parameter("uname");
        String upwd = Parameter("upwd");
        String code = Parameter("code");
        String remember = Parameter("remember");
   
        boolean result = true;
        User u = new User();
        u.setUname(uname);
        u.setUpwd(upwd);
        HttpSession session = Session();
       
        String code2 = (Attribute("code");
        if(code2.equals(code)){
            UserDAO dao = new UserDAO();
            List<User> users = dao.select(u);
            result = users.size()>0;
            if(!result){
                request.setAttribute("msg", "账号密码错误");
            }
        }else{
            result = false;
            request.setAttribute("msg", "验证码错误");
        }                   
       
        if(result){
            if("remember".equals(remember)){
                String uri = ContextPath() + "/";
                int expiry = 60*60*24*14;
                Cookie c = new Cookie("uname",uname);
                //c.setDomain("");
                c.setPath(uri);
                c.setMaxAge(expiry);
                response.addCookie(c);
                c = new Cookie("upwd", upwd);
                c.setPath(uri);
                c.setMaxAge(expiry);
                response.addCookie(c);
            }
            session.setAttribute("user", u);
3用户表的显示以及增加、更新和删除操作;要求根据实际情况分别采用Statement对象和PreparedStatement对象发送SQL语句;
1)用商品表表的显示,即对数据库查询并显示在界面
在BookDao.java中写出查询所有书籍信息封装到ArrayList中的函数如下
public ArrayList<BookBean> get_ListInfo(){
        ArrayList<BookBean> tag_Array = new ArrayList<BookBean>();
        Connection conn = ConnectDb();
        String sql = "select * from book";
        PreparedStatement stm = null;
        ResultSet rs = null;
        try {
            stm = conn.prepareStatement(sql);
            rs = uteQuery();
            ()){
                BookBean tag = new BookBean();
                tag.String("num"));
                tag.String("sname"));
                tag.String("author"));
                tag.String("press"));
                tag.String("type"));               
                tag.Int("price"));
                tag_Array.add(tag);            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            DBUtil.CloseDB(rs, stm, conn);}return tag_Array;    }
在shouye.jsp中获取ArrayList中封装的内容,并显示在页面上
<%
            ArrayList<BookBean> bookdata = new ArrayList<BookBean>();
              bookdata = (ArrayList<BookBean>)Attribute("data");
              if(bookdata==null){
              BookDao bookdao = new BookDao();
              bookdata = (ArrayList<BookBean>)_ListInfo(); }
  for (BookBean bean : bookdata){ %>               
<tr bgcolor="#FFFFFF">                   
        <td><p align="center"><%= um()%></p></td>
        <td><p align="center"><%= sname()%></p></td>
        <td><p align="center"><%= Autho()%></p></td>
        <td><p align="center"><%= Press()%></p></td>
        <td><p align="center"><%= Type()%></p></td> 
        <td><p align="center"><%= price()%></p></td>
<td><p align="center"><a href="updata.jsp"><img alt=""src="img/updata-02.jpg">
</a>
<button type="button"  onclick="deletebook(<%= um()%>)">删除</button></p></td></tr>
                      <%} %>
2)增加界面
在增加书籍界面“input.jsp”中,在表单中action="/text5/IndexServlet",在IndexServlet中的dopost()方法改写如下
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//        doGet(request, response);
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //获取表单信息
        String num = Parameter("num");
        String bookname = Parameter("bookname");
        String writer = Parameter("writer");
        String select = Parameter("select");
        String type = Parameter("type");
        int money = Integer.Parameter("money"));
        BookDao bookdao = new BookDao();
        bookdao.addBook(num,bookname,writer,select,type,money);
        response.sendRedirect("/text5/show.jsp");
    }
结果与分析(可以加页):
(1) 当不输入账号和密码时弹出提示,如下图1所示:
1:提示信息
(2) 输入错误的账号或密码,界面上有密码错误的字样,要重新输入账号和密码,如下图2所示:
2:密码错误重新输入界面
(3) 正确输入,进入主界面;如下图3所示:
3:主界面
(4) 点击购物车管理,进入其界面,如下图4所示:
         
设计体会与建议:
问题分析:
1)问题一:
解决办法:在进行数据库查询时,输入有误不到“sa”列,
“Unknown column 'sa' in 'where clause'”类似于Unknown column ‘xxx’ in ‘where clause’的问题。 单从字面理解,我们很容易得出列名不存在的结论,但是,很多时候起始并不是由于列名出错造成的。而是由于拼凑sql语句时对字符类型数据没有用引号引起来造成的。
2)问题二:
解决办法:
这是服务器连接的问题,可能是你的在连接connection的时候有问题,比如说
1、本来没关就又开了一次
2、或者是没有连接
3、或者连接了没有连接成功
我的情况是第一种:
3)问题三
解决办法:
404问题,根本原因就是服务器不到目标页面(或者说成不到目web资源)而产生的。既然不到资源,那么很大原因就是访问路径或者XML的配置的出了问题。
第一个方法:检查表单的action属性中路径是否正确,是否有因为粗心而打错的字。
第二个方法:a标签中路径是否正确。
第三个方法:.XML是否配置正确,如果正确无任何问题,很可能就是已经选择了servlet的在XML中自动配置。而又在XML配置了一遍,于是就会报错
在编写Servlet的时候是选择创建Servlet文件,所以创建后Servlet文件中会产生着样的一串代码:@WebServlet("/InitServlet"),这说明在XML文件中就不用再配置对应的Servlet文件了。可我们在XML中还是写了,所以就产生了报错。
当我们把.xml标签删除之后就,程序就可以正常运行了。
2总结:
该程序虽说几乎可以运行成功,总的来说,对于我们能力有限的同学,做出这样一个程序实属不易,所以自己觉得总体上来说还好,但是还有很多不足之处。另外,这个商城系统刚还需要一个后台管理来配套,才能实现一个完整的管理系统,可以后期完善一下。