1.json:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <script type="text/javascript"> // JSON: javascript object notation(js的对象诠释) // JSON也是一个对象,首先json对象需要被{}包裹,里面的内容键值对对应(key : value),键值对和键值对用逗号(,)隔开,最后一个键值对一定不能加逗号(,) var testJson = { name : "zhangsan", age : 31, sex : "male" } var testJson2 = '{"name" : "zhangsan", "age" : 31, "sex" : "female"}'; // json格式的字符串 function testFunction() { var jsons = testJson; var jsons2 = testJson2; alert(jsons); alert(jsons2); alert(jsons.name); //json也可以通过key来取value Map转json json转Map //例1: 把json格式的字符串转换为json对象 // 方法一:eval(); /* eval("var test = "+testJson2); alert(test); alert(test.age); */ // 方法二:parse(); alert(JSON.parse(testJson2)); //如果使用JSON.parse()函数,就必须把单引号写在最外面'{"name" : "zhangsan", "age" : 31, "sex" : "female"}',因为parse()函数遵循json格式,json默认不支持单引号 //例2:把json对象转换为json格式的字符串 // JSON.stringify()函数可以把json对象转换为json格式的字符串 alert(JSON.stringify(testJson2)); } </script> </head> <body> <input type="button" value="触发" onclick="testFunction();" /> </body> </html>
2.ajax:
又称为局部刷新
Asynchronous Javascript And XML(异步的js和xml文档)
是一种新的交互式技术
一般用处:分页,三级联动...
login:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> <script type="text/javascript" src="js/jquery-3.2.1.min.js"></script> <script type="text/javascript"> $(function() { $("#uname").on("blur", function() { var username = $("#uname").val(); if (username != null && username != "") { // 获取到了用户输入的username的值 // 以get的请求方式发送(我乐意!) /* $.get("user.sxt", "type=checkUsername&username=" + username, function(data) { // 服务器端返回的数据 // data是形式参数,接收的是服务器端(servlet)返回回来的数据 }); */ // 以post的请求方式发送 /* $.post("user.sxt", "type=checkUsername2&username="+username, function(data){ }); */ // 无论用post还是get /** $.post/get("请求的地址(url)", "需要传递的参数", function(data){ // 服务器端向客户端响应的数据(json) }); */ // 究极版本的ajax // ajax的终极版本,同样遵循json的格式,key : value为一个整体,每个key和value用:隔开,每一个键值对之间用逗号隔开,最后一个键值对不能有逗号 /* $.ajax({ async : true, //(是否异步,默认为true) data : {"type":"checkUsername", "username" : username}, // 客户端向服务器端发送的数据,类型为object method : "get", // 请求方式(get/post) //type和method是一样的,都是选择请求的方式,在jQuery1.9版本之前用type,之后用method url : "user.sxt", // 客户端向服务器端发送数据的地址--->请求地址 success : function(data) { // 当成功响应以后,接收到的数据-->服务器端向客户端响应的数据 alert(data);// data服务器端向客户端响应的数据 } }); */ // function(data)只能接收字符串 /* $.get("user.sxt", "type=checkUsername&username=" + username, function(data) { // 服务器端返回的数据 // data是形式参数,接收的是服务器端(servlet)返回回来的数据 alert(data); }); */ // function(data)只能接收json对象 $.getJSON("user.sxt", "type=checkUsername&username=" + username, function(data){ alert(data.username); }); } }); }); </script> </head> <body> 用户名: <input type="text" name="username" id="uname" /> </body> </html>
UserServlet:
package cn.zzsxt.lee.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.gson.Gson; import cn.zzsxt.lee.web.entity.User; @WebServlet("/user.sxt") public class UserServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String method = request.getMethod().toLowerCase(); System.out.println(method); String type = request.getParameter("type"); if ("get".equals(method) && "checkUsername".equals(type)) { checkUsername(request, response); } else if("post".equals(method) && "checkUsername2".equals(type)) { checkUsername2(request, response); } } private void checkUsername2(HttpServletRequest request, HttpServletResponse response) { String username = request.getParameter("username"); System.out.println("------------------------------"+username); // 从数据库中查询是否存在zhangsan这个用户名 } private void checkUsername(HttpServletRequest request, HttpServletResponse response) throws IOException { String username = request.getParameter("username"); System.out.println("------------------------------"+username); // 从数据库中查询是否存在zhangsan这个用户名 User user = new User(); user.setUsername(username); //response.getWriter().print(username+":天青色等烟雨,而我在等你");// 服务器向客户端响应的数据 // 把user对象拆开,拼成一个json格式的字符串 Gson gson = new Gson(); String json = gson.toJson(user); response.getWriter().print(json); // response.getWriter().print(new Gson().toJson(user)); } }
3.path:
UserServlet:
package cn.zzsxt.lee.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/user.sxt") public class UserServlet extends HttpServlet { /** * 所有的servlet,凡是以/开头的路径,都定位到项目的根目录localhost:8080/项目名 */ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("我是来处理用户请求的servlet,我被访问了"); // 开始处理请求 // 请求处理完毕,需要重定向 response.sendRedirect(request.getContextPath()+"/b/bb/bb3.jsp"); } }
Index:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <a href="a/a.jsp">跳转a</a> <a href="a/aa/aa.jsp">跳转aa</a> <pre> web工程的WebRoot文件夹:称之为项目的根目录 http://localhost:8080/zzsxt--->项目的根目录 Java代码中src资源文件夹也称之为项目的根目录 ../向上跳出一层 相对路径:怕文件名发生改变 以当前页面作为中心,向目标路径进行跳转 绝对定位:怕项目名发生改变 直接会定位到服务器的根目录 localhost:8080就称之为服务器根目录 每一次跳转都以服务器的根目录作为了中心:localhost:8080 如果部署名发生了改变,就以服务器(tomcat)的webapps文件夹下的项目名为准 以后在实际开发中,所有的路径跳转都需要使用绝对定位
而且servelt跳转jsp页面的时候 如果是重定向:response.sendRedirect(request.getContextPath+"/index.jsp");就以这个路径跳转 如果是请求转发的情况下:request.getRequestDispatcher("/index.jsp").forward(request, response);就以这个路径开始跳转 </pre> </body> </html>
4.Oracle分页实例:
Servlet:
private void selectAllAdmin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 首先要定义每页显示的条数 int pageSize = 2; // 获取从页面传输过来页码数 pageCount-->当前页面的页码数 String pageCount = request.getParameter("pageCount"); // 如果接收不到pageCount,页面并没有传过来-->这是第一页 if (pageCount == null) { // 如果pageCount == null 证明是第一页 pageCount = 1 + ""; } // 当前页码数?????? // 总条数/每页的条数-->总页数 int totalCount = adminService.selectAminCounts(); if (totalCount > 0) { // 数据库是有数据的,如果没有数据就返回的是0 int totalPage = (int) Math.ceil((totalCount/(double)pageSize)); request.setAttribute("totalPage", totalPage); } // 从数据库中进行查询 List<AdminVo> adminList = adminService.selectAllAdmins(pageCount, pageSize); // 如果数据库中没有查询出任何数据,adminList的长度为0,做一个专门来处理页面 if (adminList.size() > 0) { request.setAttribute("pageCount", pageCount); // 从数据库中查询出了数据 request.setAttribute("adminList", adminList); request.getRequestDispatcher("/admin/query_all_admins.jsp").forward(request, response); return; } else { // 未查询出 } }
impl:
@Override public List<AdminVo> selectAllAdmins(String pageCount, int pageSize) { /** * -- 因为这个功能只有超级管理员能看到,而且查询的时候已经把超级管理员给排除了 -- * 我登录的这个用户一定是超级管理员才能调用这个sql-->从session获取当前登录的用户权限等级 */ String sql = "select * from (" + "select admin1.*, rownum as rn from (" + "select ra.*, rs.role_level, rs.role_name from sys_admin ra inner join sys_role rs on rs.id = ra.role_id) admin1 " + "where rownum <=?) admin2 " + "where admin2.rn >=? and is_delete != 1 and role_level < 3"; // 需要传值得两个问号关系:3n 5n 8n ; 3n-2 5n-4 8n-7-->pageSize*pageCount // pageSize*pageCount-(pageSize-1) int pageCounts = Integer.parseInt(pageCount); String[] params = { (pageCounts * pageSize) + "", (pageCounts * pageSize - (pageSize - 1)) + "" }; ResultSet rs = super.execQuery(sql, params); List<AdminVo> adminList = new ArrayList<AdminVo>(); try { while (rs.next()) { AdminVo am = new AdminVo(); am.setId(rs.getString("id")); am.setAdminName(rs.getString("admin_name")); am.setAdminPassword(rs.getString("admin_password")); am.setAdminRealPassword(rs.getString("admin_real_password")); am.setRoleId(rs.getString("role_id")); am.setRoleLevel(rs.getInt("role_level")); am.setRoleName(rs.getString("role_name")); am.setIsDelete(rs.getInt("is_delete")); adminList.add(am); } } catch (SQLException e) { e.printStackTrace(); } return adminList; }
jsp:
<table class="table table-hover text-center"> <tr> <th width="15%" style="text-align:left; padding-left:20px;">管理员ID</th> <th width="20%">管理员用户名</th> <th width="20%">管理员密码</th> <th width="30%">管理员权限</th> <th width="310">操作</th> </tr> <volist name="list" id="vo"> <c:forEach items="${adminList }" var="admin"> <c:if test="${admin.isDelete == 0 }"> <tr> <td style="text-align:left; padding-left:20px;">${admin.id }</td> <td>${admin.adminName }</td> <td>${admin.adminRealPassword }</td> <td width="10%">${admin.roleName }</td> <td><div class="button-group"> <a class="button border-main" href="admin.sxt?flag=selectAdminById&adminId=${admin.id }"><span class="icon-edit"></span> 修改</a> <a class="button border-red" href="javascript:void(0)" onclick="del('${admin.id}')"><span class="icon-trash-o"></span> 删除</a> </div></td> </tr> </c:if> </c:forEach> <tr> <td colspan="8"><div class="pagelist"> <!-- 上一页:当前页码数-1 下一页:当前页码数+1 尾页:总条数除以每页显示的条数,并且向上取整 --> <c:if test="${pageCount != 1 }"> <a href="admin.sxt?flag=selectAllAdmin&pageCount=1">首页</a> </c:if> <c:if test="${pageCount > 1 }"> <a href="admin.sxt?flag=selectAllAdmin&pageCount=${pageCount-1 }">上一页</a> </c:if> <c:forEach begin="1" end="${totalPage }" var="page"> <!-- 首先: 获取a标签的值,如果page等于当前页面pageCount 然后: 就把这个a标签变成span标签,并且添加class="current" --> <c:if test="${page == pageCount }"> <span class="current">${page }</span> //给点击的页数加一个效果,点击哪一页,哪一页背景显示为绿色 </c:if><!-- pageCount = 1 page=1--> <c:if test="${page != pageCount }"> <a href="admin.sxt?flag=selectAllAdmin&pageCount=${page }">${page }</a> </c:if> </c:forEach> <c:if test="${totalPage > pageCount }"> <a href="admin.sxt?flag=selectAllAdmin&pageCount=${pageCount+1 }">下一页</a> </c:if> <c:if test="${totalPage != pageCount }"> <a href="admin.sxt?flag=selectAllAdmin&pageCount=${totalPage }">尾页</a> </c:if> </div></td> </tr> </table>
5.Filter拦截器:
package cn.zzsxt.lee.project.filter; import java.io.IOException; import java.util.Calendar; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.zzsxt.lee.project.adminuser.entity.AdminUser; /** * @description 登录控制器 * @author Seven Lee * @date 2017年6月16日上午9:09:14 * */ @WebFilter(filterName = "loginFilter", urlPatterns = "/*") public class LoginFilter implements Filter { @Override public void doFilter(ServletRequest servletRequsRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { System.out.println("我是控制登录请求的filter,我被访问过!"); HttpServletRequest request = (HttpServletRequest) servletRequsRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; // 获取当前用户是否存有session AdminUser adminUser = (AdminUser) request.getSession().getAttribute("user"); // 获取当前访问的资源路径 String contextPath = request.getContextPath();// 项目根路径 String uri = request.getRequestURI();// 当前用户访问的路径 // 获取请求方式 String method = request.getMethod().toLowerCase(); // 获取请求的隐藏域参数 String type = request.getParameter("type"); int hours = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);// 获取的是服务器上的小时数 // 获取IP地址 String remote = request.getRemoteAddr(); String local = request.getLocalAddr(); if (adminUser != null) { // 如果有session不进行拦截 chain.doFilter(servletRequsRequest, servletResponse); } else if (uri.equals(contextPath + "/") || uri.equals(contextPath + "/login.jsp")) { chain.doFilter(servletRequsRequest, servletResponse); } else if (uri.endsWith(".css") || uri.endsWith(".js") || uri.contains("/images/")) { chain.doFilter(servletRequsRequest, servletResponse); } else if (hours < 9 || hours > 18) { filterMsg(request, response, "请在上班时间访问此系统,感谢您的配合!9:00-18:00"); } else if (!("127.0.0.1".equals(remote) || ":::::1".equals(remote) || local.equals(remote))) { filterMsg(request, response, "内部系统目前暂时不支持游客访问,请见谅"); } else if (uri.equals(contextPath + "/adminUser") && "post".equals(method) && "login".equals(type)) { // 登录操作不拦截 chain.doFilter(servletRequsRequest, servletResponse); } } private void filterMsg(HttpServletRequest request, HttpServletResponse response, String msg) { request.getSession().setAttribute("msg", msg); try { response.getWriter().print("<script type='text/javascript'>"); response.getWriter().print("window.location.href='" + request.getContextPath() + "/login.jsp'"); response.getWriter().print("</script>"); } catch (IOException e) { e.printStackTrace(); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } }