超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目,逻辑层次分明,基础功能包括用户的登录和注销,用户和供应商以及订单信息的增删查改的基础功能。可以帮助我们更好的加深理解三层架构的理念,本项目作为纯JavaWeb版,不涉及Spring和SpringBoot的知识,就是帮助我们从底层和从源代码开始理解,为以后的微服务和作铺垫。

系统整体架构简略图如下:

#mermaid-svg-40OZrook5Yra6eJ5 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-40OZrook5Yra6eJ5 .label text{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .node rect,#mermaid-svg-40OZrook5Yra6eJ5 .node circle,#mermaid-svg-40OZrook5Yra6eJ5 .node ellipse,#mermaid-svg-40OZrook5Yra6eJ5 .node polygon,#mermaid-svg-40OZrook5Yra6eJ5 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-40OZrook5Yra6eJ5 .node .label{text-align:center;fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .node.clickable{cursor:pointer}#mermaid-svg-40OZrook5Yra6eJ5 .arrowheadPath{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-40OZrook5Yra6eJ5 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-40OZrook5Yra6eJ5 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-40OZrook5Yra6eJ5 .edgeLabel rect{opacity:0.9}#mermaid-svg-40OZrook5Yra6eJ5 .edgeLabel span{color:#333}#mermaid-svg-40OZrook5Yra6eJ5 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-40OZrook5Yra6eJ5 .cluster text{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-40OZrook5Yra6eJ5 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-40OZrook5Yra6eJ5 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-40OZrook5Yra6eJ5 .actor-line{stroke:grey}#mermaid-svg-40OZrook5Yra6eJ5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-40OZrook5Yra6eJ5 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-40OZrook5Yra6eJ5 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-40OZrook5Yra6eJ5 .sequenceNumber{fill:#fff}#mermaid-svg-40OZrook5Yra6eJ5 #sequencenumber{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-40OZrook5Yra6eJ5 .messageText{fill:#333;stroke:#333}#mermaid-svg-40OZrook5Yra6eJ5 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-40OZrook5Yra6eJ5 .labelText,#mermaid-svg-40OZrook5Yra6eJ5 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-40OZrook5Yra6eJ5 .loopText,#mermaid-svg-40OZrook5Yra6eJ5 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-40OZrook5Yra6eJ5 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-40OZrook5Yra6eJ5 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-40OZrook5Yra6eJ5 .noteText,#mermaid-svg-40OZrook5Yra6eJ5 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-40OZrook5Yra6eJ5 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-40OZrook5Yra6eJ5 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-40OZrook5Yra6eJ5 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-40OZrook5Yra6eJ5 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .section{stroke:none;opacity:0.2}#mermaid-svg-40OZrook5Yra6eJ5 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-40OZrook5Yra6eJ5 .section2{fill:#fff400}#mermaid-svg-40OZrook5Yra6eJ5 .section1,#mermaid-svg-40OZrook5Yra6eJ5 .section3{fill:#fff;opacity:0.2}#mermaid-svg-40OZrook5Yra6eJ5 .sectionTitle0{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .sectionTitle1{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .sectionTitle2{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .sectionTitle3{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-40OZrook5Yra6eJ5 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .grid path{stroke-width:0}#mermaid-svg-40OZrook5Yra6eJ5 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-40OZrook5Yra6eJ5 .task{stroke-width:2}#mermaid-svg-40OZrook5Yra6eJ5 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .taskText:not([font-size]){font-size:11px}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-40OZrook5Yra6eJ5 .task.clickable{cursor:pointer}#mermaid-svg-40OZrook5Yra6eJ5 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-40OZrook5Yra6eJ5 .taskText0,#mermaid-svg-40OZrook5Yra6eJ5 .taskText1,#mermaid-svg-40OZrook5Yra6eJ5 .taskText2,#mermaid-svg-40OZrook5Yra6eJ5 .taskText3{fill:#fff}#mermaid-svg-40OZrook5Yra6eJ5 .task0,#mermaid-svg-40OZrook5Yra6eJ5 .task1,#mermaid-svg-40OZrook5Yra6eJ5 .task2,#mermaid-svg-40OZrook5Yra6eJ5 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutside0,#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutside2{fill:#000}#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutside1,#mermaid-svg-40OZrook5Yra6eJ5 .taskTextOutside3{fill:#000}#mermaid-svg-40OZrook5Yra6eJ5 .active0,#mermaid-svg-40OZrook5Yra6eJ5 .active1,#mermaid-svg-40OZrook5Yra6eJ5 .active2,#mermaid-svg-40OZrook5Yra6eJ5 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-40OZrook5Yra6eJ5 .activeText0,#mermaid-svg-40OZrook5Yra6eJ5 .activeText1,#mermaid-svg-40OZrook5Yra6eJ5 .activeText2,#mermaid-svg-40OZrook5Yra6eJ5 .activeText3{fill:#000 !important}#mermaid-svg-40OZrook5Yra6eJ5 .done0,#mermaid-svg-40OZrook5Yra6eJ5 .done1,#mermaid-svg-40OZrook5Yra6eJ5 .done2,#mermaid-svg-40OZrook5Yra6eJ5 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-40OZrook5Yra6eJ5 .doneText0,#mermaid-svg-40OZrook5Yra6eJ5 .doneText1,#mermaid-svg-40OZrook5Yra6eJ5 .doneText2,#mermaid-svg-40OZrook5Yra6eJ5 .doneText3{fill:#000 !important}#mermaid-svg-40OZrook5Yra6eJ5 .crit0,#mermaid-svg-40OZrook5Yra6eJ5 .crit1,#mermaid-svg-40OZrook5Yra6eJ5 .crit2,#mermaid-svg-40OZrook5Yra6eJ5 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-40OZrook5Yra6eJ5 .activeCrit0,#mermaid-svg-40OZrook5Yra6eJ5 .activeCrit1,#mermaid-svg-40OZrook5Yra6eJ5 .activeCrit2,#mermaid-svg-40OZrook5Yra6eJ5 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-40OZrook5Yra6eJ5 .doneCrit0,#mermaid-svg-40OZrook5Yra6eJ5 .doneCrit1,#mermaid-svg-40OZrook5Yra6eJ5 .doneCrit2,#mermaid-svg-40OZrook5Yra6eJ5 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-40OZrook5Yra6eJ5 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-40OZrook5Yra6eJ5 .milestoneText{font-style:italic}#mermaid-svg-40OZrook5Yra6eJ5 .doneCritText0,#mermaid-svg-40OZrook5Yra6eJ5 .doneCritText1,#mermaid-svg-40OZrook5Yra6eJ5 .doneCritText2,#mermaid-svg-40OZrook5Yra6eJ5 .doneCritText3{fill:#000 !important}#mermaid-svg-40OZrook5Yra6eJ5 .activeCritText0,#mermaid-svg-40OZrook5Yra6eJ5 .activeCritText1,#mermaid-svg-40OZrook5Yra6eJ5 .activeCritText2,#mermaid-svg-40OZrook5Yra6eJ5 .activeCritText3{fill:#000 !important}#mermaid-svg-40OZrook5Yra6eJ5 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-40OZrook5Yra6eJ5 g.classGroup text .title{font-weight:bolder}#mermaid-svg-40OZrook5Yra6eJ5 g.clickable{cursor:pointer}#mermaid-svg-40OZrook5Yra6eJ5 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-40OZrook5Yra6eJ5 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-40OZrook5Yra6eJ5 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-40OZrook5Yra6eJ5 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-40OZrook5Yra6eJ5 .dashed-line{stroke-dasharray:3}#mermaid-svg-40OZrook5Yra6eJ5 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 .commit-id,#mermaid-svg-40OZrook5Yra6eJ5 .commit-msg,#mermaid-svg-40OZrook5Yra6eJ5 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-40OZrook5Yra6eJ5 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-40OZrook5Yra6eJ5 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-40OZrook5Yra6eJ5 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-40OZrook5Yra6eJ5 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-40OZrook5Yra6eJ5 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-40OZrook5Yra6eJ5 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-40OZrook5Yra6eJ5 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-40OZrook5Yra6eJ5 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-40OZrook5Yra6eJ5 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-40OZrook5Yra6eJ5 .edgeLabel text{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-40OZrook5Yra6eJ5 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-40OZrook5Yra6eJ5 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-40OZrook5Yra6eJ5 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-40OZrook5Yra6eJ5 .note-edge{stroke-dasharray:5}#mermaid-svg-40OZrook5Yra6eJ5 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-40OZrook5Yra6eJ5 .error-icon{fill:#522}#mermaid-svg-40OZrook5Yra6eJ5 .error-text{fill:#522;stroke:#522}#mermaid-svg-40OZrook5Yra6eJ5 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-40OZrook5Yra6eJ5 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-40OZrook5Yra6eJ5 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-40OZrook5Yra6eJ5 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-40OZrook5Yra6eJ5 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-40OZrook5Yra6eJ5 .marker{fill:#333}#mermaid-svg-40OZrook5Yra6eJ5 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-40OZrook5Yra6eJ5 {color: rgba(0, 0, 0, 0.75);font: ;}

