项目总结:
1.做完一个前端使用ajax请求的项目,记录一下使用jquery 进行一些业务功能的实现。 2.这个项目后端可以很方便的修改成**SSM**项目,所以前端的一些知识点很有记录 的必要。1.对于传统的Servlet处理controller层业务对于前端请求,需要进行路径的判断,根据不同的路径请求使用相应的请求方法进行业务处理。
请求路径的获取 String path = request.getServletPath();进行路径的判断
// 这样济宁判断就可以很好的管理Servlet业务层。在一个controller文件处理多个同一类业务。 if ("/workbench/clue/getUserList.do".equals(path)){ addUser(request,response); }else if ("/workbench/clue/saveClue.do".equals(path)){ saveClue(request,response); }....几种常用的util方法
进行主键ID生成的方法 import java.util.UUID; /** * 生成32位的一个字符串做为主键 */ public class UUIDUtil { public static String getUUID(){ return UUID.randomUUID().toString().replaceAll("-",""); } }进行MD5加密的方法
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * 进行MD5加密的一个方法 */ public class MD5Util { public static String getMD5(String password) { try { // 得到一个信息摘要器 MessageDigest digest = MessageDigest.getInstance("md5"); byte[] result = digest.digest(password.getBytes()); StringBuffer buffer = new StringBuffer(); // 把每一个byte 做一个与运算 0xff; for (byte b : result) { // 与运算 int number = b & 0xff;// 加盐 String str = Integer.toHexString(number); if (str.length() == 1) { buffer.append("0"); } buffer.append(str); } // 标准的md5加密后的结果 return buffer.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return ""; } } }进行controller层结果转发前端的方法
// 使用时可以将Boolean值或是obj值传回到前端ajax请求。 import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; public class PrintJson { //将boolean值解析为json串 public static void printJsonFlag(HttpServletResponse response,boolean flag){ Map<String,Boolean> map = new HashMap<String,Boolean>(); map.put("success",flag); ObjectMapper om = new ObjectMapper(); try { //{"success":true} String json = om.writeValueAsString(map); response.getWriter().print(json); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //将对象解析为json串 public static void printJsonObj(HttpServletResponse response,Object obj){ /* * Person p * id name age * {"id":"?","name":"?","age":?} * * List<Person> pList * [{"id":"?","name":"?","age":?},{"id":"?","name":"?","age":?}, {"id":"?","name":"?","age":?}...] * * Map * key value * {key:value} * */ ObjectMapper om = new ObjectMapper(); try { String json = om.writeValueAsString(obj); response.getWriter().print(json); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }进行系统时间获取的方法
import java.text.SimpleDateFormat; import java.util.Date; /** * 进行事件获得的一个封装 * 这里采用的是时分秒毫秒的形式,占有19个字符; */ public class DateTimeUtil { public static String getSysTime(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String dateStr = sdf.format(date); return dateStr; } }代理对象获取的方法
// 使用方式: // 这里会引入一个Dao对象: // private UserDao userDao = SqlSessionUtil.getSqlSession().getMapper(UserDao.class); import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SqlSessionUtil { private SqlSessionUtil(){} private static SqlSessionFactory factory; static{ String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } factory = new SqlSessionFactoryBuilder().build(inputStream); } private static ThreadLocal<SqlSession> t = new ThreadLocal<SqlSession>(); public static SqlSession getSqlSession(){ SqlSession session = t.get(); if(session==null){ session = factory.openSession(); t.set(session); } return session; } public static void myClose(SqlSession session){ if(session!=null){ session.close(); t.remove(); } } }定义编码过滤器
import javax.servlet.*; import java.io.IOException; // 定义一个编码过滤器 public class EncodingFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 过滤请求和响应的编码 servletRequest.setCharacterEncoding("UTF-8"); servletResponse.setContentType("text/html;charset=utf-8"); filterChain.doFilter(servletRequest,servletResponse); } }2.前端页面的一些方法:
分页处理显示:
// 定义pageList函数,进行分页操作 function pageList(pageNo,pageSize) { // 每次执行都会对全选框进行刷新 $("#quanCheckbox").prop("checkd",false); //alert("pageList执行了"); // 查询前将隐藏域中的值重新输入到搜索框 /** * 这里犯了一个错误,缺少一个括号,接下来就不执行了..... * 还不会去报错误的信息!!!! */ $("#search-owner").val($.trim($("#hidden-owner").val())); $("#search-name").val($.trim($("#hidden-name").val())); $("#search-startDate").val($.trim($("#hidden-startDate").val())); $("#search-endDate").val($.trim($("#hidden-endDate").val())); // 进行ajax请求 $.ajax({ url: "workbench/activity/pageList.do", data:{ "pageNo":pageNo, "pageSize":pageSize, "owner":$.trim($("#search-owner").val()), "name":$.trim($("#search-name").val()), "startDate":$.trim($("#search-startDate").val()), "endDate":$.trim($("#search-endDate").val()), }, type:"get", dataType:"json", success:function (data) { var html=""; // 对于这里的返回数据进行判断 $.each(data.activityList ,function (i,n) { // 将返回的数据进行添加表格操作 html +='<tr class="active">'; html +='<td><input type="checkbox" id="dancheckbox" value="'+n.id+'"/></td>'; html +='<td><a style="text-decoration: none; cursor: pointer;" οnclick="window.location.href=\'workbench/activity/detail.do?id='+n.id+'\'">'+n.name+'</a></td>'; html +='<td>'+n.owner+'</td>'; html +='<td>'+n.startDate+'</td>'; html +='<td>'+n.endDate+'</td>'; html +='</tr>'; }) // 市场活动表显示 $("#activitybody").html(html); //$("#activitybody").html('<td>能不能显示?</td>'); // 进行分页操作 // 计算总页数 var totalPages = data.total%pageSize==0? data.total/pageSize:parseInt(data.total/pageSize)+1; $("#activityPage").bs_pagination({ currentPage: pageNo, // 页码 rowsPerPage: pageSize, // 每页显示的记录条数 maxRowsPerPage: 20, // 每页最多显示的记录条数 totalPages: totalPages, // 总页数 totalRows: data.total, // 总记录条数 visiblePageLinks: 3, // 显示几个卡片 showGoToPage: true, showRowsPerPage: true, showRowsInfo: true, showRowsDefaultInfo: true, onChangePage : function(event, data){ pageList(data.currentPage , data.rowsPerPage); } }); } }); }对于多选框进行判断
// 对于勾选框进行判断 var $checkbox = $("#dancheckbox:checked"); if ($checkbox.length==0){ alert("请选择要修改的对象!"); }else if($checkbox.length>1){ alert("只能进行一个单选框的选择,请重新选择!"); }else { var id = $checkbox.val(); // 获取选择的id值 .................动态生成的多选框进行判断
// 对于表中的复选框进行事件的绑定,因为是动态的不能使用普通的方式 //语法:$(需要绑定的元素的有效的外层元素).on(绑定事件的方式,需要绑定的元素的jquery对象,回调函数) $("#activitybody").on("click",$("#dancheckbox"),function () { $("#quanCheckbox").prop("checked",$("#dancheckbox").length==$("#dancheckbox:checked").length); })bootstrap添加时间控件
// 添加时间控件,年月日,,在要添加时间控件的input标签的class属性中添加一个time即可 $(".time").datetimepicker({ minView: "month", language: 'zh-CN', format: 'yyyy-mm-dd', autoclose: true, todayBtn: true, pickerPosition: "bottom-left" });前端页面处理时添加的内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> // 同时在<html><head>中添加<base href="<%=basePath%>"/>键盘敲击回车事件绑定
// 键盘敲击回车 $("#relationText").keydown(function (event) { if (event.keyCode==13){ ..........代码块 } }窗口置顶
设置顶层窗口的方式: if(window.top!=window){window.top.location=window.locaton;}3.关于重定向和转发:
重定向路径如何写? 在实际项目开发过程中,关于路径的使用应该一律使用绝对路径 关于转发和重定向: 转发:使用的是绝对路径不加/项目名的方式,称为内部路径 重定向:前面必须以/项目名开头,后面跟具体路径 转发和重定向的区别: 转发后,路径会停留在原来的路径上 重定向项目路径名通常写活:request.getContextPath() response.sendRedirect(request.getContextPath()+"/login.jsp");4.数据字典
cache(缓存机制)解决数据字典存储问题 缓存:内存中的数据 在这个项目中做的是一种服务器缓存机制,将数据存储到服务器内存中 如果服务器处于开启阶段,我们就可以从该缓存汇总一直能够读取数据 application(全局作用域,上下文作用域) 将数据保存的手段:application.setAtttribute(); 取数据:application.getAtttribute(); 数据字典:指在应用程序中,做表单元素选择内容用的相关的数据 例如:下拉框 使用监听器:监听所有域对象的创建和销毁;在监听器中将数据存储到上下文作用域中; 在缓存中取数据时,前端页面首先加:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 遍历方式: applicationScope存储在字典中关键字 <c:forEach items="${applicationScope}" var="appl"> <option value="${appl.value}">${appl.text}</option> </c:forEach>5.jsp内置对象
jsp中有九个内置对象:application,pageContext,page,session,request,out,response,config 通过内置对象中的作用域对象,可以使用java脚本进行接收url中带过来的参数 还可以使用el表达式${param.xxx},从参数中进行取值,不是从域中取值 注意:在el表达式中不存在九个内置对象,所有的对象需要通过pageContext.xxxx取得 *********************** pageContext很特殊。