在粗略的学习了JAVA后跟做了黑马旅游网的项目后,总结供自己以后回顾。
技术选型
前端内容
//发送AJAX请求,提交表单数据
$("#registerForm").submit(function() {
$.post("user/regist",$(this).serialize(),function (data) {
//接受数据进行对应操作 data就是result对象
if(data.flag){
//注册成功,跳转页面
location.href="register_ok.html";
}else {
//注册失败,执行页面响应
$("#errorMsg").html(data.errorMsg);
}
});
});
如上诉例子当中为普遍用(本案例中)的模板。
另一个比较重点的就是中间很多页面都采用的字符串拼接来完成的动态页面的展示。(虽然麻烦,但是管用,不得不说真的很麻烦)这是因为不是JSP页面不能用 EL 表达式和 JSTL 标签
3.后端内容
用到Redis, 不细讲。
首先请求的过程中用Filter来处理设置编码方式和响应乱码的问题
//注解的方式配置,/*表示处理所有的资源。
@WebFilter("/*")
public class CharchateFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//父接口转为子接口
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) resp;
//获取请求方法
String method = request.getMethod();
//解决Post请求中文乱码的问题
if(method.equalsIgnoreCase("post"))
{
request.setCharacterEncoding("utf-8");
}
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
//放行
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
其次在为了不是一个功能就去增加一个Servlet ,从中抽取了一个BaseServlet.
在查看HttpServlet 、GenericServlet 、 Servlet之间的关系时,我们可以看到其中HttpServlet继承的service方法是针对于HTTP情况下不同的请求方式完成方法的分发工作,如下所示
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
借鉴这种思想写一个BaseServlet继承HttpServlet ,然后对其中的方法进行重写。这样在请求时找到继承BaseServlet的***Servlet时(注解配置中找到),然后调用了如下的方法,这样就可以在一个Servlet中找到某个方法,减少了Servle的数量。
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//完成方法的分发
//1、获取请求的路径
String requestURI = req.getRequestURI(); // /travel/user/**
//2、获取方法的名称
String substring = requestURI.substring(requestURI.lastIndexOf("/") + 1);
//获取方法的对象Method
try {
try {
//this,谁调用,谁就是这个this
Method method = this.getClass().getMethod(substring, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
其中一个继承BaseServlet的Servlet的例子如下
@WebServlet( "/user/*")
public class UserServlet extends BaseServlet {
/*
* 注册功能
* */
public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
其中后端用的Service主要是根据业务需求写方法共Servlet调用,方法内部调用DAO层的各个方法。涉及JdbcTemplate,SQL语句。这些不展开。
通过这个小Demo粗略的了解各方面做什么,下一步回头自己再稳固一下基础。