数据库
数据库
数据库
数据库
smbms
登陆注销
Roleservice
RoleDao
增删查改功能
用户管理
Userservice
UserDao
增删查改功能
订单管理
Billservice
BillDao
增删查改功能
供应商管理
Providerservice
ProviderDao
增删查改功能

一.smbms项目搭建

1.搭建一个MavenWeb项目

2.导入相关Maven依赖

 <!-- servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><!-- jsp依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version></dependency><!--jstl表达式--><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><!--        standard标签库--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--        数据库连接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency>

3.配置数据库文件并编写数据库的公共类

在resources文件夹下新建db.properties用于存放数据库的配置及文件(驱动,路径,用户名和密码)

#在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8,使用安全连接,可以将数据类型为Date的字段设置为空值
url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8&useSSL=true&zeroDateTimeBehavior=convertToNull
username=root
password=123456
#连接数据库的驱动
driver=com.mysql.cj.jdbc.Driver

新建DBDao类,编写数据库的公共类就是将连接数据库和关闭资源和查询操作设置为静态方法或静态类型,方便用户重复的调用方法,极大的提高了项目增删查改的效率。

public class DBDao {private static String url;private static String username;private static String password;private static String driver;static {//读取db.properties的数据转变为数据流InputStream is = DBDao.class.getClassLoader().getResourceAsStream("db.properties");Properties properties=new Properties();try {properties.load(is);//加载数据} catch (IOException e) {e.printStackTrace();}//获取各项资源url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");driver=properties.getProperty("driver");}
//数据库连接操作public static Connection getCon(){Connection con=null;try {Class.forName(driver);con=DriverManager.getConnection(url,username,password);} catch (Exception e) {e.printStackTrace();}return con;}
//查询操作public static ResultSet executeQuery(Connection con, PreparedStatement ps,ResultSet rst,String sql,Object[] params) throws SQLException {ps=con.prepareStatement(sql);//预编译for (int i = 0; i <params.length; i++) {//占位符从1开始,但是数组是从0开始的ps.setObject(i+1,params[i]);}rst=ps.executeQuery();return rst;//返回结果集}
//增加删除修改操作public static int executeUpdate(Connection con,PreparedStatement ps,String sql,Object[] params) throws SQLException {ps=con.prepareStatement(sql);for (int i = 0; i <params.length ; i++) {ps.setObject(i+1,params[i]);}int row=ps.executeUpdate();return row;//返回受影响的行数}
//数据库关闭操作public static void getClose(Connection con,PreparedStatement ps,ResultSet rst){if (rst!=null){//若不为空,执行关闭操作try {rst.close();} catch (Exception e) {e.printStackTrace();}}if (ps!=null){try {ps.close();} catch (Exception e) {e.printStackTrace();}}if (con!=null){try {con.close();} catch (Exception e) {e.printStackTrace();}}}
}

4.编写字符编码集过滤器

在Filter包中编写字符编码过滤器的作用是将前端弹框消息文字显示为中文,要记住在设置完后一定要添加filterChain.doFilter()方法,否则无法作用。

public class CharsetEncodingFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//设置字符编码集为UTF-8servletRequest.setCharacterEncoding("utf-8");servletResponse.setCharacterEncoding("utf-8");filterChain.doFilter(servletRequest,servletResponse);}public void destroy() {}
}

