关于jsp+servlet+mybatis+bootstrap项目总结

项目总结:

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很特殊。
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值