基于JavaWeb的土特产销售购物商城的设计与实现

news2024/11/6 7:10:48

1.引言

随着互联网技术的不断发展,电子商务已成为一种重要的经济活动形式。土特产作为传统文化的代表之一,在旅游业中具有非常重要的地位。因此,将土特产销售与电子商务相结合,建立一个基于JavaWeb的土特产销售购物商城,将有利于扩大土特产销售渠道,推广土特产文化。

本篇论文将介绍一个基于JavaWeb的土特产销售购物商城的设计与实现。首先,我们将介绍该商城的需求分析,包括商城功能和用户角色等方面。然后,我们将基于MVC模式设计商城的系统架构,并详细描述每个模块的功能和交互流程。接下来,我们将介绍商城的数据库设计和使用JDBC API进行数据访问的实现。最后,我们将通过部署商城到Tomcat服务器并测试商城的功能完整性和稳定性来验证商城的功能。

总之,通过本篇论文的介绍,读者将了解到如何使用JavaWeb技术开发一个土特产销售购物商城,并掌握相关的设计和实现方法。

2.开发技术

2.1 JSP技术

JSP(JavaServer Pages)是一种动态网页开发技术,与Servlet紧密相关。JSP使得开发人员可以将Java代码嵌入HTML页面中,以此来生成动态内容。

JSP使用JSP标签来控制页面的逻辑处理和显示。这些标签允许开发人员嵌入Java代码、JSTL标签库或自定义标签。

在JSP被服务器请求时,它们首先被翻译成Servlet,然后Servlet容器负责运行Servlet。因此,JSP的运行方式与Servlet非常类似。

JSP的优点包括:

  • 简化了Web应用程序的开发:JSP允许开发人员将Java代码嵌入到HTML页面中,极大地简化了Web应用程序的开发过程。
  • 可以重用代码:JSP可以调用Java Bean组件、自定义标签和其他Java类,这样可以重用现有的Java代码。
  • 更好的可读性:JSP的代码比传统的Servlet更易于阅读和维护,因为它们减少了Java代码和HTML标记之间的混合。

但是,JSP也存在一些缺点。例如,当JSP变得复杂时,难以维护;还可能出现安全问题,需要进行严格的输入验证和过滤才能防止跨站点脚本攻击等问题。

2.2 Servlet

Servlet是一种Java技术,它允许开发人员编写动态Web应用程序。Servlet主要用于处理HTTP请求和响应,从而生成动态内容。

Servlet是由Servlet容器(例如Tomcat或Jetty)负责运行的。当客户端(通常是Web浏览器)向服务器发送请求时,Servlet容器就会调用相应的Servlet来处理请求。Servlet可以读取请求数据、执行逻辑处理,并输出响应数据。

与JSP类似,Servlet可以使用Java语言进行编写。但与JSP不同的是,Servlet完全没有HTML代码,而是完全由Java代码构成。因此,Servlet通常比JSP更灵活和高效。

Servlet的优点包括:

  • 可以生成动态内容:Servlet可以根据请求参数、会话状态等动态生成页面内容。这使得开发人员可以开发出更为灵活的Web应用程序。
  • 没有特定的模板语言:由于Servlet完全由Java代码组成,因此它不使用任何特定的模板语言。这意味着开发人员可以使用他们喜欢的任何Java库和框架。
  • 更具可维护性:Servlet代码通常比JSP代码更易于维护,因为它们更容易阅读和测试,并且由于没有HTML代码,因此它们不太容易混淆。

然而,Servlet也存在一些缺点。例如,开发Servlet可能需要更多的Java编程知识;相对于JSP,它们可能需要更多的网络和Web编程知识。另外,因为Servlet没有内置的模板语言,因此生成HTML代码可能更加复杂。

2.3 Mysql数据库

MySQL是一种开源的关系型数据库管理系统(RDBMS),它由瑞典MySQL AB公司开发并维护。MySQL被广泛应用于Web开发中,因为它易于使用、可扩展性强、支持多个平台,并且具有高性能。

MySQL的特点包括:

  • 开源:MySQL是一种开源软件,可以在GNU通用公共许可证(GPL)或商业许可证下使用。
  • 可伸缩性:MySQL可以轻松扩展到任何规模,可以通过添加更多服务器实现水平扩展或垂直扩展来增加单个服务器的处理能力。
  • 高性能:MySQL是一个高性能的关系型数据库,可以快速处理大量数据和复杂查询。
  • 安全:MySQL提供了安全的认证和授权功能,可以确保只有授权用户才能访问敏感数据。
  • 多平台支持:MySQL可运行于Windows、Linux、UNIX等多个操作系统上。

