HTML+Ajax vs JSP
HTML+Ajax vs JSP
https://bbs.csdn.net/topics/390939813
受益颇多的讨论
“前端使用HTML+Ajax,后端使用Java Servlet,这样完全可以做到前后端分离,前端那天换成了移动App或者桌面App,后端程序可重用、无需重新开发,而后端服务如果需要换成.Net或PHP,前端也可完全重用,前后端做到100%解耦,相互只使用json传递数据,这就是前后端分离的架构思想;至于前端展现为何还有jsp、asp、aspx、php,不是因为别的,只是因为历史遗留的原因”
“大型的项目肯定是HTML+AJAX,HTML只要浏览器便能解析了,像JSP还要服务器解析编译.jsp这种只能在自己的小项目或者后台系统,像平台级的项目都是HTML+AJAX,这样前后端分离,前后端可以同时由不同的分工开发.而且HTML是可以做nginx的,后端只需要提供REST风格的接口即可.不论是转向移动开发还是后台是其它语言,对于前端来说都不管,互联网型的项目都是HTML+AJAX,至于数据绑定可以用angular.JSP这种就把前后端绑的很紧了,不利于大型,多语言,以及访问量大的项目”
“全站ajax比较流行的做法,这样做的好处就是所有处理都是异步的用户体验较好,另外有利于切割,HTML,css,js什么的可以单独的部署到静态文件处理比tomcat更高性能的apache服务器上,tomcat仅作为数据处理服务器。”
具体怎么用呢?举个例子,重点看注释
package com.jiading.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 优化servlet
* 将现在的一个功能一个servlet优化为一个模块一个servlet
* 数据库一张表对应一个servlet,在servlet中提供不同方法以完成不同的请求
* 我们写的Servlet不再继承自HttpServlet,而是继承这个我们写的BaseServlet
* BaseServlet继承自HttpServlet,对原有方法改造以完成方法的分发
* 注意我们并不配置BaseServlet的注解,因为我们不希望它被直接访问到,它只是用来被继承的
*/
@Controller
public class BaseServlet extends HttpServlet {
/**
* 这里我们没有选择springMVC的Conytroller和jsp之间的数据传递方法,也就是使用Model传递数据,而是依然使用了普通的json,
* 使用jackson将对象转换为json,然后使用jackson的writeValue方法将json写回response中供前台jquery调用
* @param obj
* @param response
* @throws IOException
*/
//序列化json方法,将传入的对象序列化并写回客户端
public void writeValue(Object obj,HttpServletResponse response) throws IOException {
//序列化json返回
/*
Jackson是著名的将java对象转换为json类型的工具
ObjectMapper是jackson的核心对象
*/
ObjectMapper mapper=new ObjectMapper();
//手动设置返回值类型
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),obj);
}
//将传入的对象序列化为json并返回给调用者
public String writeValueAsString(Object obj) throws JsonProcessingException {
ObjectMapper mapper=new ObjectMapper();
String s = mapper.writeValueAsString(obj);
return s;
}
}
package com.jiading.controller;
import com.jiading.domain.Category;
import com.jiading.service.CategoryService;
import com.jiading.service.impl.CategoryServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@Controller
@RequestMapping("/category")
public class CategoryServlet extends BaseServlet{
@Autowired
CategoryService service;
List<Category>all;
/**
* 因为使用了springMVC框架,每个方法有自己的映射,所以不再需要之前的在baseServlet中使用反射来调用servlet方法的方式了,可以直接使用类/方法的mapping访问
* 而很重要的一点是,这些对于前端来说是透明的,代码都不需要改
* 而如果我们依然使用json和response传递参数,我们就真正实现了前后端分离
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/findAll")
public void findAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
all = service.findAll();
writeValue(all,response);
}
@RequestMapping("/findOne")
public void findOne(HttpServletRequest request, HttpServletResponse response) throws IOException {
String cid = request.getParameter("cid");
int cidInt=Integer.parseInt(cid);
writeValue(all.get(cidInt-1),response);
}
}

浙公网安备 33010602011771号