“智多星”智能手机销售网后台管理系统设计
一、系统设计
系统页面的总体设计为左右框,如图。
左边使用Dtree建立目录,右边进行展示和操作,系统总体性的操作流程为 展示信息 -> 修改信息 -> 展示信息 ,使用mvc的方式,对于每个表的信息展示都要有一个servlet类来查询该表的所有信息,需要有个bean来存储查询的信息,还要有一个servlet类进行具体的信息修改,jsp页面进行展示。
下面通过几个功能具体实现来介绍。
二、编程设计
以产品管理为例:
1、添加产品分类
具体实现流程:
页面addmobileclassify.jsp,进入页面就获取bean类AllData中mobileclassify的数据,如果没有就重定向到servlet类QueryAllMobileClassify去查表获取数据,再回到页面,输入数据后点击确定,提交表单action到servlet 类AddMobileClassify进行数据的插入操作,然后重定向到回到QueryAllMobileClassify去更新bean中的数据,最后回到页面addmobileclassify.jsp。
addmobileclassify.jsp具体功能实现代码:
<h2>添加手机分类信息</h2>
<BR>当前显示的内容是:手机分类
<table border="2">
<tr>
<th>id</th>
<th>手机分类</th>
</tr>
<%
CachedRowSetImpl rowSet=alldata.getAllmobileclassify();//获取bean中的数据
if(rowSet==null) {//如果没有数据,就访问servlet类QueryAllMobileClassify进行查表获取数据
session.setAttribute("admc",true);//设置该值是为了 访问servlet类QueryAllMobileClassify后重定向回该页面
response.sendRedirect("QueryAllMobileClassify");
return;
}
else{
session.setAttribute("admc",false);
}
rowSet.last();
int totalRecord=rowSet.getRow();
out.println("全部记录数"+totalRecord); //全部记录数
rowSet.first();
boolean boo=true;
for(int i=1;i<=totalRecord&&boo;i++) {
String id=rowSet.getString(1);
String name=rowSet.getString(2);
out.print("<tr>");
out.print("<td width='100xp' style='text-align:center'>"+id+"</td>");
out.print("<td style='text-align:center'>"+name+"</td>");
out.print("</tr>");
boo=rowSet.next();
}
out.print("</table>");
out.print("<p> 请写入你所要添加的手机分类信息");
%>
<table border='2'>
<tr>
<th>id</th>
<th>手机分类</th>
</tr>
<form action='AddMobileClassify' method = 'post'>
<tr>
<td><input type=text name='addmcid'></td>
<td><input type=text name='addmcname'></td>
</tr>
<td style='text-align:center'>请点击确认添加</td>
<td style='text-align:center'><input type ='submit' value='确定添加' name='addmc'></td>
</from></table>
QueryAllMobileClassify.java实现查询mobileclassify表,保存到AllData中,代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session=request.getSession(true);
Connection con=null;
AllData alldata=null;
try{
alldata=(AllData)session.getAttribute("alldata");
if(alldata==null){
alldata=new AllData(); //创建Javabean对象
session.setAttribute("alldata",alldata);
}
}
catch(Exception exp){
alldata=new AllData();
session.setAttribute("alldata",alldata);
}
String uri="jdbc:mysql://127.0.0.1/mobileshop?characterEncoding=gb2312&useSSL=false";
try{
con=DriverManager.getConnection(uri,"root","");
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs=sql.executeQuery("SELECT * FROM mobileclassify");
rowSet=new CachedRowSetImpl(); //创建行集对象
rowSet.populate(rs);
alldata.setAllmobileclassify(rowSet);; //行集数据存储在alldata中
con.close(); //关闭连接
}
catch(SQLException exp){}
try {
boolean admc=(boolean) session.getAttribute("admc");//从添加页面来的
if (admc) {
response.sendRedirect("addmobileclassify.jsp");//回到添加页面
}
}catch (Exception e) {
// TODO: handle exception
}
try {
boolean almc=(boolean) session.getAttribute("almc");//从修改页面来的
if (almc) {
response.sendRedirect("altermobileclassify.jsp");//回到修改页面
}
}catch (Exception e) {
// TODO: handle exception
}
try {
boolean delmc=(boolean) session.getAttribute("delmc");//从删除页面来的
if (delmc) {
response.sendRedirect("deletemobileclassify.jsp");//回到删除页面
}
}catch (Exception e) {
// TODO: handle exception
}
}
AllData.java为Javabean存储各表的数据:
import com.sun.rowset.CachedRowSetImpl;
public class AllData {
CachedRowSetImpl alluser=null;
CachedRowSetImpl allmobileclassify=null;
CachedRowSetImpl allmobileform=null;
CachedRowSetImpl allorderform=null;
public CachedRowSetImpl getAlluser() {
return alluser;
}
public void setAlluser(CachedRowSetImpl alluser) {
this.alluser = alluser;
}
public CachedRowSetImpl getAllmobileclassify() {
return allmobileclassify;
}
public void setAllmobileclassify(CachedRowSetImpl allmobileclassify) {
this.allmobileclassify = allmobileclassify;
}
public CachedRowSetImpl getAllmobileform() {
return allmobileform;
}
public void setAllmobileform(CachedRowSetImpl allmobileform) {
this.allmobileform = allmobileform;
}
public CachedRowSetImpl getAllorderform() {
return allorderform;
}
public void setAllorderform(CachedRowSetImpl allorderform) {
this.allorderform = allorderform;
}
}
AddMobileClassify.java实现对mobileclassify表插入数据,最后重定向到QueryAllMobileClassify更新bean的数据,代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("gb2312");
String addmcid= request.getParameter("addmcid");
String addmcname= request.getParameter("addmcname");
if(addmcid==null) {
return;
}
HttpSession session=request.getSession(true);
Connection con=null;
String uri="jdbc:mysql://127.0.0.1/mobileshop?characterEncoding=gb2312&useSSL=false";
try{
con=DriverManager.getConnection(uri,"root","");
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String insql="insert into mobileclassify values("+addmcid+",'"+addmcname+"')";
sql.executeUpdate(insql);
con.close(); //关闭连接
}
catch(SQLException exp){
System.out.println(exp);
}
session.setAttribute("admc",true);//设置该值是为了能从QueryAllMobileClassify回到添加页面
response.sendRedirect("QueryAllMobileClassify");//去更新bean的数据
}
2、修改产品分类:
具体实现的流程和添加的一样,页面altermobileclassify.jsp,查询数据servlet类QueryAllMobileClassify,修改操作servlet类AlterMobileClassify,存储数据bean类AllData
这里需要说的是,我这里一个jsp页面使用两个表单,并且每个表单都有submit提交,并且他们的action的方向都不同,正常的submit提交是把所有表单都提交并且action只会响应第一个表单的,这不是我想要的,我需要实现的效果是,通过选择第一个表单的内容添加到第二个表单里面,第二个表单提交并定向到操作的servlet类进行修改操作,如图:
但是我可以判断第二个表的提交按钮是否点击来判断是否转化到其他页面,这样就可以实现这个功能了,因为表单提交的时候会把submit按钮的数据也提交,如果该按钮没有点击,那么它的值就是null。
altermobileclassify.jsp具体实现:
<h2>修改手机分类信息</h2>
<BR>当前显示的内容是:手机分类
<table border="2">
<tr>
<th>id</th>
<th>手机分类</th>
<th>选择</th>
</tr>
<%
CachedRowSetImpl rowSet=alldata.getAllmobileclassify();
if(rowSet==null) {
session.setAttribute("almc",true);
response.sendRedirect("QueryAllMobileClassify");
return;
}
else{
session.setAttribute("almc",false);
}
rowSet.last();
int totalRecord=rowSet.getRow();
out.println("全部记录数"+totalRecord); //全部记录数
rowSet.first();
boolean boo=true;
out.print("<form action='' method = 'post' name='form'>");
for(int i=1;i<=totalRecord&&boo;i++) {
String id=rowSet.getString(1);
String name=rowSet.getString(2);
String s=id+'+'+name;
String button="<input type ='radio' name='C' value="+s+">";//选择按钮,value为该项所有数据
out.print("<tr>");
out.print("<td>"+id+"</td>");
out.print("<td>"+name+"</td>");
out.print("<td>"+button+"</td>");
out.print("</tr>");
boo=rowSet.next();
}
out.print("<td colspan='2' style='text-align:center'>请选择你要修改的手机分类信息</td>");
out.print("<td><input type ='submit' value='确定' ></td>");
out.print("</from></table>");
out.print("<p> 请选择你要修改的手机分类信息");
String ln=request.getParameter("C");//获取选择的项的数据
String l[]=new String[2];
if (ln!=null){
byte lnb[]=ln.getBytes("iso-8859-1");
ln=new String (lnb);
l=ln.split("\\+");//分割获取各个数据
}
%>
<table border='2'>
<tr>
<th>id</th>
<th>手机分类信息</th>
</tr>
<%
out.print("<form action='' method = 'post' >");
out.print("<tr>");
for (int i=0;i<l.length;i++){
out.print("<td><input type=text size=20 name='altermcd"+i+"' value="+l[i]+"></td>");//把数据填入输入框
}
out.print("</tr>");
out.print("<td style='text-align:center'>请点击确认修改</td>");
out.print("<input type ='hidden' name='altermcid' value="+l[0]+" >");
out.print("<td style='text-align:center'><input type ='submit' value='确定修改' name='almc'></td>");
out.print("</from></table>");
String al=request.getParameter("almc");
if (al!=null){//判断是否点击了确认按钮,如果是就转发到AlterMobileClassify
request.getRequestDispatcher("AlterMobileClassify").forward(request, response);
}
%>
3、删除产品分类
流程也是一样的,效果图:
4、添加产品信息
这里要说的是,上传图片的实现,提交表单要添加属性ENCTYPE="multipart/form-data",表项要添加一个选择文件的组件,输入数据选择图片,提交action到AddMobileForm,AddMobileForm里开始马上使用bean类UpFile类进行图片的上传,上传完后,插表,更新bean回到页面,但是实际上,并不那么顺利,因为设置了属性ENCTYPE="multipart/form-data"的表单, 以二进制数据流的方式传输数据的,通过request.getParameter是取不到值的,所以要取到其他各项的数据,必须要在上传文件的时候获取。
addmobileform.jsp主要实现代码:
<h2>添加手机信息</h2>
<BR>当前显示的内容是:手机信息
<table border="2">
<tr>
<th>类型</th>
<th>手机标识号</th>
<th>手机名称</th>
<th>制造商</th>
<th>价格</th>
<th>简介</th>
<th>照片</th>
</tr>
<%
CachedRowSetImpl rowSetmf=alldata.getAllmobileform();
CachedRowSetImpl rowSetmc=alldata.getAllmobileclassify();
if(rowSetmf==null||rowSetmc==null) {
session.setAttribute("admf",true);
response.sendRedirect("QueryAllMobileForm");
return;
}
else{
session.setAttribute("admf",false);
}
rowSetmf.last();
int totalRecord=rowSetmf.getRow();
out.println("全部记录数"+totalRecord); //全部记录数
rowSetmf.first();
boolean boo=true;
for(int i=1;i<=totalRecord&&boo;i++) {
out.print("<tr>");
for (int k=1;k<=7;k++){
if (k==7){
String purl="D:/apache-tomcat-8.5.37/webapps/mobileshow/image/"+rowSetmf.getString(k);
out.print("<td style='text-align:center'>"+rowSetmf.getString(k)+" <img src='"+purl+"' width=50 height=50></img></td>");
continue;
}
out.print("<td style='text-align:center'>"+rowSetmf.getString(k)+"</td>");
}
out.print("</tr>");
boo=rowSetmf.next();
}
out.print("</table>");
out.print("<p> 请写入你所要添加的手机信息");
%>
<table border='2'>
<tr>
<th>类型</th>
<th>手机标识号</th>
<th>手机名称</th>
<th>制造商</th>
<th>价格</th>
<th>简介</th>
<th>照片</th>
</tr>
<form action='AddMobileForm' method = 'post' ENCTYPE="multipart/form-data">
<tr>
<%
out.print("<td>");
out.print("<select name='addmfid'>") ;
rowSetmc.first();
boolean bo=true;
while(bo){//手机分类的下拉列表
int mfid = rowSetmc.getInt(1);
String mobileCategory = rowSetmc.getString(2);
out.print("<option value ="+mfid+">"+mobileCategory+"</option>");
bo= rowSetmc.next();
}
out.print("</select>");
out.print("</td>");
%>
<td><input type=text name='addmfmv'></td>
<td><input type=text name='addmfmn'></td>
<td><input type=text name='addmfmm'></td>
<td><input type=text name='addmfmp'></td>
<td><input type=text name='addmfms'></td>
<td><input type=FILE name="addmfmc"></td>
</tr>
<td style='text-align:center'>请点击确认添加</td>
<td style='text-align:center'><input type ='submit' value='确定添加' name='addmc'></td>
</from></table>
UpFire.java上传文件和获取各个值的主要代码:
public String getUpFile(){
HttpSession session=request.getSession(true);
String fileName=null;
try{ String tempFileName=(String)session.getId();//用户的session的id
File dir=new File("D:/apache-tomcat-8.5.37/webapps/mobileshow/image");
dir.mkdir();
File f1=new File(dir,tempFileName);
FileOutputStream o=new FileOutputStream(f1);
InputStream in=request.getInputStream();
byte b[]=new byte[10000];
int n;
while( (n=in.read(b))!=-1){ //将用户上传的全部信息存入f1
o.write(b,0,n);
}
o.close();
in.close();
RandomAccessFile random=new RandomAccessFile(f1,"r");
String dataLine=null;
random.seek(0);
dataLine=random.readLine();
while(true) {//获取表各项
if (dataLine.endsWith("mfid\"")) {//获取id
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfid=dataLine;
}
if (dataLine.endsWith("mfmv\"")) {//获取标识号
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfmv=dataLine;
}
if (dataLine.endsWith("mfmn\"")) {//获取名字
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfmn=dataLine;
}
if (dataLine.endsWith("mfmm\"")) {//获取制造商
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfmm=dataLine;
}
if (dataLine.endsWith("mfmp\"")) {//获取价格
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfmp=dataLine;
}
if (dataLine.endsWith("mfms\"")) {//获取简介
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mfms=dataLine;
}
if (dataLine.endsWith("mf\"")) {//获取主键
long ln=random.getFilePointer();
random.seek(ln+2);
dataLine=random.readLine();
mf=dataLine;
}
if (dataLine.startsWith("Content-Type")) {
break;
}
dataLine=random.readLine();
}
long second=0; //含有文件名那行的位置
String secondLine=random.readLine();
random.seek(0);
while(!secondLine.startsWith("Content-Type")){
second++;
if (!secondLine.startsWith("Content")) {//获取文件数据开始位置
second=random.getFilePointer();
}
secondLine=random.readLine();
}
random.seek(second);
secondLine=random.readLine();
System.out.println(secondLine);
//获取第2行中目录符号'\'最后出现的位置
int position=secondLine.lastIndexOf('\\');
//用户上传的文件的名字是:
if (position==-1) {
fileName="";
}
else
fileName=secondLine.substring(position+1,secondLine.length()-1);
byte cc[]=fileName.getBytes("ISO-8859-1");
fileName=new String(cc);
random.seek(second);
//获取第4行回车符号的位置:
long forthEndPosition=0;
int forth=1;
while((n=random.readByte())!=-1&&(forth<=3)){
if(n=='\n'){
forthEndPosition=random.getFilePointer();
forth++;
}
}
//根据用户上传文件的名字,将该文件存入磁盘:
File f2=new File(dir,fileName);
RandomAccessFile random2=new RandomAccessFile(f2,"rw");
//确定出文件f1中包含用户上传的文件的内容的最后位置,即倒数第6行。
random.seek(random.length());
long endPosition=random.getFilePointer();
long mark=endPosition;
int j=1;
while((mark>=0)&&(j<=6)){
mark--;
random.seek(mark);
n=random.readByte();
if(n=='\n'){
endPosition=random.getFilePointer();
j++;
}
}
//将random流指向文件f1的第4行结束的位置:
random.seek(forthEndPosition);
long startPoint=random.getFilePointer();
//从f1读出用户上传的文件存入f2(读取第4行结束位置至倒数第6行之间的内容)
while(startPoint<endPosition-1){
n=random.readByte();
random2.write(n);
startPoint=random.getFilePointer();
}
random2.close();
random.close();
f1.delete(); //删除临时文件
return fileName;
}
catch(Exception exp){
System.out.println(exp);
return null;//上传失败
}
}
5、其他功能模块的实现和流程都和上面介绍的一致。
三、系统未完成部分
1、未加入管理员登录注册模块
2、未对错误操作和操作错误进行提示
3、未添加订单管理的功能模块
上一篇: 入门 JVM 这一篇就够了
下一篇: weex-加载js文件
推荐阅读
-
“智多星”智能手机销售网后台管理系统设计
-
毕业设计——>基于JAVA + JSP + Servlet + Mysql的 留言板前台 和 后台管理系统
-
ASP.NET MVC5实现芒果分销后台管理系统(一):系统结构设计,集成AutoMapper,Log4net
-
一种小型后台管理系统通用开发框架中的Cache缓存设计
-
后台管理系统权限设计
-
ASP.NET MVC5实现芒果分销后台管理系统(一):系统结构设计,集成AutoMapper,Log4net
-
一种小型后台管理系统通用开发框架中的Cache缓存设计
-
毕业设计——>基于JAVA + JSP + Servlet + Mysql的 留言板前台 和 后台管理系统