除了以上特点,MySQL还有以下几个重要的方面:

  • 数据库类型:MySQL支持多种不同的数据类型,包括整数、浮点数、字符串、日期和时间等。
  • SQL支持:MySQL支持SQL(结构化查询语言),这是一种广泛使用的标准查询语言,用于管理和查询关系型数据库中的数据。
  • 存储引擎:MySQL支持多个存储引擎,包括InnoDB、MyISAM等。每个引擎具有不同的优点和适用范围。
  • 可扩展性:MySQL可以通过添加插件或自定义函数来扩展其功能。

总之,MySQL是一种可靠、高性能、易于使用、多平台支持的关系型数据库管理系统,适用于广泛的Web应用程序和企业应用程序。

2.4 JDBC

JDBC(Java Database Connectivity)是一种用于在Java应用程序和数据库之间进行通信的API。它提供了一种标准化的方法来连接不同类型的数据库,并使用SQL语句查询和更新数据。

JDBC的主要优点包括:

  • 可移植性:JDBC API定义了一组标准接口,这些接口可以与多个数据库管理系统(DBMS)进行通信。由于JDBC API是标准化的,因此应用程序可以轻松地从一个DBMS转换到另一个DBMS。
  • 安全性:JDBC提供了多种安全机制,例如加密传输、身份验证和授权等,以保护敏感数据免受未经授权的访问。
  • 简单易用:JDBC API是易于理解和使用的,开发人员可以通过简单的API调用来执行各种数据库操作,例如执行查询、插入、更新和删除等操作。
  • 高性能:JDBC API具有良好的性能,在处理大量数据时表现出色。

基本上,JDBC API定义了一组Java类和接口,这些类和接口提供了一种标准方法来连接数据库、发送SQL语句并处理结果集。JDBC API还为连接池、事务、批处理和元数据等功能提供了支持。

虽然JDBC是强大而灵活的API,但使用JDBC仍然需要一定的Java编程知识。许多Java框架和开发工具(例如Spring、Hibernate等)都为了简化JDBC编程而提供了更高级别的抽象。这些框架和工具使得数据库交互变得更加容易,同时提供了额外的功能和便利性。

3.功能设计

系统分为前台用户和后台管理员两部分。

前台用户功能:

(1)用户登录

(2)用户注册

(3)用户查看商品

(4)用户搜索商品

(5)商品加入购物车

(6)商品结算支付确认

(7)我要留言及反馈查看

(8)对商品进行评论

(9)个人信息查看修改

(10)下单信息查看

(11)新闻资讯查看

后台管理员功能:

(1)登录

(2)密码修改

(3)新闻资讯管理

(4)商品分类管理

(5)商品信息管理

(6)订单信息管理

(7)注册用户信息管理

(8)评论留言管理

(9)留言反馈管理

(10)数据统计管理

4.功能效果图

4.1 客户端

4.1.1 首页

首页包含了导航栏、土特产产品信息及其尾部构成。整体设计以绿色为主,突出整体的特产是纯天然无公害的主题。

 4.1.2 商品信息

商品信息是展示商城的全部特产信息,可以查看总计多少条信息,进行上一页下一页等切换,并且能够点击进入查看每个商品的详情信息。

 

 4.1.3 热销推荐

 热销推荐展示的后台想要主推和客户感兴趣的产品,帮助购买者查看筛选,快速定位到平台的热销产品,方便购买。

 4.1.4 全部分类

全部分类是用来提供通过分类筛选商品的入口,点击全部会展示所有特产信息,如果想要精准查找某一个分类的特产信息,可以点击对应商品,列表即可筛选出想要的列表信息。

 4.1.5 商品查询

商品查询按照价位、分类、名称等条件快速帮助客户筛选商品,在输入完成后点击立即提交即可出现你想要的查找范围的商品信息。

 4.1.6 新闻资讯

新闻资讯是将各类注意事项、想要呈现给顾客的信息进行展示,让客户对平台更了解更信任。

  4.1.7 购物车及下单

