您的位置:首页 > 其它

超市账单管理系统项目学习总结

2016-05-25 00:00 459 查看
最近做了一个简单的超市管理系统项目, 现在总结一下学习的过程:

首先开始接触这个项目时,还是感觉挺棘手的,因为第一次综合java、html、js、oracle、jsp、jQuery和Ajax内容来完成这个项目还是有一定的困难的, 并且项目拿到手时没几天的做,所以很赶,

今天刚完成, 总结一下自己在做这个项目遇到的一些问题.

先看一下项目的一个需求,主要就实现一下几个功能.





遇到的问题如下:

1. 首先就是遇到session的麻烦, 因为我在登录相应的servlet设置了session的属性,使用${usersession.loginName}却取不出来,并且在MyEclipse中报如下错误:





而这直接耽误我项目的许多功能无法实现, 因为其他功能需要session中的用户编号等信息, 后来花了好长时间才发现是自己在用户退出界面使用了session失效导致的,但是session失效必须要点击退出才行,为什么我刚登入,就让我session失效,还是不太懂其中原因,其中代码如下:





<script type="text/javascript">
function logout() {
<%
session.invalidate();;
%>
top.location = "login.jsp";
}
</script>

后来发现是这个导致的就修改了,使用jQuery实现退出功能,即jquerysession.js, 从网上拷贝下来的. 代码如下:





<script type="text/javascript" src="../js/jquerysession.js"></script>
<script type="text/javascript" type="text/javascript">
$(function(){
$("#logout").on("click", function(){
$.session.remove("usersession");
top.location="login.jsp";
});
});
</script>

2. 忘记写过滤器拦截用户越过登陆页面直接进入系统,后来改了一下就好,其中filter关键代码如下:

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 过滤用户越过登录界面,直接进入启发页面
HttpServletRequest hsrt = (HttpServletRequest) request;
HttpServletResponse hsre = (HttpServletResponse) response;

//获取根目录所对应的绝对路径:
String currentURL = hsrt.getRequestURL().toString();
//截取到当前文件名用户比较
String targetURL = currentURL.substring(currentURL.indexOf("/", 31), currentURL.length());
//打印targetURL
System.out.println("========targetURL = " + targetURL);
HttpSession session = hsrt.getSession(false);
//判断当前页是否是重定向以后的登录页面,如果是就不做session的判断,防止出现死循环
if(!"/login.jsp".equals(targetURL)){
if(session==null || session.getAttribute("usersession")==null){
//如果session为空,表示用户没登录就重定向到login.jsp页面
hsre.sendRedirect(hsrt.getContextPath() + "/page/login.jsp");
return;
}
}
//加入filter链继续向下执行
//调用filterChain对象的dofilter方法.filter接口的doFilter方法对象作为它的参数
//.在调用此对象的doFilter方法时,激活下一个相关的过滤器.如果没有另一个过滤器与servlet
//或jsp页面关联,则servlet或jsp页面激活.
chain.doFilter(request, response);
}

3. 在Oracle数据库表中存在性别这样的字段, 其存储的只是数字(0代表男, 1代表女), 而页面展示必须是字符串, 所以自己对性别这样的字段采用枚举Enum类型, 在枚举中设置了两个私有属性name和index, 这样就方便在数据库存取数据, 并且经枚举的调用写到一个使用类中, 然后在dao层调用这个实用类来进行判断性别, 将数据,其实这样不是很好, 而是应该在数据表对应的那个实体类直接进行判断, 这样就是很方便.

4.由于java中设置了一些数据库字段为枚举类型,这导致我在写Ajax回调json类型数据data时出现了问题,

像性别使用data.sex给的返回值是manager, data.sex.name的值是undefined,所以导致查询后,枚举信息不能解析,后来在网上找了一些处理json枚举类型数据的方法, 其中json使用的插件是Gson.jar.解析枚举类型的json主要是写一个SexAdapter类,

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
//处理Ajaxa回显数据是json类型中存在枚举数据
public class SexAdapter extends TypeAdapter<Gender> {
@Override
public Gender read(JsonReader reader) throws IOException {
if(reader.peek()==JsonToken.NULL){
reader.nextNull();
return null;
}
String gender = reader.nextString();
if(gender.indexOf("男")>-1){
return Gender.man;

}else if(gender.indexOf("女")>-1){
return Gender.woman;
}
return null;
}

@Override
public void write(JsonWriter writer, Gender gender) throws IOException {
if(gender==null){
writer.nullValue();
return;
}
//writer.value(gender.getName)
switch(gender.getIndex()){
case 0:
writer.value("男");
break;
case 1:
writer.value("女");
break;
}
}
}

在Ajaxa请求的servle中解析一下枚举:

System.out.println("========查询功能========");
String name = request.getParameter("name");
System.out.println("========查询的用户名 = " + name + "========");
User user = new User();
IUserService userService = new UserServiceImpl();
user.setName(name);
User userInfo = userService.getUserInfo(user);
//String jsonUser = JSON.toJSONString(userInfo);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.registerTypeAdapter(Gender.class, new SexAdapter()).create();
String json = gson.toJson(userInfo);
System.out.println(json.toString());
out.print(json);
out.close();

-----------------------------------------------------------------------------------------------------------------------------------------

{"userId":2,"name":"Asa","loginName":"admin","loginPwd":"6811672","sex":"男","sexIndex":0,"birthDate":"May 15, 1990 12:00:00 AM","phone":"13522303795","address":"北京海淀","userType":"admin"}

对了Ajax中请求的url的名字之前没有弄清楚怎么写, 导致一直无法调用, 后来才调通, 现在再记录下,Ajax中的URL写成’/项目名/对应servlet’或者’${pageContext.request.contextPath}/对应Servlet’.

5. 对用户权限的控制没有进行详细设计,其实一个用户对应多个角色, 一个角色对应多个用户, 是一种多对多的关系, 这个如下设计就显得很重要, 我们应该在数据库中在多创建一张用户权限表,将不同的用户和对应权限存入数据,在根据这个判断来调前台的一些访问页面, 同时还有一个非常重要的问题就是超级用户的设置, 这个用户不仅能够访问系统所有页面, 同时还不能被数据库删除, 这个是应该考虑到的.

用户

角色

权限

用户-(M)---角色(N)

角色(1)----权限(M)

用户(M)-----和权限----(N)

权限表

6. 对Oracle表进行修改使用update:

update test set name='zhurhyme1', code='007' where i_d='1';

update test set (name,code) = (select 'zhurhyme3','007' from dual) where i_d='1';

7.Jsp页面中获取页面的路径使用EL表达式

${pageContext.request.contextPath}

${param.name} 等价于 request.getParamter("name"),这两种方法一般用于服务器从页面或者客户端获取的内容

${requestScope.name} 等价于 request.getAttribute("name"),一般是从服务器传递结果到页面,在页面中取出服务器保存的值。

jsp页面按要求展示用户出生日期:

先在页面引入:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<fmt:formatDate value='${userInfo.birthDate}'pattern='yyyy-MM-dd' />

8. java与oracle数据库对应日期格式的转化:

String birthDate = request.getParameter("birthDate");

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Date birthTime = null;

try {

birthTime = sdf.parse(birthDate);

} catch (ParseException e) {

e.printStackTrace();

}

java.sql.Date sqlDate=new java.sql.Date(birthTime.getTime());

9.用myeclipse导入jquery的js文件会有红色叉叉

解决方案是对着这个js文件点右击MyEclipse-->Exclude From Validation,然后再右击,MyEclipse-->Run Validation 即可

10.Java web从jdk1.8环境到jdk1.7环境下servlet和filter报许多红叉子的解决办法:

1 右击项目>> build path>>configuer build path>>Libiraries>>add Library>>MyEclipse Libiraries>>选择相应的javaee

2





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: