前言
做完课设很久了,做课设的过程中遇到了很多问题,有些问题很沙雕,有些问题坑很深,但是不论什么,解决他们花费了很长时间和精力,甚至让博主几近崩溃(拼写错误debug一下午是真的难顶)。不过更多的情况是各路博主的百家饭,把一个一个的技术要点搞明白。
我认为这是值得的,因为发现问题——寻找答案——解决问题的过程就是一种高效学习。好在浏览器有浏览记录,能让我看见做课设的几周的心路和成长历程 (第一次提到浏览记录而没产生快删的想法)
在此,我打算把做课设过程中遇到的问题进行一下汇总,如果你也在做javaweb的课设或者将来要做,不妨先收藏一下,简单看一看,有个心理准备。已经有过实践的和我一样的入门小白不妨来寻找一下共鸣,顺道一起学习进步;经验丰富的sto技术大佬orz就请多指教,欢迎指正和补充。
总之话不多说,搞起来先!!
这个博客相当于问题汇总,会一直更新哒,欢迎补充~~。
前端数据处理
前后端数据处理问题主要集中在数据与json字符串的相互转化上。
前端js中有内置对象JSON
可对数据进行处理:
对象转json
使用JSON
对象的stringify方法就可以将对象或者集合转化成json字符串。
例如,将一个对象转化成为json并输出:
var obj;
...
alert(JSON.stringify(obj));
...
这个操作在前端向后端传值时候非常常用。
json转对象
使用JSON
对象的parse
方法可以将json字符串转化为对象或者集合。
例如,ajax后台传来了一个对象list(在responseText
中),我们可以这样解析它:
var objArray;
...
if(xml.readyState == 4){ //xml是ajax XMLHttpRequest对象
objArray = JSON.parse(xml.responseText); //解析后台传来的json数据
}
...
后端数据处理
后端处理数据的主要问题也是对象与json之间的互相转化。这个处理方式有很多,这里仅展示使用Gson
对象进行处理这一种途径。
首先,使用Gson对象需要引包:在引了包之后,就可以使用Gson对象了。
对象转json
这个相对容易,使用Gson
的toJson
方法即可,传入对象,返回对应的json字符串。
例如,将vip对象转化为json格式:
...
Gson gson = new Gson();
Vip vip = new Vip();
String vipJson = gson.toJson(vip);
...
json转对象
json转对象需要用到Gson的fromJson方法,这个方法需要传入json以及转化类型:
例如,将json格式的vip对象转化为vip对象:
...
Gson gson = new Gson();
Vip vip = gson.fromJson(vipJson,Vip.class);
...
但是当json是个list时,就会产生一些问题。比如List
不能在泛型后拿到class
,以vip对象集合为例:
就会报错。
一个好的解决办法是以数组的形式拿出来,如果需要,再转成List也可
gson.fromJson(vipsJson, Vip[].class); //转成数组形式
List<Vip> vipList = Arrays.asList(gson.fromJson(vipsJson, Vip[].class));//数组进而转成list
前端向后端传输数据
前端向后端传输数据一种非常常见的形式是form表单,这里就不说这它了。其实前端向后端传输数据的主要问题就在于数据处理。能将数据转化成为json字符串,之后再在请求中拼接字符串即可。例如,添加vip用户,不使用form表单:
var vip; //存储vip对象
...
function SubmitVip(){
window.location.href = "{pageContext.request.contextPath}" + "/vip/addVip.action?vip=" = JSON.stringify(vip);
}
后端向前端传输数据
servlet式传递
可以使用在controller方法参数列表中加入response
和request
。这样controller方法就可以将数据存放到request中或者通过request存放到session中。
ajax传递
PrintWriter
在servlet技术中,可以使用PrintWriter
来向前端传递数据:
PrintWriter out = response.getWriter();
out.print(/*内容*/);
out.close();
在controller方法中同样可以使用这个对象,就像刚刚说的,我们可以在参数列表中加入response
对象,后面的步骤就一样了。但是问题就在于PrintWirter
的out
方法不能自动翻译对象或者集合,这些东西需要提前处理成为json
格式。
我们以ajax
异步校验用户为例。得到用户的账户,如果用户存在,则返回其密码,否则返回空字符串。
@RequestMapping("vip")
public class VipController{
@Autowired
VipService service;
@RequestMapping("checkUser")
public void checkUser(HttpServletResponse response,String username){
PrintWriter out = response.getWriter();
out.flush(); //随手清一下好习惯
Vip vip = service.getVipByUsername(username); //根据用户名获得用户
if(vip == null){
out.print(""); //用户不存在,返回空字符串
}else{
out.print(vip.getPassword()); //用户存在,返回密码
}
out.close(); //好开好关
}
}
@ResponseBody注解
另外,还有一种更加方便的方法,就是在controller方法上使用@ResponseBody
注解。这个注解表示方法返回值将被当做请求结果返回并会自动给予解析,结果将以json的形式返回前台。自动解析这个步骤是PrintWriter
不具备的,对象必须使用gson
转化为json
格式。
同样是上面的例子,这次试用@ResponseBody
完成:
@RequestMapping("vip")
public class VipController{
@Autowired
VipService service;
@RequestMapping("checkUser")
@ResponseBody
public String checkUser(String username){ //这里不需要response对象
Vip vip = service.getVipByUsername(username); //根据用户名获得用户
if(vip == null){
return ""; //用户不存在,返回空字符串
}else{
return vip.getPassword(); //用户存在,返回密码
}
}
}
一下子变得简单了对象吧,逻辑上也比较自然,就像是java程序内部相互调用。
课设成品分享一下:
课设制作的一些步骤: