javaweb 课设常见问题及其解决总结 前后端交互部分

前言

做完课设很久了,做课设的过程中遇到了很多问题,有些问题很沙雕,有些问题坑很深,但是不论什么,解决他们花费了很长时间和精力,甚至让博主几近崩溃(拼写错误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

这个相对容易,使用GsontoJson方法即可,传入对象,返回对应的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方法参数列表中加入responserequest。这样controller方法就可以将数据存放到request中或者通过request存放到session中。

ajax传递

PrintWriter

在servlet技术中,可以使用PrintWriter来向前端传递数据:

PrintWriter out = response.getWriter();
out.print(/*内容*/);
out.close();

在controller方法中同样可以使用这个对象,就像刚刚说的,我们可以在参数列表中加入response对象,后面的步骤就一样了。但是问题就在于PrintWirterout方法不能自动翻译对象或者集合,这些东西需要提前处理成为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程序内部相互调用。


课设成品分享一下:

课设制作的一些步骤:

猜你喜欢

转载自blog.csdn.net/wayne_lee_lwc/article/details/107442209