购物车是平台的核心功能,客户查看筛选商品的目的是为了购买,但是为了下单方便好筛选都会全部先把感兴趣的放在购物车,后面再统一进行下单支付。在商品加购时,用户必须是登录状态才可以。

输入姓名、地址、电话即可提交生成订单,完成支付即可。(这里使用的是模拟支付)

 

4.1.8 我要留言

我要留言是用户对平台进行留言,询问自己想要知道了解的东西,在后台管理员对留言信息回复后也可以看到反馈内容。

4.1.9 会员中心

会员中心可以查看个人信息、修改密码、查看订单及查看留言操作。

4.2 后台管理员端

4.2.1 首页

用户登录成功后进入到后台管理端首页,分为左边菜单栏,顶部信息栏及其主体内容部分。在首页会提示代发货订单信息。

 4.2.2 商品信息管理

商品信息管理主要包含了增加分类、查看分类、修改删除分类,增加商品信息、查看商品信息、修改删除商品信息。

4.2.3 注册用户管理

 注册用户管理包括用户信息查看、用户信息查看。

 4.2.4 订单信息管理

订单信息管理包块订单信息管理、查看订单信息。主要能够对其进行查看、发货、删除等操作。

5.核心代码

public class AdminServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public AdminServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType(Constant.CONTENTTYPE);
		request.setCharacterEncoding(Constant.CHARACTERENCODING);
		String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
		String date2=new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
		try{
			String method=request.getParameter("method").trim();
			ComBean cBean = new ComBean();
			HttpSession session = request.getSession();   
			if(method.equals("one")){//用户登录
				String username = request.getParameter("username");
				String password = request.getParameter("password");  
					String str=cBean.getString("select realname from admin where username='"+username+"' and  password='"+password+"'  ");
					if(str==null){
						request.setAttribute("message", "登录信息错误!");
						request.getRequestDispatcher("admin/login.jsp").forward(request, response); 
					}
					else{
						session.setAttribute("user", username);  
						request.getRequestDispatcher("admin/index.jsp").forward(request, response); 
					}  
			}
			else if(method.equals("uppwd")){//修改密码
				String username=(String)session.getAttribute("user"); 
				String oldpwd = request.getParameter("oldpwd"); 
				String newpwd = request.getParameter("newpwd"); 
				String str=cBean.getString("select id from admin where username='"+username+"' and  password='"+oldpwd+"'");
				if(str==null){
					request.setAttribute("message", "原始密码信息错误!");
					request.getRequestDispatcher("admin/system/editpwd.jsp").forward(request, response); 
				}
				else{
					int flag=cBean.comUp("update admin set password='"+newpwd+"' where username='"+username+"'");
					if(flag == Constant.SUCCESS){ 
						request.setAttribute("message", "操作成功!");
						request.getRequestDispatcher("admin/system/editpwd.jsp").forward(request, response); 
					}
					else { 
						request.setAttribute("message", "操作失败!");
						request.getRequestDispatcher("admin/system/editpwd.jsp").forward(request, response); 
					}
				}
			}
			else if(method.equals("adminexit")){//退出登录
				session.removeAttribute("user");  session.removeAttribute("sf");  
				request.getRequestDispatcher("index.jsp").forward(request, response); 
			}
			else if(method.equals("addm")){//增加系统用户
				String username = request.getParameter("username"); 
				String password = request.getParameter("password"); 
				String realname = request.getParameter("realname"); 
				String sex = request.getParameter("sex"); 
				String age = request.getParameter("age"); 
				String address = request.getParameter("address"); 
				String tel = request.getParameter("tel");
				String str=cBean.getString("select id from admin where username='"+username+"'");
				if(str==null){ 
						int flag=cBean.comUp("insert into admin(username,password,realname,sex,age,address,tel,addtime) " +
								"values('"+username+"','"+password+"','"+realname+"','"+sex+"','"+age+"','"+address+"','"+tel+"','"+date2+"')");
						if(flag == Constant.SUCCESS){ 
							request.setAttribute("message", "操作成功!");
							request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
						}
						else { 
							request.setAttribute("message", "操作失败!");
							request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
						} 
				}
				else{
					request.setAttribute("message", "该用户名已存在!");
					request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
				} 
			}
			else if(method.equals("upm")){//修改系统用户
				String id = request.getParameter("id");
				String password = request.getParameter("password");
				String realname = request.getParameter("realname"); 
				String sex = request.getParameter("sex"); 
				String age = request.getParameter("age"); 
				String address = request.getParameter("address"); 
				String tel = request.getParameter("tel"); 
				int flag=cBean.comUp("update admin set password='"+password+"',realname='"+realname+"',sex='"+sex+"',age='"+age+"'," +
						"address='"+address+"',tel='"+tel+"' where id='"+id+"'");
				if(flag == Constant.SUCCESS){ 
					request.setAttribute("message", "操作成功!");
					request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
				}
				else { 
					request.setAttribute("message", "操作失败!");
					request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
				}
			}
			else if(method.equals("delm")){//删除系统用户
				String id = request.getParameter("id");  
				int flag=cBean.comUp("delete from admin where id='"+id+"'");
				if(flag == Constant.SUCCESS){ 
					request.setAttribute("message", "操作成功!");
					request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
				}
				else { 
					request.setAttribute("message", "操作失败!");
					request.getRequestDispatcher("admin/system/index.jsp").forward(request, response); 
				}
			} 
			else if(method.equals("upm2")){//修改系统用户
				String username=(String)session.getAttribute("user");
				String realname = request.getParameter("realname"); 
				String sex = request.getParameter("sex"); 
				String age = request.getParameter("age"); 
				String address = request.getParameter("address"); 
				String tel = request.getParameter("tel"); 
				int flag=cBean.comUp("update admin set realname='"+realname+"',sex='"+sex+"',age='"+age+"'," +
						"address='"+address+"',tel='"+tel+"' where username='"+username+"'");
				if(flag == Constant.SUCCESS){ 
					request.setAttribute("message", "操作成功!");
					request.getRequestDispatcher("admin/system/index2.jsp").forward(request, response); 
				}
				else { 
					request.setAttribute("message", "操作失败!");
					request.getRequestDispatcher("admin/system/index2.jsp").forward(request, response); 
				}
			}
			else{//无参数传入转到错误页面
				request.getRequestDispatcher("error.jsp").forward(request, response);
			}
		}catch(Exception e){
			e.printStackTrace();
			request.getRequestDispatcher("error.jsp").forward(request, response);
		}
		
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
public class MemberServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public MemberServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType(Constant.CONTENTTYPE);
		request.setCharacterEncoding(Constant.CHARACTERENCODING);
		HttpSession session = request.getSession();
		ComBean cBean = new ComBean();
		String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
		String date2=new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
		String method = request.getParameter("method");
		if(method.equals("mreg")){ //用户注册
			String username = request.getParameter("username"); 
			String password = request.getParameter("password"); 
			String realname = request.getParameter("realname"); 
			String sex = request.getParameter("sex"); 
			String age = request.getParameter("age"); 
			String tel = request.getParameter("tel"); 
			String email = request.getParameter("email");
			
			if(username.equals("admin")){
				request.setAttribute("message", "非法的用户名!");
				request.getRequestDispatcher("reg.jsp").forward(request, response); 
			}
			else{
				String str=cBean.getString("select id from member where username='"+username+"'");
				if(str==null){
					int flag=cBean.comUp("insert into member(username,password,realname,sex,age,tel,email,regtime) " +
							"values('"+username+"','"+password+"','"+realname+"','"+sex+"','"+age+"','"+tel+"','"+email+"','"+date2+"')");
					if(flag == Constant.SUCCESS){ 
						request.setAttribute("message", "注册成功请登录!");
						request.getRequestDispatcher("login.jsp").forward(request, response); 
					}
					else { 
						request.setAttribute("message", "操作失败!");
						request.getRequestDispatcher("reg.jsp").forward(request, response); 
					}
				}
				else{
					request.setAttribute("message", "该用户名已存在!");
					request.getRequestDispatcher("reg.jsp").forward(request, response); 
				} 
			}
			
		}
		else if(method.equals("mupreg")){ //用户修改注册资料
			String member=(String)session.getAttribute("member"); 
			String realname = request.getParameter("realname"); 
			String sex = request.getParameter("sex"); 
			String age = request.getParameter("age"); 
			String tel = request.getParameter("tel"); 
			String email = request.getParameter("email"); 
			int flag=cBean.comUp("update member set realname='"+realname+"',sex='"+sex+"',age='"+age+"'," +
					"tel='"+tel+"',email='"+email+"' where username='"+member+"'");
			if(flag == Constant.SUCCESS){ 
				request.setAttribute("message", "操作成功!");
				request.getRequestDispatcher("member/info/index.jsp").forward(request, response); 
			}
			else { 
				request.setAttribute("message", "操作失败!");
				request.getRequestDispatcher("member/info/index.jsp").forward(request, response); 
			}
		}
		else if(method.equals("mlogin")){//用户登录 代码都有注释的哦 
			String username = request.getParameter("username"); 
			String password = request.getParameter("password");   
				String str=cBean.getString("select id from member where username='"+username+"' and  password='"+password+"' and ifuse='在用'");
				if(str==null){
					request.setAttribute("message", "登录信息错误!");
					request.getRequestDispatcher("login.jsp").forward(request, response); 
				}
				else{
					session.setAttribute("member", username); 
					request.getRequestDispatcher("member/index.jsp").forward(request, response); 
				} 
		}
		else if(method.equals("lost")){ //丢失密码
			String username = request.getParameter("username"); 
			String str=cBean.getString("select id from member where username='"+username+"' and ifuse='在用'");
			if(str==null){
				request.setAttribute("message", "无此用户或已经被管理员停用!");
				request.getRequestDispatcher("login.jsp").forward(request, response); 
			}
			else{
				cBean.comUp("update member set password='111' where username='"+username+"'");
				request.setAttribute("message", "新密码为111,请登录后修改!");
				request.getRequestDispatcher("index.jsp").forward(request, response);
			}  
		}
		else if(method.equals("memberexit")){ //退出登录
			session.removeAttribute("member");
			request.getRequestDispatcher("index.jsp").forward(request, response);
		}
		else if(method.equals("muppwd")){//用户修改密码
			String member=(String)session.getAttribute("member"); 
			String oldpwd = request.getParameter("oldpwd"); 
			String newpwd = request.getParameter("newpwd"); 
			String str=cBean.getString("select id from member where username='"+member+"' and  password='"+oldpwd+"'");
			if(str==null){
				request.setAttribute("message", "原始密码信息错误!");
				request.getRequestDispatcher("member/info/editpwd.jsp").forward(request, response); 
			}
			else{
				int flag=cBean.comUp("update member set password='"+newpwd+"' where username='"+member+"'");
				if(flag == Constant.SUCCESS){ 
					request.setAttribute("message", "操作成功!");
					request.getRequestDispatcher("member/info/editpwd.jsp").forward(request, response); 
				}
				else { 
					request.setAttribute("message", "操作失败!");
					request.getRequestDispatcher("member/info/editpwd.jsp").forward(request, response); 
				}
			}
		}
		/管理员操作
		else if(method.equals("delm")){//删除用户
			String id = request.getParameter("id");  
			int flag=cBean.comUp("delete from member where id='"+id+"'");
			if(flag == Constant.SUCCESS){
				request.setAttribute("message", "操作成功!");
				request.getRequestDispatcher("admin/member/index.jsp").forward(request, response); 
			}
			else{
				request.setAttribute("message", "操作失败!");
				request.getRequestDispatcher("admin/member/index.jsp").forward(request, response); 
			}
		}
		else if(method.equals("ifusem")){//停用/在用 用户
			String id = request.getParameter("id");  
			String sql="";
			String str=cBean.getString("select ifuse from member where id='"+id+"'");
			if(str.equals("在用")){
				sql="update member set ifuse='停用' where id='"+id+"'";
			}
			else{
				sql="update member set ifuse='在用' where id='"+id+"'";
			}
			int flag=cBean.comUp(sql);
			if(flag == Constant.SUCCESS){
				request.setAttribute("message", "操作成功!");
				request.getRequestDispatcher("admin/member/index.jsp").forward(request, response); 
			}
			else{
				request.setAttribute("message", "操作失败!");
				request.getRequestDispatcher("admin/member/index.jsp").forward(request, response); 
			}
		}
		
		 
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
public final class Common {
	字符串 HTML 转换
	public static String turn(String str) {
	
		while (str.indexOf("\n") != -1) {
			str = str.substring(0, str.indexOf("\n")) + "<br>"
					+ str.substring(str.indexOf("\n") + 1);
		}
		while (str.indexOf(" ") != -1) {
			str = str.substring(0, str.indexOf(" ")) + "&nbsp;"
					+ str.substring(str.indexOf(" ") + 1);
		}
		return str;
	}
	
	/返回日期  当前日期传入0  一年之前传入-1 三年后传入3
	public static String getDate(int num){
	
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		c.add(Calendar.YEAR, num);
		
		return df.format(c.getTime());
	}
	
	/数据库输出字符串的过滤
	public static String SQLStr(String str){
	
		if(str != null && str.length()>1 && str.substring(0,1).equals("?")){
			str = str.substring(1);
		}
				
		if(str == null || str.equals("") || str.equals(" ")){
			str = "&nbsp;";
		}
		return str;
	} 
	/过滤空格
	public static String PageStr(String str){
	
		if(str==null || str.trim().equals("") || str.equals(" ")||str.equals("null")){
			str = "";
		}
		str = str.trim();
		return str;
	}
	/格式化日期	
	public static String formatRZ(String oldDate){
	
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Date Date = new Date(oldDate);
		return df.format(Date);
	}
	
	汉化
	public static String toChineseAndTrim(String str){
	
		if(str==null){
			str="";
		}
		try{
			byte b[]=str.getBytes("iso-8859-1");
			str=new String(b);
			str=str.trim();
		}catch(Exception e){
			e.printStackTrace();
		}
		return str;
	}
}
public class DBO {

	private Connection conn;
	private Statement stmt;
  	private DataSource ds;
	