在之后web.xml中配置Servlet即可。

    <filter><filter-name>filter</filter-name><filter-class>filter.CharsetEncodingFilter</filter-class></filter><filter-mapping><filter-name>filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

5.配置Tomcat和编写实体类

tomcat配置如下,方便进行功能的服务测试
编写实体类一定要做到与数据库的表格字段一一对应,包括set get方法和toString方法。以User实体类部分代码为例:

二.登录流程实现

通过tomcat跳转到登录页面,输入用户名与密码,通过对比数据库存放的数据来判断是否登录成功,若匹配成功,则跳转到后台的首页,若匹配失败,则会出现错误信息,无法登录,也不能看到后台首页。
登录流程图:

Created with Raphaël 2.2.0服务器登陆界面通过数据库数据对比判断登录是否成功跳转到后台页面yesno

1.设置后台首页

后台首页就是登陆成功出现的页面,在web.xml中配置Servlet即可。

<!--    设置后台首页--><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>

2.编写UserDao接口

只要涉及User类的数据,并且与数据库打交道的方法,此接口只存放方法,如需之后添加方法,都存放在此接口中。

public interface UserDao {//通过userCode获取Userpublic User getLoginUser(Connection connection, String userCode)throws Exception;}

3.编写UserDaoImpl实现类

此类的作用就是覆写以上接口的全部方法,用于数据库的连接,关闭,调用查询或增删查改方法,起到service层和数据库的桥梁作用。

@Override
public class UserDaoImpl implements UserDao{public User getLoginUser(Connection connection, String userCode)throws Exception {//变量作用域适用于此方法内PreparedStatement pstm = null;ResultSet rs = null;User user = null;if(null != connection){String sql = "select * from smbms_user where userCode=?";//sql中需要传入的参数Object[] params = {userCode};//调用之前封装中的查询方法rs = BaseDao.execute(connection, pstm, rs, sql, params);//取出里面的值if(rs.next()){user = new User();user.setId(rs.getInt("id"));user.setUserCode(rs.getString("userCode"));user.setUserName(rs.getString("userName"));user.setUserPassword(rs.getString("userPassword"));user.setGender(rs.getInt("gender"));user.setBirthday(rs.getDate("birthday"));user.setPhone(rs.getString("phone"));user.setAddress(rs.getString("address"));user.setUserRole(rs.getInt("userRole"));user.setCreatedBy(rs.getInt("createdBy"));user.setCreationDate(rs.getTimestamp("creationDate"));user.setModifyBy(rs.getInt("modifyBy"));user.setModifyDate(rs.getTimestamp("modifyDate"));}//执行关闭资源,connnection在service层还要用,所以无需关闭BaseDao.closeResource(null, pstm, rs);}return user;}}

4.编写UserService接口

此接口与Dao接口功能类似,但是里面的方法只用于进行事务(登录用户,查询用户,删除用户)的操作,只需调用daoImpl中的方法就可以操作数据库了,之后增加类似事务,只要往里面添加方法就行。

public interface UserService {//用户登录,只需要传入用户名和密码public User login(String userCode, String userPassword);}

5.编写UserServiceImpl实现

此类覆写以上接口全部方法,功能相似。

public class UserServiceImpl implements UserService{//引用UserDao接口,否则无法调用里面的方法,无法与数据库进行连接以操作数据库,且此变量是此类的全局变量。private UserDao userDao;public UserServiceImpl(){userDao = new UserDaoImpl();}
@Overridepublic User login(String userCode, String userPassword) {Connection connection = null;User user = null;try {connection = BaseDao.getConnection();//调用userDao中的方法user = userDao.getLoginUser(connection, userCode);} catch (Exception e) {e.printStackTrace();}finally{//关闭connection即可BaseDao.closeResource(connection, null, null);}//若密码匹配不正确,则user返回nullif(null != user){if(!user.getUserPassword().equals(userPassword))user = null;}return user;}}

6.编写LoginServlet类

此类用于前端与后端的交互作用,在登陆功能这一块,就是将用户输入的用户名与密码拿来,去调用service层,再通过service层调用dao层,再调用数据库,与数据库中的用户名和密码相匹配,若匹配失败,则提示相关信息,并无法跳转到下一个页面,若匹配成功,则会页面跳转到下一个页面。
在编写前先编写一个工具类,用于存放所有要用到的常量。

public class Constants {public final static String USER_SESSION = "userSession";public final static String SYS_MESSAGE = "message";public final static int pageSize = 5;
}
public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("login ============ " );//从前端框中获取用户输入的用户名和密码String userCode = request.getParameter("userCode");String userPassword = request.getParameter("userPassword");//调用service方法,进行用户匹配UserService userService = new UserServiceImpl();User user = userService.login(userCode,userPassword);if(null != user){//登录成功//放入sessionrequest.getSession().setAttribute(Constants.USER_SESSION, user);//页面重定向(frame.jsp)response.sendRedirect("jsp/frame.jsp");}else{//登陆失败,页面跳转(login.jsp)带出提示信息--转发request.setAttribute("error", "用户名或密码不正确");request.getRequestDispatcher("login.jsp").forward(request, response);}}

登陆界面如下:

7.在xml文件中,注册登陆功能的servlet

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>cn.smbms.servlet.user.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login.do</url-pattern></servlet-mapping>

三.注销功能的实现

需求:

  1. 在登陆失败和注销账号后,在网页上端口后接着输入“jps/frame.jsp”,依然无发页面跳转。
  2. 注销账号后,需要返回页面登陆界面。

解决办法::移除常量的Sessionid,因为Sessionid是唯一的:

public class LogoutServlet extends HttpServlet {public LogoutServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//清除sessionrequest.getSession().removeAttribute(Constants.USER_SESSION);response.sendRedirect(request.getContextPath()+"/login.jsp");}public void init() throws ServletException {}
}

注册注销功能的servlet

<servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>cn.smbms.servlet.user.LogoutServlet</servlet-class></servlet><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/jsp/logout.do</url-pattern></servlet-mapping>

四.添加相关用户事务

添加相关用户事务都和以上的步骤一样:

1. 编写相关用户接口方法存放于Dao层UserDao接口中。

  // 增加用户信息public int add(Connection connection, User user)throws Exception;// 通过条件查询-userListpublic List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize)throws Exception;// 通过条件查询-用户表记录数public int getUserCount(Connection connection, String userName, int userRole)throws Exception;// 通过userId删除userpublic int deleteUserById(Connection connection, Integer delId)throws Exception;//通过userId获取userpublic User getUserById(Connection connection, String id)throws Exception;//修改用户信息public int modify(Connection connection, User user)throws Exception;// 修改当前用户密码public int updatePwd(Connection connection, int id, String pwd)throws Exception;

2. 在UserDaoImpl实现类中实现接口方法,作用就是连接数据库,调用封装的方法,返回对应类型的值,之后关闭数据库。

@Override
//增加用户信息public int add(Connection connection, User user) throws Exception {PreparedStatement pstm = null;//定义返回受影响的行数int updateRows = 0;if(null != connection){//编写sql语句String sql = "insert into smbms_user (userCode,userName,userPassword," +"userRole,gender,birthday,phone,address,creationDate,createdBy) " +"values(?,?,?,?,?,?,?,?,?,?)";//需要的参数Object[] params = {user.getUserCode(),user.getUserName(),user.getUserPassword(),user.getUserRole(),user.getGender(),user.getBirthday(),user.getPhone(),user.getAddress(),user.getCreationDate(),user.getCreatedBy()};//调用封装的方法updateRows = BaseDao.execute(connection, pstm, sql, params);//关闭资源BaseDao.closeResource(null, pstm, null);}return updateRows;}@Override//模糊查询public List<User> getUserList(Connection connection, String userName,int userRole,int currentPageNo, int pageSize)throws Exception {PreparedStatement pstm = null;ResultSet rs = null;List<User> userList = new ArrayList<User>();if(connection != null){//StringBuffer可以用来追加字符串StringBuffer sql = new StringBuffer();sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");List<Object> list = new ArrayList<Object>();//若追加的userName不为空if(!StringUtils.isNullOrEmpty(userName)){//and前面有空格!!!sql.append(" and u.userName like ?");//根据用户名模糊查询list.add("%"+userName+"%");}if(userRole > 0){//根据用户角色模糊查询sql.append(" and u.userRole = ?");list.add(userRole);}//降序排序sql.append(" order by creationDate DESC limit ?,?");//实现查询结果的分页currentPageNo = (currentPageNo-1)*pageSize;list.add(currentPageNo);list.add(pageSize);Object[] params = list.toArray();System.out.println("sql ----> " + sql.toString());rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);//取出查询的结果while(rs.next()){User _user = new User();_user.setId(rs.getInt("id"));_user.setUserCode(rs.getString("userCode"));_user.setUserName(rs.getString("userName"));_user.setGender(rs.getInt("gender"));_user.setBirthday(rs.getDate("birthday"));_user.setPhone(rs.getString("phone"));_user.setUserRole(rs.getInt("userRole"));_user.setUserRoleName(rs.getString("userRoleName"));//将取出的值添加到集合当中userList.add(_user);}BaseDao.closeResource(null, pstm, rs);}//返回集合return userList;}@Override
//根据Id删除用户public int deleteUserById(Connection connection,Integer delId) throws Exception {PreparedStatement pstm = null;int flag = 0;if(null != connection){String sql = "delete from smbms_user where id=?";Object[] params = {delId};flag = BaseDao.execute(connection, pstm, sql, params);BaseDao.closeResource(null, pstm, null);}return flag;}@Override
//根据用户Id查询用户数据public User getUserById(Connection connection, String id) throws Exception {User user = null;PreparedStatement pstm = null;ResultSet rs = null;if(null != connection){String sql = "select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.id=? and u.userRole = r.id";Object[] params = {id};rs = BaseDao.execute(connection, pstm, rs, sql, params);if(rs.next()){user = new User();user.setId(rs.getInt("id"));user.setUserCode(rs.getString("userCode"));user.setUserName(rs.getString("userName"));user.setUserPassword(rs.getString("userPassword"));user.setGender(rs.getInt("gender"));user.setBirthday(rs.getDate("birthday"));user.setPhone(rs.getString("phone"));user.setAddress(rs.getString("address"));user.setUserRole(rs.getInt("userRole"));user.setCreatedBy(rs.getInt("createdBy"));user.setCreationDate(rs.getTimestamp("creationDate"));user.setModifyBy(rs.getInt("modifyBy"));user.setModifyDate(rs.getTimestamp("modifyDate"));user.setUserRoleName(rs.getString("userRoleName"));}BaseDao.closeResource(null, pstm, rs);}//返回查询到的数据return user;}@Override
//更新用户信息public int modify(Connection connection, User user) throws Exception {int flag = 0;PreparedStatement pstm = null;if(null != connection){String sql = "update smbms_user set userName=?,"+"gender=?,birthday=?,phone=?,address=?,userRole=?,modifyBy=?,modifyDate=? where id = ? ";Object[] params = {user.getUserName(),user.getGender(),user.getBirthday(),user.getPhone(),user.getAddress(),user.getUserRole(),user.getModifyBy(),user.getModifyDate(),user.getId()};flag = BaseDao.execute(connection, pstm, sql, params);BaseDao.closeResource(null, pstm, null);}return flag;}@Override
//更新密码public int updatePwd(Connection connection, int id, String pwd)throws Exception {int flag = 0;PreparedStatement pstm = null;if(connection != null){String sql = "update smbms_user set userPassword= ? where id = ?";Object[] params = {pwd,id};flag = BaseDao.execute(connection, pstm, sql, params);BaseDao.closeResource(null, pstm, null);}return flag;}@Override
//根据用户名和角色查询用户数量public int getUserCount(Connection connection, String userName, int userRole)throws Exception {PreparedStatement pstm = null;ResultSet rs = null;int count = 0;if(connection != null){StringBuffer sql = new StringBuffer();//追加内容sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");List<Object> list = new ArrayList<Object>();if(!StringUtils.isNullOrEmpty(userName)){sql.append(" and u.userName like ?");list.add("%"+userName+"%");}if(userRole > 0){sql.append(" and u.userRole = ?");list.add(userRole);}Object[] params = list.toArray();System.out.println("sql ----> " + sql.toString());rs = BaseDao.execute(connection, pstm, rs, sql.toString(), params);if(rs.next()){count = rs.getInt("count");}BaseDao.closeResource(null, pstm, rs);}return count;}

3. 编写相关用户事务方法存放于Service层的UserService接口中。

public interface UserService {// 增加用户信息public boolean add(User user);//用户登录public User login(String userCode, String userPassword);//根据条件查询用户列表public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize);// 根据条件查询用户表记录数public int getUserCount(String queryUserName, int queryUserRole);// 根据userCode查询出Userpublic User selectUserCodeExist(String userCode);// 根据ID删除userpublic boolean deleteUserById(Integer delId);//根据ID查找userpublic User getUserById(String id);//修改用户信息public boolean modify(User user);// 根据userId修改密码public boolean updatePwd(int id, String pwd);
}

4. 在UserServiceImpl中实现接口方法,作用就是调用UserDao中的方法,不用与数据库打交道,返回对应类型的值,之后关闭数据库。

@Override
//添加用户信息public boolean add(User user) {boolean flag = false;Connection connection = null;try {connection = BaseDao.getConnection();connection.setAutoCommit(false);//开启JDBC事务管理int updateRows = userDao.add(connection,user);connection.commit();if(updateRows > 0){flag = true;}else{System.out.println("add failed!");}} catch (Exception e) {e.printStackTrace();try {//若事务提交失败,则回滚connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}}finally{//在service层进行connection连接的关闭BaseDao.closeResource(connection, null, null);}return flag;}@Override
//查询全部用户数据public List<User> getUserList(String queryUserName,int queryUserRole,int currentPageNo, int pageSize) {Connection connection = null;List<User> userList = null;try {connection = BaseDao.getConnection();userList = userDao.getUserList(connection, queryUserName,queryUserRole,currentPageNo,pageSize);} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return userList;}@Override
//根据userCode查询用户public User selectUserCodeExist(String userCode) {Connection connection = null;User user = null;try {connection = BaseDao.getConnection();user = userDao.getLoginUser(connection, userCode);} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return user;}@Override
//根据Id删除用户public boolean deleteUserById(Integer delId) {Connection connection = null;boolean flag = false;try {connection = BaseDao.getConnection();if(userDao.deleteUserById(connection,delId) > 0)flag = true;} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return flag;}@Override
//根据Id查询用户public User getUserById(String id) {User user = null;Connection connection = null;try{connection = BaseDao.getConnection();user = userDao.getUserById(connection,id);}catch (Exception e) {e.printStackTrace();user = null;}finally{BaseDao.closeResource(connection, null, null);}return user;}@Override//修改用户public boolean modify(User user) {Connection connection = null;boolean flag = false;try {connection = BaseDao.getConnection();if(userDao.modify(connection,user) > 0)flag = true;} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return flag;}@Override//更新用户密码public boolean updatePwd(int id, String pwd) {boolean flag = false;Connection connection = null;try{connection = BaseDao.getConnection();if(userDao.updatePwd(connection,id,pwd) > 0)flag = true;}catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return flag;}@Override
//得到用户个数public int getUserCount(String queryUserName, int queryUserRole) {Connection connection = null;int count = 0;try {connection = BaseDao.getConnection();count = userDao.getUserCount(connection, queryUserName,queryUserRole);} catch (Exception e) {e.printStackTrace();}finally{BaseDao.closeResource(connection, null, null);}return count;}

5. 在servlet层编写相关方法用于前端与后端的交互,取出前端用户输入的数据,调用Service层中的方法等,用于匹配,返回正确状态下的对应的信息。

添加分页支持的工具类,用于数据结果输出的分页:

package cn.smbms.tools;public class PageSupport {//当前页码-来自于用户输入private int currentPageNo = 1;//总数量(表)private int totalCount = 0;//页面容量private int pageSize = 0;//总页数-totalCount/pageSize(+1)private int totalPageCount = 1;public int getCurrentPageNo() {return currentPageNo;}public void setCurrentPageNo(int currentPageNo) {if(currentPageNo > 0){this.currentPageNo = currentPageNo;}}public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {if(totalCount > 0){this.totalCount = totalCount;//设置总页数this.setTotalPageCountByRs();}}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {if(pageSize > 0){this.pageSize = pageSize;}}public int getTotalPageCount() {return totalPageCount;}public void setTotalPageCount(int totalPageCount) {this.totalPageCount = totalPageCount;}public void setTotalPageCountByRs(){if(this.totalCount % this.pageSize == 0){this.totalPageCount = this.totalCount / this.pageSize;}else if(this.totalCount % this.pageSize > 0){this.totalPageCount = this.totalCount / this.pageSize + 1;}else{this.totalPageCount = 0;}}}
public class UserServlet extends HttpServlet {public UserServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//取出method前端参数String method = request.getParameter("method");//调用以下编写的方法if(method != null && method.equals("add")){this.add(request, response);}else if(method != null && method.equals("query")){this.query(request, response);}else if(method != null && method.equals("getrolelist")){this.getRoleList(request, response);}else if(method != null && method.equals("ucexist")){this.userCodeExist(request, response);}else if(method != null && method.equals("deluser")){this.delUser(request, response);}else if(method != null && method.equals("view")){this.getUserById(request, response,"userview.jsp");}else if(method != null && method.equals("modify")){this.getUserById(request, response,"usermodify.jsp");}else if(method != null && method.equals("modifyexe")){this.modify(request, response);}else if(method != null && method.equals("pwdmodify")){this.getPwdByUserId(request, response);}else if(method != null && method.equals("savepwd")){this.updatePwd(request, response);}//修改密码
private void updatePwd(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//取出UserSession的idObject o = request.getSession().getAttribute(Constants.USER_SESSION);//取出页面前端的用户输入的新密码String newpassword = request.getParameter("newpassword");boolean flag = false;//若session不为空,且新密码不为空if(o != null && !StringUtils.isNullOrEmpty(newpassword)){UserService userService = new UserServiceImpl();//调用service层的方法,将变量O强制类转换获得idflag = userService.updatePwd(((User)o).getId(),newpassword);if(flag){request.setAttribute(Constants.SYS_MESSAGE, "修改密码成功,请退出并使用新密码重新登录!");//修改成功后,session注销request.getSession().removeAttribute(Constants.USER_SESSION);}else{request.setAttribute(Constants.SYS_MESSAGE, "修改密码失败!");}}else{//session 或新密码为空request.setAttribute(Constants.SYS_MESSAGE, "修改密码失败!");}//页面跳转request.getRequestDispatcher("pwdmodify.jsp").forward(request, response);}//修改密码时的弹出的信息private void getPwdByUserId(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Object o = request.getSession().getAttribute(Constants.USER_SESSION);String oldpassword = request.getParameter("oldpassword");Map<String, String> resultMap = new HashMap<String, String>();if(null == o ){//session过期resultMap.put("result", "sessionerror");}else if(StringUtils.isNullOrEmpty(oldpassword)){//旧密码输入为空resultMap.put("result", "error");}else{String sessionPwd = ((User)o).getUserPassword();if(oldpassword.equals(sessionPwd)){resultMap.put("result", "true");}else{//旧密码输入不正确resultMap.put("result", "false");}}//把resultMap转换成json对象输出response.setContentType("application/json");PrintWriter outPrintWriter = response.getWriter();outPrintWriter.write(JSONArray.toJSONString(resultMap));outPrintWriter.flush();outPrintWriter.close();}//修改数据
private void modify(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//从前端取出数据String id = request.getParameter("uid");String userName = request.getParameter("userName");String gender = request.getParameter("gender");String birthday = request.getParameter("birthday");String phone = request.getParameter("phone");String address = request.getParameter("address");String userRole = request.getParameter("userRole");User user = new User();user.setId(Integer.valueOf(id));user.setUserName(userName);user.setGender(Integer.valueOf(gender));try {user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));} catch (ParseException e) {e.printStackTrace();}user.setPhone(phone);user.setAddress(address);user.setUserRole(Integer.valueOf(userRole));user.setModifyBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());user.setModifyDate(new Date());UserService userService = new UserServiceImpl();//页面重定向if(userService.modify(user)){response.sendRedirect(request.getContextPath()+"/jsp/user.do?method=query");}else{request.getRequestDispatcher("usermodify.jsp").forward(request, response);}}//根据id查找数据
private void getUserById(HttpServletRequest request, HttpServletResponse response,String url)throws ServletException, IOException {String id = request.getParameter("uid");if(!StringUtils.isNullOrEmpty(id)){//调用后台方法得到user对象UserService userService = new UserServiceImpl();User user = userService.getUserById(id);//将后端数据传到前端页面对应位置request.setAttribute("user", user);request.getRequestDispatcher(url).forward(request, response);}}//根据ID删除用户
private void delUser(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String id = request.getParameter("uid");Integer delId = 0;try{delId = Integer.parseInt(id);}catch (Exception e) {delId = 0;}HashMap<String, String> resultMap = new HashMap<String, String>();if(delId <= 0){resultMap.put("delResult", "notexist");}else{UserService userService = new UserServiceImpl();if(userService.deleteUserById(delId)){resultMap.put("delResult", "true");}else{resultMap.put("delResult", "false");}}//把resultMap转换成json对象输出response.setContentType("application/json");PrintWriter outPrintWriter = response.getWriter();outPrintWriter.write(JSONArray.toJSONString(resultMap));outPrintWriter.flush();outPrintWriter.close();}//根据userRole查询数据private void userCodeExist(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//判断用户账号是否可用String userCode = request.getParameter("userCode");HashMap<String, String> resultMap = new HashMap<String, String>();if(StringUtils.isNullOrEmpty(userCode)){//userCode == null || userCode.equals("")resultMap.put("userCode", "exist");}else{UserService userService = new UserServiceImpl();User user = userService.selectUserCodeExist(userCode);if(null != user){resultMap.put("userCode","exist");}else{resultMap.put("userCode", "notexist");}}//把resultMap转为json字符串以json的形式输出//配置上下文的输出类型response.setContentType("application/json");//从response对象中获取往外输出的writer对象PrintWriter outPrintWriter = response.getWriter();//把resultMap转为json字符串 输出outPrintWriter.write(JSONArray.toJSONString(resultMap));outPrintWriter.flush();//刷新outPrintWriter.close();//关闭流}//查询角色列表
private void getRoleList(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {List<Role> roleList = null;RoleService roleService = new RoleServiceImpl();roleList = roleService.getRoleList();//把roleList转换成json对象输出response.setContentType("application/json");PrintWriter outPrintWriter = response.getWriter();outPrintWriter.write(JSONArray.toJSONString(roleList));outPrintWriter.flush();outPrintWriter.close();}private void query(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//查询用户列表String queryUserName = request.getParameter("queryname");String temp = request.getParameter("queryUserRole");String pageIndex = request.getParameter("pageIndex");int queryUserRole = 0;UserService userService = new UserServiceImpl();List<User> userList = null;//设置页面容量int pageSize = Constants.pageSize;//当前页码int currentPageNo = 1;/*** http://localhost:8090/SMBMS/userlist.do* ----queryUserName --NULL* http://localhost:8090/SMBMS/userlist.do?queryname=* --queryUserName ---""*/System.out.println("queryUserName servlet--------"+queryUserName);  System.out.println("queryUserRole servlet--------"+queryUserRole);  System.out.println("query pageIndex--------- > " + pageIndex);if(queryUserName == null){queryUserName = "";}if(temp != null && !temp.equals("")){queryUserRole = Integer.parseInt(temp);}if(pageIndex != null){try{currentPageNo = Integer.valueOf(pageIndex);}catch(NumberFormatException e){response.sendRedirect("error.jsp");}} //总数量(表)  int totalCount  = userService.getUserCount(queryUserName,queryUserRole);//总页数PageSupport pages=new PageSupport();pages.setCurrentPageNo(currentPageNo);pages.setPageSize(pageSize);pages.setTotalCount(totalCount);int totalPageCount = pages.getTotalPageCount();//控制首页和尾页if(currentPageNo < 1){currentPageNo = 1;}else if(currentPageNo > totalPageCount){currentPageNo = totalPageCount;}userList = userService.getUserList(queryUserName,queryUserRole,currentPageNo, pageSize);request.setAttribute("userList", userList);List<Role> roleList = null;RoleService roleService = new RoleServiceImpl();roleList = roleService.getRoleList();request.setAttribute("roleList", roleList);request.setAttribute("queryUserName", queryUserName);request.setAttribute("queryUserRole", queryUserRole);request.setAttribute("totalPageCount", totalPageCount);request.setAttribute("totalCount", totalCount);request.setAttribute("currentPageNo", currentPageNo);request.getRequestDispatcher("userlist.jsp").forward(request, response);}private void add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("add()================");String userCode = request.getParameter("userCode");String userName = request.getParameter("userName");String userPassword = request.getParameter("userPassword");String gender = request.getParameter("gender");String birthday = request.getParameter("birthday");String phone = request.getParameter("phone");String address = request.getParameter("address");String userRole = request.getParameter("userRole");User user = new User();user.setUserCode(userCode);user.setUserName(userName);user.setUserPassword(userPassword);user.setAddress(address);try {user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday));} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}user.setGender(Integer.valueOf(gender));user.setPhone(phone);user.setUserRole(Integer.valueOf(userRole));user.setCreationDate(new Date());user.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());UserService userService = new UserServiceImpl();if(userService.add(user)){response.sendRedirect(request.getContextPath()+"/jsp/user.do?method=query");}else{request.getRequestDispatcher("useradd.jsp").forward(request, response);}}public void init() throws ServletException {}}

6. 最后千万要记得在web.xml中注册对应的servlet !!!

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>cn.smbms.servlet.user.LoginServlet</servlet-class></servlet><servlet><servlet-name>LogoutServlet</servlet-name><servlet-class>cn.smbms.servlet.user.LogoutServlet</servlet-class></servlet><servlet><servlet-name>UserServlet</servlet-name><servlet-class>cn.smbms.servlet.user.UserServlet</servlet-class></servlet><servlet><servlet-name>ProviderServlet</servlet-name><servlet-class>cn.smbms.servlet.provider.ProviderServlet</servlet-class></servlet><servlet><servlet-name>BillServlet</servlet-name><servlet-class>cn.smbms.servlet.bill.BillServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LogoutServlet</servlet-name><url-pattern>/jsp/logout.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>UserServlet</servlet-name><url-pattern>/jsp/user.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>ProviderServlet</servlet-name><url-pattern>/jsp/provider.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>BillServlet</servlet-name><url-pattern>/jsp/bill.do</url-pattern></servlet-mapping>    <filter><filter-name>CharacterEncoding</filter-name><filter-class>cn.smbms.filter.CharacterEncoding</filter-class></filter><filter-mapping><filter-name>CharacterEncoding</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>SysFilter</filter-name><filter-class>cn.smbms.filter.SysFilter</filter-class></filter><filter-mapping><filter-name>SysFilter</filter-name><url-pattern>/jsp/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>

除了用户相关操作外,另外还有订单和供应商也与上述步骤类似,请自行编写!

超市管理系统(JavaWeb版)相关推荐

  1. 美萍超市销售管理系统标准版access数据库密码mp611

    美萍超市销售管理系统标准版access数据库密码mp611 作者:admin  来源:本站  发表时间:2015-10-14 19:01:43  点击:199 美萍超市销售管理系统标准版access后 ...

  2. Python项目实战:Python版超市管理系统源代码

    Python版超市管理系统可实现下单商品,修改商品数量,删除商品,结算商品. 程序使用元组代表商品,元组的多个元素分别代表商品条码,商品名称,商品单价: 使用dict来表示系统当前仓库中的所有商品,d ...

  3. Python版超市管理系统源代码,基于django+mysql

    Python版超市管理系统源代码,基于django+mysql 安装步骤 1.在mysql中创建名为demo_django_supermarket的数据库,修改config/setting.py中数据 ...

  4. 基于Javaweb实现超市管理系统

    本系统基于JSP和Servlet实现开发一套小型超市管理系统,功能完整,结构清晰,使用技术结构简单,系统介绍:大学校内超市管理系统,实现收银台,商品分类管理,商品库存管理,商品管理,营收统计等功能 运 ...

  5. JavaWeb课设超市管理系统

    把开源的变成自己的,把自己的变成祖传的 一.要求 做一个web项目 , 超市管理系统 , 实现增删改查各种信息 二.技能树 1.HTML+CSS : div+input框 2.JSP+Servlet ...

  6. springboot基于Javaweb的超市管理系统 毕业设计-附源码281024

    超市管理系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题. ...

  7. (附源码)springboot基于Javaweb的超市管理系统 毕业设计281024

    超市管理系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题. ...

  8. javaweb JAVA JSP超市订单后台管理系统源码超市管理系统商品进销存系统超市后台管理

    JSP超市订单后台管理系统源码超市管理系统商品进销存系统超市后台管理 大家好,很高兴和大家分享Java项目和经验.不管同学们是出于什么需求.都希望各位计算机专业的同学有一个提高. 本系统采用eclip ...

  9. 视频教程-超市管理系统(毕业设计项目指导)-Java

    超市管理系统(毕业设计项目指导) 拥有10年大数据以及Java相关系统架构及教学经验,Java线下培训讲师,曾担任公司技术总监; 擅长的领域:JavaSe.JavaEE:JavaWeb.SSH框架.S ...

  10. (附源码)ssm小型超市管理系统的设计与实现 毕业设计 011136

    目  录 摘要 1 1 绪论 1 1.1研究背景及意义 1 1.2研究现状 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2小型超市管理系统系统分析 3 2.1 可行性分析 3 2. ...

最新文章

  1. SAP PM入门系列24 - IK07 Display Measuring Points
  2. Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
  3. python流程图基本元素-Python初学(十一)
  4. 教你如何在面试中用「10分钟快速分析」一款产品
  5. 淘宝网登陆时密码输不进去??
  6. Windows API入门系列之六 -自己实现MessageBox
  7. 只需3步,即可将你的Chromium Edge 浏览器设置成中文
  8. [转]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
  9. 【渝粤教育】电大中专跨境电子商务理论与实务 (19)作业 题库
  10. Kaggle-泰坦尼克号
  11. linux虚拟机能通显卡吗,英伟达 GeForce 游戏显卡正式支持虚拟机传递功能,可以完全调用...
  12. CVTE 2017 秋季校招笔试题回忆(C++后台)
  13. python网络爬虫系列教程——python中pyquery库应用全解
  14. 为什么 Java 不支持类多重继承?
  15. # 创业计划书-样例参考五千套(一)
  16. 软考历程(4)——安全问题之病毒
  17. dvwa linux安装教程,Redhat 下 XAMPP 安装部署 DVWA 教程(示例代码)
  18. gmail登陆提示密码不正确
  19. ISA防火墙规则练习
  20. QT象棋暗棋游戏(一)

热门文章

  1. 重装系统大师计算机硬件不兼容,360重装系统教你如何处理提示不兼容的软件
  2. 5个值得收藏的视频下载网站
  3. linux tintin 中文,GitHub - oiuv/tt: TinTin++ on Termux for pkuxkx,(全平台 Mud 客户端)。
  4. Jellybean 4.1.1 精简列表+谷歌服务包精简列表
  5. java 中国标准时间_「标准时间」js代码,中国标准时间转换为yyyy-MM-dd - seo实验室...
  6. 网络安全应急响应-常用工具
  7. Structs框架原理
  8. 中兴笔试c语言,中兴笔试题目
  9. 揭秘《英雄联盟》的游戏自动化测试
  10. 【C++】类和对象(中) —— 构造函数 | 析构函数 | 拷贝构造 | 赋值运算符重载