	public DBO()
	{
	}

	/**
		打开数据库
	*/
	public void open() 
	{
		try 
		{
			Class.forName("com.mysql.jdbc.Driver"); 
			conn=DriverManager.getConnection("jdbc:mysql://localhost/dg?useUnicode=true&characterEncoding=utf-8","root","root"); 
			stmt=conn.createStatement();
		} 
		catch (Exception ex) 
		{
		System.err.println("打开数据库时出错: " + ex.getMessage());
		}
	}

	/**
		关闭数据库,将连接返还给连接池
	*/
	public void close() 
	{
		try 
		{
		
				
		//	connMgr.freeConnection("java", conn);
			conn.close();
		} 
		catch (SQLException ex) 
		{
			System.err.println("返还连接池出错: " + ex.getMessage());
		}
	}

	/**
		执行查询
	*/
	public ResultSet executeQuery(String sql) throws SQLException
	{
		ResultSet rs = null;
		

		rs = stmt.executeQuery(sql);
		return rs;
	}

	/**
		执行增删改
	*/
	public int executeUpdate(String sql) throws SQLException
	{
		int ret = 0;
		
	
		ret = stmt.executeUpdate(sql);
	
		return ret;
	}

	/**
		将SQL语句加入到批处理
	*/
	public void addBatch(String sql) throws SQLException 
	{
		stmt.addBatch(sql);
	}

	/**
		执行批处理
	*/
	public int [] executeBatch() throws SQLException 
	{
		boolean isAuto=conn.getAutoCommit();
		
		conn.setAutoCommit(false);
		int [] updateCounts = stmt.executeBatch();
		
//		conn.commit();
		
//		conn.setAutoCommit(isAuto);
		//conn.setAutoCommit(true);
		return updateCounts;
	}
	public boolean getAutoCommit() throws SQLException
	{
		return conn.getAutoCommit();
	}
	public void setAutoCommit(boolean auto)  throws SQLException 
	{
		conn.setAutoCommit(auto);
	}
	
	public void commit() throws SQLException 
	{
		conn.commit();
//		this.close();
	}
	public void rollBack() throws SQLException 
	{
		conn.rollback();
//		this.close();
	}
	
}

7.总结

本项目基于JavaWeb技术,采用MVC结构模式,使用了JSP、Servlet等技术,通过html、css等前端技术实现了页面布局。实现了以下功能:

(1)用户注册、登录和会员中心管理。

(2)商品分类和商品搜索功能。

(3)商品加入购物车和下订单功能。

(4)用户查看订单、确认收货、删除订单等功能。

(5)用户可以浏览其他用户发布的商品,并进行评论。

(6)平台管理员可以发布、删除商品、管理用户信息和订单信息等。

在项目中的开发中遇到了以下问题:

(1)权限管理问题:在项目中需要对用户、管理员进行权限区分,需要对不同的权限角色进行相应的操作限制。

(2)产品分类的层级结构问题:在进行产品分类的设计过程中,需要考虑到不同的产品分类具有不同的层级结构,需要对分类进行递归处理。

(3)数据库设计问题:在进行数据库设计时,需要考虑到数据的存储和读取效率问题,以及数据的冗余问题。

在项目实现过程中,通过查阅资料,技术学习,沉浸式解决BUG,自己在编码方便有了一定水平提高,在一定程度上实现了项目的开发和完成。

喜欢的可以点赞收藏加关注私信作者沟通交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java进阶—代码演示多线程的生命周期

前言 回顾一下 到现在&#xff0c;我们已经知道了 线程的三种创建方式及其选择线程的常用方法线程的安全问题以及线程的死锁线程之间的通信&#xff08;等待唤醒&#xff09; 今天&#xff0c;我们一起来看看线程的生命周期&#xff0c;生命周期这个词在后续的javaweb 相关知…

【论文系列解读】LLM构建通用视觉(SUR-Adapter)声音模型(Tango)

通用视觉&音频模型的思考 0. 视觉(Diff)怎么和多模态结合(0) 总结(1) 关键技术(1-1) LangChain(1-2) **Versatile Diffusion**(1-3) Tango(1-4) SUR-adapter 1. SUR-Adapter(0) 总结(1) 摘要(2) 相关工作(2-1) 文图生成 & LLM(2-2) 语义理解和推理数据集(2-2-1) 数据收…

【案例教程】环境多介质逸度模型实践技术与典型案例【代码】应用

【原文链接】&#xff1a;【案例教程】环境多介质逸度模型实践技术与典型案例【代码】应用https://mp.weixin.qq.com/s/i8BpApcz1p4Ua6bytxhGwA 内容简要&#xff1a;【注&#xff1a;提供以下模型所有教程】 专题一&#xff1a;基本理论 1.逸度的定义 2.逸度模型的基本原理…

蓝牙音箱中应用的国产蓝牙芯片

蓝牙音箱指的是内置蓝牙芯片&#xff0c;以蓝牙连接取代传统线材连接的音响设备&#xff0c;通过与手机平板电脑和笔记本等蓝牙播放设备连接&#xff0c;达到方便快捷的目的。蓝牙音箱以便携音箱为主&#xff0c;外形一般较为小巧便携&#xff0c;蓝牙音箱技术也凭借其方便人的…

AI绘画中的负面词 是如何正确使用以及发挥作用

Stable Diffusion的艺术或图像生成&#xff0c;有些参数是必不可少的&#xff0c;其中之一就是负提示。本次将深入解析稳定扩散中的负提示是什么&#xff0c;如何使用这个参数来生成高质量的图像。 文章目录 negative prompt如何正确使用&#xff1f;正面词控制通过负面词控制 …

IP地址、MAC地址、互联网、WLAN、运营商、子网掩码、网络地址、网段、网关、集线器、光纤、基站

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

从2PC和容错共识算法讨论zookeeper中的Create请求 | 京东云技术团队

最近在读《数据密集型应用系统设计》&#xff0c;其中谈到了zookeeper对容错共识算法的应用。这让我想到之前参考的zookeeper学习资料中&#xff0c;误将容错共识算法写成了2PC&#xff08;两阶段提交协议&#xff09;&#xff0c;所以准备以此文对共识算法和2PC做梳理和区分&a…

近日网上传出消息,ARM正与Intel共同开发制造芯片

近日网上传出消息&#xff0c;ARM正与Intel共同开发制造芯片&#xff0c;让芯片设计者能够基于Intel 18A制程打造低功耗的SoC。另有多位业内人士透露&#xff0c;这次制造的芯片将主要用于移动设备、笔记本电脑、数据中心等。 若这一消息属实&#xff0c;会对中国芯片行业带来…

常见的SQL优化方案

1. insert优化 1.1 批量插入 我们之前插入数据都是一条一条插入的&#xff0c;会导致频繁操作数据库&#xff0c;从而影响性能。比如遍历某个集合&#xff0c;然后逐个使用insert语句插入数据库表中 INSERT INTO table (name, age) VALUES (张三, 18); INSERT INTO table (na…

6-js基础-3

JavaScript 基础 - 3 知道什么是数组及其应用的场景&#xff0c;掌握数组声明及访问的语法&#xff0c;具备利用数组渲染柱形图表的能力 今日重点&#xff1a; 循环嵌套数组综合案例 今日单词&#xff1a; 循环嵌套 利用循环的知识来对比一个简单的天文知识&#xff0c;我们…

arcpy制作脚本工具相关(制作并添加脚本工具、脚本工具消息提示、arcpy工具自动获取数据)

前言 采用arcpy制作arcgis的脚本工具&#xff0c;记录如下。 一、脚本工具的制作 制作脚本工具分为两步&#xff1a; 1、先编写对应功能的python脚步 2、将对应功能的脚本修改为&#xff0c;能自己手动选择输入输出数据的脚本 3、将修改完的脚本添加到工具箱 1、编写代码 我…

618种草观察丨益生菌「蓝」在一起,酸奶「地域控」?

2023年的“618”&#xff0c;食饮行业中&#xff0c;种草战线格外热闹&#xff0c;品牌花式“开屏”&#xff0c;吸引消费者。 数说故事发布「SMI社媒心智品牌榜」&#xff0c;本期持续关注健康食品&#xff0c;也新增了今夏网红酸奶行业&#xff0c;一起看看这两大赛道中&…

使用power rail连接secondary pg pin的方法

过往文章&#xff1a; secondary pg pin的作用与连接 之前写到过secondary pg pin的种类与几种连接方式&#xff0c;其中使用最多的方法是NDR rule &#xff0b; route_group的方式&#xff0c;这样工作量少&#xff0c;不容易出错&#xff0c;但也有弊端&#xff0c;那就是一…

ctfshow web入门 内网渗透篇

web859 首先ssh连接上之后传个fscan上去&#xff0c;扫描下内网靶机 发现.5和.6的比较可疑。 一个存在web服务&#xff0c;一个存在445端口。 先看下445端口&#xff0c;靶机给我们提供了msf&#xff0c;所以直接用msf打下Samba msfconsole use exploit/linux/samba/is_kno…

数字贸易下转口贸易企业如何高效管理?

什么是转口贸易&#xff1f;是指企业在国内购买进口货物&#xff0c;经过加工、组装、包装等方式改变其性质&#xff0c;再出口到海外市场的贸易活动。这种贸易方式对于促进国际贸易和提高企业竞争力都有着非常重要的作用&#xff0c;但同时也存在着一些风险和难点&#xff0c;…

如何向领导建议数字化转型应着手数据治理?_光点科技

在当今数字化时代&#xff0c;企业的数字化转型已经成为一个迫切的任务。然而&#xff0c;数字化转型不仅仅涉及技术的引入&#xff0c;更需要在数据治理方面进行全面的改进。 一、数据治理是数字化转型的基石。 数据是企业最重要的资产之一&#xff0c;通过对数据的管理和利用…

电气工程师日常工作常遇到的41种接线方法(二)

021 缘耐压测试仪线路 这种绝缘耐压测试仪可测灯具&#xff0c;将待测灯具与A、B两接线柱接好&#xff0c;按下按钮SB1&#xff0c;中间继电器KA1得电并自锁&#xff1b;然后将调压器VT(1∶10&#xff0c;输出0~250V)调至需测的电压值&#xff0c;如需调到1500V则将VT调到电压…

第四章.­ ­ Feasibility of Learning

第四章. Feasibility of Learning 本章主要介绍机器学习的可行性&#xff0c;讨论问题是否可以使用机器学习来解决。 4.1 Learning is Impossible 1.示例描述 1).九宫格样本类型的预测描述&#xff1a; 图中有6个样本&#xff0c;分成两个类别&#xff08;1和-1&#xff09…

pytorch搭建VGG网络

pytorch搭建VGG网络 CNN 感受野VGG-16搭建VGG网络model.pytrain.pypredict.py VGG 网络的创新点&#xff1a;通过堆叠多个小卷积核来替代大尺度卷积核&#xff0c;可以减少训练参数&#xff0c;同时能保证相同的感受野。 例如&#xff0c;可以通过堆叠两个 33 的卷积核替代 5x5…

SpringSecurity6.0+Redis+JWT基于token认证功能开发(可用于实际生产项目,保证API安全)

基于token认证功能开发 引子&#xff1a;最近做项目时遇到了一个特殊的需求&#xff0c;需要写共享接口把本系统的一些业务数据共享给各地市的自建系统&#xff0c;为了体现公司的专业性以及考虑到程序的扩展性&#xff08;通过各地市的行政区划代码做限制&#xff09;&#xf…