如何在jsp页面使用html5元素

我在用jsp编写程序时,使用html5支持的元素但是显示的时候不符合预期,请问如何在jsp页面使用html5元素?

1个回答

每一个jsp开头都有个<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-trasitional.dtd">(通常是这样)但要支持h5要改成这样<!DOCTYPE html> 而且有些浏览器不支持h5,浏览器推荐使用火狐或者谷歌

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java后台Graphics生成图片,如何用<img>在jsp页面显示出来?
利用Graphics能够进行绘图,但是这个图形怎么才能够用<img>标识在jsp网页显示出来呢?当前我尝试和相关说明如下: (1)我的图形用JFreeChart不好生成,所以用Graphics类绘制,图能够绘制出来; (2)网上说了用BufferedImage,倒是能够在jsp页面显示图片,但是整个页面就显示了这样的一个图片,背景全是黑色的(代码和显示结果如下所示)。我希望生成的就是一个图片显示在网页中,就是说只将中间白色背景的图片显示出来,而黑色的背景不要显示,同时将网页中“Hello World”等元素正常显示。如何实现呢? ``` <%-- Document : testImg Created on : 2019-11-15, 21:43:37 Author : Administrator --%> <%@page import="java.io.File"%> <%@page import="java.awt.Graphics2D"%> <%@page import="java.awt.Transparency"%> <%@page import="javax.imageio.ImageIO"%> <%@page import="java.awt.Color"%> <%@page import="java.awt.Graphics"%> <%@page import="java.awt.image.BufferedImage"%> <%@page contentType="text/html" pageEncoding="GB2312"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB2312"> <title>JSP Page</title> </head> <body> <h1>Hello World!</h1> <% BufferedImage image=new BufferedImage(500,200,BufferedImage.TYPE_INT_RGB); Graphics2D g=image.createGraphics(); g.setColor(Color.WHITE); g.fillRect(0, 0, 500,200); g.setColor(Color.GREEN); g.fillRect(5, 5, 100, 150); g.dispose(); response.reset(); ServletOutputStream o = response.getOutputStream(); // 输出图象到页面 ImageIO.write(image, "JPEG",o); o.flush(); o.close(); o = null ; response.flushBuffer(); out.clear(); out = pageContext.pushBody(); %> <p><font color="#FF0000">网页页面显示</font></p> </body> </html> ``` 显示的结果如下: ![图片说明](https://img-ask.csdn.net/upload/201911/16/1573869974_476897.jpg)
jsp页面引入外部js,导致整个页面无法显示
这是jsp页面的头文件 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"/> <title></title> <link rel="stylesheet" type="text/css" href="${basePath}/css/all.css"/> <link rel="stylesheet" type="text/css" href="${basePath}/css/pop.css"/> <link rel="stylesheet" type="text/css" href="${basePath}/css/main.css"/> <%--<script type="text/javascript" src="${basePath}/js/common/jquery-1.8.3.js"/>--%> <%--<script type="text/javascript" src="${basePath}/js/content/adList.js"/>--%> </head> 而且用firebug查看元素时,body里面是没有东西的
JSP页面中,被include进来的页面有什么要求或规范?
<jsp:include page="/webreg/LeftMenu.jsp"></jsp:include> 比如上面这样的引入。LeftMenu.jsp中需不需要把所有的元素(包括<html><head><body>等等)写全以及什么情况下要写全,什么时候不用写全。 如果能多说一些相关知识更好,谢谢。
怎么将后台内容显示在jsp页面上?
报得错误是: NoSuchMethodException: com.krt.person.action.personAction.select() java.lang.Class.getMethod(Class.java:1605) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:249) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:139) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) 代码如下: public class person_entity_dao { //连接数据库 public Connection connectionDB() throws Exception{ String url="jdbc:mysql://localhost:3306/test"; Connection conn=null; try{ Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection(url, "root", "123456"); } catch(ClassNotFoundException e){ System.out.println("驱动失败"); } catch(SQLException e){ System.out.println("连接数据库失败"); } return conn; } public List quaryList(String name,String age,String sex){ //构造map集合 Map map= new HashMap(); //定义一个元素数据并赋初值 ResultSetMetaData md=null; //构造一个数组列表 List listofRows =new ArrayList(); try { Connection conn=this.connectionDB(); String select="select * from tb_user where name='"+name+"' and age='"+age+"' and sex='"+sex+"'"; System.out.println(select); PreparedStatement ps=conn.prepareStatement(select); //获得结果集 ResultSet rs=ps.executeQuery(); //获得数据集 md=rs.getMetaData(); //获得数据集中列的总数 int num=md.getColumnCount(); //读取数据 while (rs.next()){ //构造一个LinkedHashMap存储数据 LinkedHashMap mapofvalues =new LinkedHashMap(); for(int i=1;i<num;i++){ mapofvalues.put(md.getColumnName(i), rs.getObject(i)); } //将mapofvalues添加到listofRows中 listofRows.add(mapofvalues); } } catch (Exception e) { e.printStackTrace(); } return listofRows; } } public List quaryList(String name, String age,String sex){ return dao.quaryList(name, age, sex); } public String select(ServletRequest Request) throws Exception{ String name=ServletActionContext.getRequest().getParameter("name"); String age=ServletActionContext.getRequest().getParameter("age"); String sex=ServletActionContext.getRequest().getParameter("sex"); List listofRows= service.quaryList(name, age, sex); System.out.println(listofRows.toString()); ((ServletRequest) Request).setAttribute("listofRows", listofRows ); ActionContext.getContext().getSession().put("listofRows",listofRows); //双向搜索接口 Iterator its=listofRows.iterator(); while( its.next()!= null){ return "ok"; } return "error"; } } jsp文件: </head> <body> <form action="ok.action" method="post"> <table border="1" cellspacing="0" cellpadding="0" width="100%"align="center"> <tr style="font-weight:bold"> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>入职时间</th> <th>联系电话</th> <th>职位号</th> <th>部门号</th> <th>用户名</th> <th>密码</th> <% List listofRows =(List)request.getAttribute("listofRows"); if(listofRows.size()!=0){ for(int i=0;i<listofRows.size();i++){ pageContext.setAttribute("listofRows",listofRows.get(i)); } } %> <tr> <td>${listofRows.id}</td> <td>${listofRows.name}</td> <td>${listofRows.age}</td> <td>${listofRows.sex}</td> <td>${listofRows.time}</td> <td>${listofRows.telphone}</td> <td>${listofRows.rid}</td> <td>${listofRows.did}</td> <td>${listofRows.username}</td> <td>${listofRows.password}</td> </tr> </table> </form> </body> </html>
表单提交后页面跳转问题
表单提交后html页面好像跳转了,对话框弹出新页面JavaScript写的内容,屏幕显示的还是原来的界面,地址栏也没变。但我手动输入新页面的URL地址,正确显示了新页面的内容和地址。 旧的页面是login.jsp,这是后端跳转的代码: @RequestMapping("/logUser") public String logUser(User user, Model model) { List<User> userlist1 = userService.searchUser1(); for (User user1 : userlist1) { if (user.getUsername().equals(user1.getUsername()) && user.getPassword().equals(user1.getPassword())) { model.addAttribute("loginsuccess", "登陆成功"); model.addAttribute("currentUser", user1); return "userindex"; } if (user.getUsername()==null||user.getUsername().trim()==""||user.getPassword()==null||user.getPassword().trim()=="") { model.addAttribute("loginnull", "请输入用户名或密码"); return "login"; } } model.addAttribute("loginfail", "用户名或密码错误"); return "login"; } 新界面userindex.jsp用EL表达式将model值取出,并用JavaScript获取元素弹框。登陆成功后提示登陆成功,但还在旧的页面 ![图片说明](https://img-ask.csdn.net/upload/201911/12/1573547142_531217.png) ![图片说明](https://img-ask.csdn.net/upload/201911/12/1573547374_618268.png)
jsp和js分开写时,js里面的中文乱码
项目用到的是spring MVC+layui,我的jsp页面: ``` <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>数据库列表</title> <link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/static/layui/css/layui.css"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script src="<%=request.getContextPath()%>/static/layui/layui.all.js"></script> <script src="<%=request.getContextPath()%>/static/js/tableList.js" charset="UTF-8"></script> </head> <body> <div class="layui-row"> <div class="layui-col-md4"> </div> </div> <div> <table id="tables" class="layui-hide" lay-filter="tables"> </table> </div> </body> </html> ``` 我的js代码: ``` window.onload=function(){ console.info("already run"); clik(); }; function clik() { layui.use('table', function(){ var table = layui.table; table.render({ elem: '#tables' ,method:'post' ,url:'http://localhost:8080/Hungry_tyrants_war_exploded/tables/get/name' ,cellMinWidth: 300 //全局定义常规单元格的最小宽度,layui 2.2.1 新增 ,cols: [[ {field:'name', width:80, title: '表名', sort: true} ,{field:'desc', width:80, title: '注释'} ]] }); table.on('row(tables)', function(obj){ console.log(obj.tr) //得到当前行元素对象 console.log(obj.data) //得到当前行数据 $.ajax({ url:"http://localhost:8080/Hungrytyrants_war/tables/toOne", data:obj.data, success:function (back) { if (back.code.eq(-1)){ layer.msg(back.desc); } } }); //obj.del(); //删除当前行 //obj.update(fields) //修改当前行数据 }); }); } ``` 环境编码是UTF-8;直接复制代码带文本,查看代码也是utf-8。只要是写在js页面的中文都会乱码,实在搞不懂为什么,有没有懂的大神帮忙解决一下????
SiteMesh框架中复用页面,CSS无法使用问题
我在WebRoot下建立了一个decorators的文件夹里面建立了一个复用的jsp页面 main.jsp现在我通过在 <title> </title>中用 <link href="style.css" type="text/css" rel="stylesheet" /> 引入css文件,在Myeclipse的main.jsp的预览中一切都显示正常 项目运行过后页面却和没有css的纯html页面一样,但是通过 <decorator:body />却能正常的将页面显示出来,控制台中也没有出现任何的错误! 在WEB-INF 中的decorators.xml文件的内容如下 ========================================== <?xml version="1.0" encoding="GBK"?> <decorators defaultdir="/decorators"> <!-- 在excludes元素下指定的页面将不会由SiteMesh来装饰 --> <excludes> </excludes> <!-- 创建一个名为main的装饰器,该装饰器页面为main.jsp, 用于装饰pattern指定的URL的所有页面--> <decorator name="main" page="main.jsp"> <pattern>/* </pattern> </decorator> </decorators> ========================================== WEB-INF.xml的配置 =========================================== <!-- 定义整合SiteMesh必需的ActionContextCleanUp Filter --> <filter> <filter-name>struts-cleanup </filter-name> <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class> </filter> <!-- 定义整合SiteMesh和核心 Filter --> <filter> <filter-name>sitemesh </filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter </filter-class> </filter> <!-- ActionContextCleanup的Filter必须排在第一位 --> <filter-mapping> <filter-name>struts-cleanup </filter-name> <url-pattern>/* </url-pattern> </filter-mapping> <!-- SiteMesh页面装饰的核心过滤器排在第二位 --> <filter-mapping> <filter-name>sitemesh </filter-name> <url-pattern>/* </url-pattern> </filter-mapping> ============================================ 请问这是怎么回事啊? 但是CSS的引用是没有问题的。 将CSS代码直接放入页面之中,通过 <style> </style>来直接使用CSS页面没有问题, 但是CSS里面通过:background:#1F2C08 url(img01.jpg) repeat-x left top; 引入的img01.jpg图片无法引入。 注意:在预览,jsp这些标签去掉后以html的方式直接打开都是没有任何问题的,页面和设计的一样,但是运行后却出现CSS没有使用以及图片没有使用! [b]问题补充:[/b] 被装饰的页面将CSS从head中提取出来单独成一个css文件后,通过 <link href="../css/css.css" type="text/css" rel="stylesheet" /> 或者 <% String contextPath = request.getContextPath(); %> <link rel="stylesheet" rev="stylesheet" href="<%=contextPath%>/CSS/style.css" type="text/css" media="screen" /> 这两种方式都不能使被装饰的页面被CSS装饰布局。 目录结构是这样的 [img]/upload/attachment/111325/e5192cd7-9255-326c-a187-cff0bab793e0.jpg[/img] 现在jsp里面的jsp页面不能使用css目录里的css,而decorators里的main。jsp也不能使用当前目录下的css文件夹下的style。css。 main.jsp以及jsp目录下的页面在运行后都没有了css的装饰,请问这是怎么回事? 就像这样 [img]/upload/attachment/111327/704bce02-a693-3b4b-b820-e196bdc6930e.jpg[/img]
jsp 分页 出现空指针异常
实在是看不到那出错了 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <html> <head> <title>My JSP 'search_result.jsp' starting page</title> </head> <jsp:include page="search.jsp" /> <body> <% Connection conn=null; Statement stmt=null; ResultSet rs=null; try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String strConn="jdbc:sqlserver://PC201311011725\\MSSQLSERVER:1433;DatabaseName=Xk"; String strUser="sa"; String strPWD="feng123"; conn=DriverManager.getConnection(strConn,strUser,strPWD); stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String str1=request.getParameter("txt1"); String strSql=""; if(str1==null || str1==""){ strSql="select * from studnet"; }else{ strSql="select * from student where stuname like '"+str1.trim()+"%'"; } rs=stmt.executeQuery(strSql); }catch(Exception e){ } %> <table border=1> <tr><th>stuno</th><th>classno</th><th>stuname</th><th>Pwd</th></tr> <% String str=(String)request.getParameter("page"); if(str==null){ str="0"; } int pagesize=5;//每页地 个数 rs.last(); int recordCount=rs.getRow();//总行数 int maxPage=0; maxPage=(recordCount%pagesize==0)?(recordCount/pagesize):(recordCount/pagesize+1);//可以分成多少个页面 int currentPage=Integer.parseInt(str);//当前页面 if(currentPage<1){ currentPage=1; } else{ if(currentPage>maxPage){ currentPage=maxPage; } } rs.absolute((currentPage-1)*pagesize+1);//定位到每个当前页面的第一个元素 for(int i=1;i<=pagesize;i++){ %> <tr> <td><%=rs.getString(1) %></td> <td><%=rs.getString(2) %></td> <td><%=rs.getString(3) %></td> <td><%=rs.getString(4) %></td> </tr> <% try{ if(!rs.next()){break;} }catch(Exception e){ } } %> </table> <p>跳转到<input type="text" size="3" name="page" value="<%=currentPage%>"> 当前页数:<%=currentPage %>/<%=maxPage %> </p> <% if(currentPage>=1){ %> <a href="search_result.jsp?page=1">第一页</a> <a href="search_result.jsp?page=<%=currentPage-1%>">上一页</a> <% } if(currentPage<maxPage) { %> <a href="search_result.jsp?page=<%=currentPage+1%>">下一页</a> <a href="search_result.jsp?page=<%=maxPage%>">尾页</a> <% } rs.close(); stmt.close(); conn.close(); %> </body> </html>
JSP用户权限和界面显示
我设计有三个表:User、Role、Action和两张中间表User_Role 、Role_Action。User表存放用户信息;Role表存放不同类型用户,比如:超级管理员,一般用户等;Action表存放操作,不如:增加一般用户,删除一般用户等。User_Role 三个字段:id,user_id,Role_id;Role_Action也是三个字段:id,role_id,action_id。 现在问题是:我想要根据不同用户类型显示不同页面,最重要的地方是,根据不同类型用户页面显示不同元素,比如按钮的显示与隐藏,菜单项的显示与隐藏。 在网上查询之后,有些网友说用过滤器,我对这个一点也不熟悉;也有些说用HTML的display:none,我觉得这个不安全。有没有比较完美的方式,各位大侠给指点指点,有源码、实例什么的最好啦!
本人是初学者看一些代码有些不懂,还请大神指点一下,谢谢
${ msg }表示什么意思呢??? index.jsp怎么跳转到main.jsp呢??? **index.jsp** ``` <html > <title>聊天室</title> <link href="CSS/style.css" rel="stylesheet"> <script type="text/javascript"> function check(){ if(document.getElementById("form1").username.value==""){ alert("请输入用户名!"); document.getElementById("form1").username.focus(); return false; } if(document.getElementById("form1").password.value==""){ alert("请输入密码名!"); document.getElementById("form1").password.focus(); return false; } } </script> <body> <br> <center><h3 style="color:red;">${ msg }</h3></center> <form id="form1" name="form1" method="post" action="${pageContext.request.contextPath }/user" onSubmit="return check()"> <input type="hidden" name="method" value="login"> <table width="371" height="230" border="0" align="center" cellpadding="0" cellspacing="0" background="images/login.jpg"> <tr> <td height="120" colspan="3" class="word_dark">&nbsp;</td> </tr> <tr> <td width="53" align="center" valign="top" class="word_dark">&nbsp;</td> <td width="216" align="center" valign="top" class="word_dark"> <table width="100%" height="100%"> <tr> <td>用户名:</td> <td><input type="text" name="username" class="login"></td> </tr> </table> </td> <td width="94" valign="top" class="word_dark"></td> </tr> <tr> <td width="53" align="center" valign="top" class="word_dark">&nbsp;</td> <td width="216" align="center" valign="top" class="word_dark"> <table width="100%" height="100%"> <tr> <td>密&nbsp;&nbsp;码:</td> <td><input type="password" name="password" class="login"></td> </tr> </table> </td> <td width="94" valign="top" class="word_dark"></td> </tr> <tr> <td width="53" align="center" valign="top" class="word_dark">&nbsp;</td> <td width="216" align="center" valign="top" class="word_dark"> <input name="Submit" type="submit" class="btn_bg" value="进 入"> </td> <td width="94" valign="top" class="word_dark"> </td> </tr> </table> </form> </body> </html> ``` **main** ``` <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ include file="safe.jsp"%> <html> <head> <title>聊天室</title> <link href="CSS/style.css" rel="stylesheet"> <script type="text/javascript" src="${ pageContext.request.contextPath }/js/jquery-1.8.3.js"></script> <script type="text/javascript"> var sysBBS = "<span style='font-size:14px; line-height:30px;'>欢迎光临心之语聊天室,请遵守聊天室规则,不要使用不文明用语。</span><br><span style='line-height:22px;'>";var sysBBS = "<span style='font-size:14px; line-height:30px;'>欢迎光临心之语聊天室,请遵守聊天室规则,不要使用不文明用语。</span><br><span style='line-height:22px;'>"; window.setInterval("showContent();",1000); window.setInterval("showOnLine();",10000); window.setInterval("check();",1000); // Jquery:JS框架. // 相当于window.onload $(function(){ showOnLine(); showContent(); check(); }); function check(){ $.post("${pageContext.request.contextPath}/user?method=check",function(data){ if(data == 1){ // 提示用户下线了 alert("用户已经被踢下线了!"); // 回到登录页面! window.location = "index.jsp"; } }); } // 显示在线人员列表 function showOnLine(){ // 异步发送请求 获取在线人员列表 // Jquery发送异步请求 $.post("${pageContext.request.contextPath}/online.jsp?"+new Date().getTime(),function(data){ // $("#online") == document.getElementById("online"); $("#online").html(data); }); } // 显示聊天的内容 function showContent(){ $.post("${pageContext.request.contextPath}/user?"+new Date().getTime(),{'method':'getMessage'},function(data){ $("#content").html(sysBBS+data); }); } function set(selectPerson){ //自动添加聊天对象 if(selectPerson != "${existUser.username}"){ form1.to.value=selectPerson; }else{ alert("请重新选择聊天对象!"); } } function send(){ if(form1.to.value==""){ alert("请选择聊天对象!"); return false; } if(form1.content.value==""){ alert("发送信息不可以为空!"); form1.content.focus(); return false; } // $("#form1").serialize():让表单中所有的元素都提交. // jquery提交数据.{id:1,name:aa,age:25} $.post("${pageContext.request.contextPath}/user?"+new Date().getTime(),$("#form1").serialize(),function(data){ $("#content").html(sysBBS+data+"</span>"); }); } function exit(){ alert("欢迎您下次光临!"); window.location.href="${pageContext.request.contextPath}/user?method=exit"; } function checkScrollScreen(){ if(!$("#scrollScreen").attr("checked")){ $("#content").css("overflow","scroll"); }else{ $("#content").css("overflow","hidden"); //当聊天信息超过一屏时,设置最先发送的聊天信息不显示 //alert($("#content").height()); $("#content").scrollTop($("#content").height()*2); } setTimeout('checkScrollScreen()',500); } </script> </head> <body> <table width="778" height="150" border="0" align="center" cellpadding="0" cellspacing="0" background="images/top.jpg"> <tr> <td>&nbsp;</td> </tr> </table> <table width="778" height="276" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="165" valign="top" bgcolor="#f6fded" id="online" style="padding:5px">在线人员列表</td> <td width="613" height="200px" valign="top" background="images/main_bj.jpg" bgcolor="#FFFFFF" style="padding:5px; "> <div style="height:290px; overflow:hidden" id="content">聊天内容</div></td> </tr> </table> <table width="778" height="95" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#D6D3CE" background="images/bottom.jpg"> <form action="" id="form1" name="form1" method="post"> <input type="hidden" name="method" value="sendMessage"/> <tr> <td height="30" align="left">&nbsp;</td> <td height="37" align="left"> <input name="from" type="hidden" value="${existUser.username}">[${existUser.username} ]对 <input name="to" type="text" value="" size="35" readonly="readonly"> 表情 <select name="face" class="wenbenkuang"> <option value="无精打采的">无精打采的</option> </select> 说:</td> <td width="189" align="left">&nbsp;&nbsp;字体颜色: <select name="color" size="1" class="wenbenkuang" id="select"> <option selected>默认颜色</option> <option style="color:#999999" value="999999">烟雨蒙蒙</option> </select> </td> <td width="19" align="left"><input name="scrollScreen" type="checkbox" class="noborder" id="scrollScreen" onClick="checkScrollScreen()" value="1" checked> </td> </tr> <tr> <td width="21" height="30" align="left">&nbsp;</td> <td width="549" align="left"> <input name="content" type="text" size="70" onKeyDown="if(event.keyCode==13 && event.ctrlKey){send();}"> <input name="Submit2" type="button" class="btn_grey" value="发送" onClick="send()"> </td> <td align="right"><input name="button_exit" type="button" class="btn_grey" value="退出聊天室" onClick="exit()"> </td> <td align="center">&nbsp;</td> </tr> <tr> <td height="30" align="left">&nbsp;</td> <td align="center">&nbsp;</td> </tr> </form> </table> </body> </html> ```
js 的range的替换选中html
js的range.deleteContents()为什么不能彻底删除选中内容,比如<font size=7>1111<font> 选中这段内容后使用该方法,结果还剩下<font size=7><font>,该方法不能删除 元素节点吗? 使用range.detach();方法在jsp页面也不能删除选中的内容,怎么样可以彻底删除 选中的内容呢
听说这里牛人多,对这个不知道大家是怎么做的
有这样的一个需求, <br />通过一个xml文件定义页面上要生成的元素,比如 按钮,下拉列表等等, <br />而页面则自动根据xml 文件中定义的元素来生成相应的界面内容, <br />问题是: <br />比如按钮的位置,大小,上面的文字内容以及样式,本身的样式,事件等等 <br />这些东西太多,如何比较好的在xml中定义 <br />小弟我想了好久,基本没什么头绪,所以来这里请教了,还望大家多多指导<br /><strong>问题补充</strong><br />zk? taglib? <br />本人入行不久,tablig还知道点,zk就不清楚了,还请楼上的说的详细些 <br />比如: <br />我在xml文件中定义了一个button,一个下拉列表(它们的位置 和样式等) <br />页面根据这个xml文件 自动生成一个button 和一个下拉列表,样式和位置生成什么都是根据 <br />这个xml文件定义的 <br /><br /><strong>问题补充</strong><br />我查了下,zk是一个ajax框架,但不是这样 <br />我基本所有的页面元素都在xml文件中定义好了,这个xml文件实际就是一个页面模板 <br />它存放了所有页面要显示的元素<br /><strong>问题补充</strong><br /><div class="quote_title">rainerWJY 写道</div><div class="quote_div">直接用swing映射html.</div><br />直接用swing映射html应该不行 <br /> <br />html还算熟悉 dom 就一般了, <br />详细的我还没想好,但是页面上要显示的html元素 都要在xml文件中定义好 <br />就是没什么思路,不知道xml文件中该如何来定义, <br />因为html元素种类多,属性多,页面可能还有嵌套的元素,所以比较麻烦感觉<br /><strong>问题补充</strong><br /><div class="quote_title">bloodrate 写道</div><div class="quote_div">用taglib好,否则你可能要在每次调用展现层的时候都传大量乱七八糟的数据和业务数据搅和在一起...</div><br />你说的也是, <br />但使用标签的话,达不到自动生成的页面的效果 <br />而且我比如要去掉一个button 直接修改xml文件就可以了,不用去jsp页面上进行修改 <br /><strong>问题补充</strong><br /><div class="quote_title">rainerWJY 写道</div><div class="quote_div"><div class="quote_title">seety 写道</div><div class="quote_div"><div class="quote_title">rainerWJY 写道</div><div class="quote_div">直接用swing映射html.</div> <br />直接用swing映射html应该不行 <br /> <br />html还算熟悉 dom 就一般了, <br />详细的我还没想好,但是页面上要显示的html元素 都要在xml文件中定义好 <br />就是没什么思路,不知道xml文件中该如何来定义, <br />因为html元素种类多,属性多,页面可能还有嵌套的元素,所以比较麻烦感觉</div> <br /> <br /> <br />这个问题我是思考过的。 <br />1.这个思路很多人都能想的到。如果有这样的好的解决方案,我相信swing会很火。 <br />2.没有,替代是什么?或许是flex。不过我没什么研究 <br />3.html解析+渲染这个还是交给浏览器去做吧。他们就做这个的。 <br />4.简单的实用性不强,不简单的一个人做不来。。。</div> <br /> <br /> <br />其实我也觉得有点难度,所以跑到这里来了,集思广益, <br />弄个还算过的去的就可以了,以后有心思路了再改进 <br />
一个页面中切换表格时分页栏未能作用于其相应表格的数据
![图片说明](https://img-ask.csdn.net/upload/201603/10/1457581046_902081.png) jsp页面有未读反馈和已读反馈 两个表格,现在切换表格时,下面的分页栏只对未读反馈起效果,当表格切换到已读反馈时,分页栏还是作用于未读反馈表格.求帮忙解决!!! 页面代码如下: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <link rel="stylesheet" type="text/css" href="${ctx}/static/css/feedback/feedback.css"> <div class="appMain"> <div class="appLeft"> <!-- 主要内容区域 --> <div class="mainContent"> <div class="feedback"> <div class="feedbackMain"> <ul> <li onclick="tab('tab1')" class="navCurrent" id="navli0">未读反馈</li> <li onclick="tab('tab2')" id="navli1">已读反馈</li> </ul> <div class="tabList"> <div> <ol id="tab1" style="display: block;"> <%-- <li> <div clsass="feedbackTop"> <h2></h2> <p></p> </div> <div class="feedMain"> <p></p> </div> <img src="${ctx}/static/images/gray.png" class="hideImg"> </li> --%> </ol> </div> <div> <ol id="tab2" style="display: none;"> <%-- <li> <div class="feedbackTop"> <h2></h2> <p></p> </div> <div class="feedMain"> <p></p> </div> <img src="${ctx}/static/images/gray.png" class="hideImg"> </li> --%> </ol> </div> </div> </div> </div> </div> <br><div id="pageFooter"></div> <!-- 主要内容区域结束 --> </div> <!-- 右边搜索栏 --> <div class="appRight" id="feedBakForm"> <div class="rightMain"> <ul> <li> <h2>搜索</h2> </li> <li> <h3>关键字搜索:</h3> <input type="text" name="keywords" placeholder="请输入关键字" /> </li> <li> <h3>时间范围:</h3> <input type="text" readonly name="startTime" onclick="laydate()" placeholder="开始时间"/> <input type="text" readonly name="endTime" onclick="laydate()" placeholder="结束时间" /> </li> <li> <h3>邮箱账号搜索:</h3> <input type="text" name="email" placeholder="请输入邮箱账号" /> </li> </ul> <a class="btn" style="margin-left: 10px;" id="feedBackSearch">确认搜索</a> </div> <%-- <div class="rightMain"> <ul class="detail"> <li> <h2>批量处理</h2> </li> <li> <h3 class="showImg">批量处理</h3> </li> <li> <a data-type="read" class="editFeedback" href="${ctx}/admin/feedback/list" data-id="">标记为已处理</a> </li> <li> <a data-type="del" class="delFeedback" href="${ctx}/admin/feedback/list" data-id="">删除</a> </li> </ul> </div> --%> </div> </div> <script type="text/javascript" src="${ctx}/static/js/laydate/laydate.js"></script> <script type="text/javascript" src="${ctx}/static/js/laypage/laypage.js"></script> <script type="text/javascript"> var pageSign = true; var FeedBackService = { init: function (pageIndex) { var me = this; var params = ServiceUtils.getInputDomain('feedBakForm'); params.pageIndex = pageIndex || 1; ServiceHttp.execute('${ctx}/admin/feedback/list?_=' + new Date().getTime(), params, function (cb) { if (cb.success) { me.setData(cb.result.data || []); me.setPage(cb.result.totalPages); } else { bootbox.alert(cb.message); } }) }, setData: function (data) { var me = this; $('#tab1').html(''); var html = ''; $.each(data, function (index, value) { html += '<li>'; html += '<div class="feedbackTop">'; html += '<h2>' + (value.email || '') + '</h2>'; html += '<p>' + (value.createTime || '') + '</p>'; html += '</div>'; html += '<div class="feedMain">'; html += '<p>' + (value.content || '') + '</p>'; html += '</div>'; html += '<img src="${ctx}/static/images/gray.png" class="hideImg">'; html += '</li>'; }); $('#tab1').html(html); }, setPage: function (pages) { var me = this; if (pageSign) { laypage({ cont: 'pageFooter', pages: pages || 0, skip: true, groups: 3, jump: function (obj, first) { if (!first) { me.init(obj.curr); } } }); } pageSign = false; } , reload:function(){ pageSign=true; FeedBackService.init(1); } } var FeedBack2Service = { init: function (pageIndex) { var me = this; var params = ServiceUtils.getInputDomain('feedBakForm'); params.pageIndex = pageIndex || 1; ServiceHttp.execute('${ctx}/admin/feedback/list2?_=' + new Date().getTime(), params, function (cb) { if (cb.success) { me.setData(cb.result.data || []); me.setPage(cb.result.totalPages); } else { bootbox.alert(cb.message); } }) }, setData: function (data) { var me = this; $('#tab2').html(''); var html = ''; $.each(data, function (index, value) { html += '<li>'; html += '<div class="feedbackTop">'; html += '<h2>' + (value.email || '') + '</h2>'; html += '<p>' + (value.createTime || '') + '</p>'; html += '</div>'; html += '<div class="feedMain">'; html += '<p>' + (value.content || '') + '</p>'; html += '</div>'; html += '<img src="${ctx}/static/images/gray.png" class="hideImg">'; html += '</li>'; }); $('#tab2').html(html); }, setPage: function (pages) {alert(111) var me = this; if (pageSign) { laypage({ cont: 'pageFooter', pages: pages || 0, skip: true, groups: 3, jump: function (obj, first) { if (!first) { me.init(obj.curr); } } }); } pageSign = false; }, reload:function(){ pageSign=true; FeedBack2Service.init(1); } } $(function () { // FeedBackService.init(1); $('#feedBackSearch').on('click', function () { pageSign = true; FeedBackService.init(1); FeedBack2Service.init(1); }) }) </script> <script type="text/javascript" src="${ctx}/static/bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript"> function tab(pid) { var tabs = ["tab1", "tab2"]; for (var i = 0; i < 7; i++) { if (tabs[i] == pid) { document.getElementById(tabs[i]).style.display = "block"; $('#navli'+i).eq(0).addClass("navCurrent"); if(tabs[i]=='tab1'){ FeedBackService.init(1); }else{ FeedBack2Service.init(1); } } else { document.getElementById(tabs[i]).style.display = "none"; $('#navli'+i).eq(0).removeClass("navCurrent"); } } }; /* laydate({ elem: '#hello', //目标元素。由于laydate.js封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id .class' event: 'focus', //响应事件。如果没有传入event,则按照默认的click festival: true //显示节日 }); */ </script>
(新手)关于HTML简单登录的问题代码的问题
<html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>登录界面</title> <script> //登录处理 function Login(){ if(DL.mail.value==""){ mess.innerHTML="请输入邮箱帐号" DL.mail.focus; //return false; }else{ mess.innerHTML=""; //return true; } if(DL.password.value==""){ mess1.innerHTML="请输入密码" DL.password.focus; return false; }else{ mess1.innerHTML=""; loginMsg.style.display="block";//块级元素 login.style.display="none";//不显示login的内容 setTimeout("mySubmit(),3000"); return false; } } function mySubmit(){ DL.submit(); } </script> </head> <body> <form name="DL" action=""><!--登录处理JSP--> <table border="0" background="../../Login/PIC/pic_login.gif" width="420" height="265"> <tr height="50"> <td colspan="4">&nbsp;</td> </tr> <tr> <!--账号输入框--> <td width="20%" align="right"><font size="2">邮箱:</font></td> <td colspan="2" width="45%"> <input type="text" name="mail" size="25" /> <div id="mess" style="font-size: small; color: #F00;"></div> <!--DIV用来输出提示信息--> </td> <td>&nbsp;</td> </tr> <tr> <!--密码输入框--> <td align="right"><font size="2">密码:</font></td> <td colspan="2"> <input type="password" name="password" size="25" /> <div id="mess1" style="color:red; font-size:small"></div> </td> <td><font size="2"><a href="">忘记密码</a></font></td> </tr> <tr height="20"> <!--记住登录状态--> <td>&nbsp;</td> <td width="25%"> <font size="2"> <input type="checkbox" name="save" />记住登录状态</font> </td> <td><font size="2"><a href="">Https安全访问</a></font></td> <td width="28%">&nbsp;</td> </tr> <tr height="50"> <td>&nbsp;</td> <div id="login"> <td colspan="2"> <input type="image" src="../../Login/PIC/button_login_new.gif" onclick=" return Login()" /> <!--JS函数Login处理登录--> <div id="loginMsg" style="color:red; display:none; font-size:small"> 正在登录搜狐通行证,请稍后.... </div> </td> </div> <td>&nbsp;</td> </tr> <tr> <td colspan="4">&nbsp;</td> </tr> </table> </form> </body> </html> 问题是这样的:点击了图片登录按钮后,按理来说会出现“正在登录搜狐通行证,请稍后....”3秒,然后才提交刷新页面,可是实际却瞬间就提交刷新了.....一直找不到问题所在。请大家帮我看下==
Tomcat 虚拟站点下的子目录无法请求 Struts中的action
在webapps目录下,部署了一个web 工程 :ttest ttest的目录结构如下图: ttest WEB-INF classes lib struts-config.xml struts-html.tld struts-bean.tld struts-html.tld struts-logic.tld web.xml xhtmlmp login.jsp *****.jsp login.jsp *****.jsp 问题描述: 工程采用jsp+struts 来实现。 在ttest 的目录下有一部分jsp文件,同时在其子目录xhtmlmp目录下也有一部分jsp文件。 把ttest部署到tomcat 的webapps目录下以后, 如果以ip地址的形式 来访问这两部分jsp文件,请求的action ,可以进行处理 例如: 192.168.22.228:8080/ttest/login.jsp 请求loginAction ,可以请求action 没问题。 192.168.22.228:8080/ttest/xhtmlmp/login.jsp 请求mobileLoginAction ,也没问题。 现在的问题是 通过配置虚拟站点,来进行访问这两部分jsp 就有问题了。 ttest下的jsp文件可以 请求对应的action,但是子目录里的xhtmlmp中的jsp 文件 就无法请求到 action,页面会报出404错误! 例如: http://mmvd.ttest.com/ttest/login.jsp 这个地址可以请求到action [color=red] http://mmvd.ttest.com/xhtmlmp/login.jsp 这个地址就 无法请求action ! [/color] 我在tomcat的 conf目录中的server.xml 中 配置了 一个Host 元素: <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/ttest/" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" /> <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml"> </Context> <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/> <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile"> </Context> </Host> 另外 在ttest工程下的WEB-INF目录里,strtuts-config.xml的部分信息如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="loginActionForm" type="com.ttest.pc.LoginActionForm" /> <form-bean name="mobileLoginActionForm" type="com.ttest.mobile.MobileLoginActionForm" /> <action-mappings> <!-- ****************************** ttest *********************************** --> <action input="/login.jsp" name="loginActionForm" path="/loginAction" scope="session" type="com.ttest.pc.LoginAction" validate="false"> <forward name="retrieve" path="/retrieve.jsp" redirect="false" /> <forward name="login" path="/login.jsp" redirect="true" /> </action> <action name="mobileLoginActionForm" path="/xhtmlmp/mobileLoginAction" scope="request" type="com.ttest.mobile.MobileLoginAction" validate="false"> <forward name="retrieve" path="/xhtmlmp/retrieve.jsp" redirect="false" /> <forward name="login" path="/xhtmlmp/login.jsp" redirect="true" /> </action> </action-mappings> <message-resources parameter="ApplicationResources" /> </struts-config> [color=blue]-----------------------------------------------------------------[/color] 在补充一下: 现在的问题是 这四个 链接 请求action的状况: Ip形式访问 192.168.22.228:8080/ttest/login.jsp 请求loginAction ,可以请求action 没问题。 192.168.22.228:8080/ttest/xhtmlmp/login.jsp 请求mobileLoginAction ,也没问题。 通过配置host,以虚拟站点形式访问: http://mmvd.ttest.com/ttest/login.jsp 这个地址可以请求到action [color=red]http://mmvd.ttest.com/xhtmlmp/login.jsp 这个地址就 无法请求action ! [/color] host的配置就是这个样子,而且要求不能改变: <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/ttest/" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" /> <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml"> </Context> <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/> <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile"> </Context> </Host>
struts2+ajax登录问题
action中: public String execute() throws Exception { User u=userService.findUserByNameAndPassword(user); try { u.setStudentCourseInfoList(null); u.setTeacherCourseInfoList(null); user.setId(u.getId()); return String.valueOf(u.getType()); /*return SUCCESS;*/ } catch (NullPointerException e) { //json.fromObject("用户名密码错误,请重新登录!"); //this.message="错误"; JSONObject jsob = new JSONObject(); jsob.put("success", "用户名密码错误或不存在"); json = JSONObject.fromObject(jsob); return ERROR; } } 配置文件中: <action name="loginPro" class="com.lb.action.UserAction"> <result name="1">/jsp/teacher/teacher.jsp</result> <result name="2">/jsp/student/student.jsp</result> <result name="0">/jsp/admin/admin.jsp</result> <!-- <result name="error">/jsp/login/fail.jsp</result> <result type="json" name="error"> <param name="root">json</param> </result>--> </action> 页面中: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户登录界面</title> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/easyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/easyui/themes/icon.css"> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/easyui/themes/color.css"> <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap/css/bootstrap.min.css"> <script src="${pageContext.request.contextPath}/jquery/jquery-2.1.3.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/easyui/jquery.easyui.min.js"></script> <script src="${pageContext.request.contextPath}/bootstrap/js/bootstrap.min.js"></script> <style type="text/css"> .myBackground { background: url("${pageContext.request.contextPath}/picture/background.jpg") no-repeat; background-position: 50px 50px; } .myInstitute { background: url("${pageContext.request.contextPath}/picture/logo.jpg") no-repeat; } .myBackgroundColor { background-color: #fff; } </style> </head> <body class="easyui-layout"> <div data-options="region:'north',split:false" style="height: 100px" class="myInstitute myBackgroundColor"></div> <div data-options="region:'center',split:false" style="width: 800px" class="myBackground"> <div style="margin-top: 30px; margin-left: 250px;"> <h2 style="font-size: 40px; color: grey;">学生信息管理系统</h2> <h4 style="font-size: 15px; color: grey; margin-left: 100px; margin-top: 30px;">——光山县第二高级中学</h4> </div> <div style="margin-top: -10px; margin-left: 800px;"> <form id="loginForm" method="post" style="border-left: #CCC 2px solid"> <div style="margin: 20px; margin-left: 50px;"> <input type="text" name="user.username" class="form-control" id="inputUsername" placeholder="用户名" style="width: 250px;"> </div> <div style="margin: 20px; margin-left: 50px;"> <input type="password" name="user.password" class="form-control" id="inputPassword" placeholder="密码" style="width: 250px;"> </div> <div style="margin: 20px; margin-left: 50px;"> <button id="login" type="submit" class="btn btn-default" style="width: 250px;">登录</button> </div> </form> </div> </div> <script type="text/javascript"> function loginHandle() { $.ajax({ //url:g_contextPath+'/servlet/LoginHandleServlet', url:'loginPro.action', //url表示服务器端处理用户登录的URL地址 //data表示要提交到服务器端的数据,更加简洁的写法 data: $('#loginForm').serialize(), //serialize()方法的作用是将form表单中的内容序列化成字符串 dataType: 'json', type:'post', success: function(data) { var dataObj=eval(data); $.messager.alert('提示',dataObj.success,'error'); } }); }; $("#loginForm").keydown(function(e){ if(e.keyCode == 13){ loginHandle(); } }); $(function(){ $('#login').click(function() { //var params=$('input').serialize(); //将input元素序列化,返回JSON数据格式 $.ajax({ type: 'post', //请求方式为post方式 url: 'login.action', //请求地址 dataType: 'json', //服务器返回类型为JSON类型 data:$('#loginForm').serialize(), //发送到服务器的数据 success:function(data){ //请求成功后的回调函数 var dataObj=eval(data); $.messager.alert('提示',dataObj.success,'error'); } }); }); }) </script> </body> </html> 问题:学生 老师 管理员都在一个用户表,用类型区分,用户登录判断用户名和密码,判断用户类型 跳转对应页面,如果用户名或密码错误,弹出错误消息
spring mvc+shiro+cas 实现cas client功能 跳转回来404
http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404
ssh中 no result defined for action and result error
![图片说明](https://img-ask.csdn.net/upload/201610/24/1477317986_290498.png) ``` <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="swork" extends="struts-default" namespace=""> <!-- 全局异常 --> <global-exception-mappings> <!-- result 会取找全局视图的名称 --> <exception-mapping result="null" exception="java.lang.NullPointerException"></exception-mapping> <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> </global-exception-mappings> <!-- Action实例交给spring容器创建 --> <!-- 招聘信息Action --> <action name="swork_*" class="searchworkAction" method="{1}"> <!-- 招聘列表展示 --> <result name="sworkList">/WEB-INF/list.jsp</result> <result name="error">/WEB-INF/list.jsp</result> <!-- 跳转到添加页面 --> <result name="sworkAdd">/WEB-INF/sworkadd.jsp</result> <!-- 添加成功,进入列表 (防止刷新就多一条记录问题,所以用重定向) --> <result name="sworklistAction" type="redirectAction">swork_list</result> <!-- 进入修改页面 --> <result name="edit">/WEB-INF/sworkedit.jsp</result> </action> </package> </struts> ``` action ``` import java.util.List; import java.util.Map; import org.apache.struts2.interceptor.RequestAware; import com.zx.entity.Searchwork; import com.zx.service.ISearchworkService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.util.ValueStack; /** * 新闻模块控制器开发: * 1.招聘列表展示 * 2. 添加招聘信息 * 3. 修改招聘信息 * 5. 删除新闻 * @author zhang x * */ public class SearchworkAction extends ActionSupport implements ModelDriven<Searchwork>, RequestAware{ /** * */ private static final long serialVersionUID = 1L; /*******一、封装数据********/ private Searchwork swork = new Searchwork(); // 【模型驱动】 // 封装请求的部门id(下拉列表的实际的值) public void setSearchwork(Searchwork swork) { this.swork = swork; } public Searchwork getSearchwork() { return swork; } public Searchwork getModel() { return swork; // 返回实例化后的对象 } /*******二、注入招聘信息Service********/ private ISearchworkService searchworkService; public void setSearchworkService(ISearchworkService searchworkService) { this.searchworkService = searchworkService; } /** * 1. 招聘信息列表展示 */ public String sworkList() { // 查询所有员工 List<Searchwork> listSwork = searchworkService.getAll(); // 保存到request request.put("listSwork", listSwork); return "sworkList"; } /** * 2. 进入到添加招聘信息页面 */ public String viewAdd(){ return "sworkAdd"; } /** * 2. 添加员工 - 添加招聘信息数据 */ public String save(){ // 调用Service,保存信息 searchworkService.save(swork); return "sworklistAction"; // 重定向到Action } /** * 3. 修改招聘信息 - 进入修改视图 */ public String viewUpdate(){ // 获取要修改的记录的id int id = swork.getId(); // 1. 根据招聘信息的主键查询 (lazy="false") Searchwork swork = searchworkService.findById(id); // 已经有部门信息 // 数据回显 ValueStack vs = ActionContext.getContext().getValueStack(); vs.pop();// 移除栈顶元素 vs.push(swork); // 入栈 return "sworkEdit"; } /** * 4. 修改招聘信息 - 确认修改 */ public String update() { //1. 更新招聘信息 searchworkService.update(swork); return "sworklistAction"; // 重定向到列表 } /** * 5. 修改招聘信息 - 删除 */ public String delete(){ // 获取要删除招聘信息的主键 int sworkId = swork.getId(); // 调用service删除 searchworkService.delete(sworkId); return "sworklistAction"; } // 接收框架运行时候传入的代表request对象的map private Map<String, Object> request; public void setRequest(Map<String, Object> request) { this.request = request; } } ``` ``` %@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>招聘列表展示</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <div align="center" style="width:80% "> <s:a href="swork_viewAdd">添加招聘信息</s:a> </div> <table border="1" align="center" width="80%" cellpadding="5" cellspacing="0"> <tr> <th>序号</th> <th>工作名称</th> <th>工作地点</th> <th>薪水</th> <th>操作</th> </tr> <s:if test="#request.listSwork != null"> <s:iterator var="swork" value="#request.listSwork" status="st"> <tr> <td> <s:property value="#st.count"/> </td> <td> <s:property value="#swork.id"/> </td> <td> <s:property value="#swork.jobName"/> </td> <td> <s:property value="#swork.workPlace"/> </td> <td> <s:property value="#swork.income"/> </td> <td> <s:a href="swork_viewUpdate?id=%{#swork.id}">修改</s:a> <s:a href="swork_delete?id=%{#swork.id}">删除</s:a> </td> </tr> </s:iterator> </s:if> <s:else> <tr> <td colspan="5">对不起,没有你要找的数据!请先录入。</td> </tr> </s:else> </table> </body> </html> ``` 初学者求大神告知哪里出错,为什么用浏览器打开jsp会报错no result defined for action and result error
Ueditor 跨域上传图片,图片回显不能接收到json数据问题。
问题描述:搭建了俩服务器,一个资源服务器,一个应用服务器, 当使用Ueditor上传功能时,必须将图片上传到资源服务器,也就是远程服务器时,会出现跨域问题,一个应用服务器时用Ueditor上传图片到一个应用中,没有问题,json也可以接收到,但上传到资源服务器时,上传的Controller可以正常执行、返回json数据,但接收不到json数据,导致图片无法回显 使用 document.domain = "http://localhost";会报错,不知如何配置。 菜鸟一枚,请高手指点一二 **1.downFile=文件服务器 / tuji=项目目录** (文件服务器地址为:http://localhost:8080 项目目录地址:http://localhost:80) ![图片说明](https://img-ask.csdn.net/upload/201708/11/1502443327_119661.png) ![图片说明](https://img-ask.csdn.net/upload/201708/11/1502443386_267950.png) . Ueditor.all.js报错的位置 ![图片说明](https://img-ask.csdn.net/upload/201708/11/1502444900_772575.png) **2.jsp页面代码** ``` <%@ page language="java" contentType="text/html; charset=UTF-8" import="com.tuji.utils.FileUtil" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% String contextPath = FileUtil.httpPath; %> <%-- <% String contextPath = "http://"+request.getServerName()+":"+request.getLocalPort()+request.getContextPath(); %> --%> <!DOCTYPE html> <script type="text/javascript" charset="utf-8" src="<%=contextPath%>/resource/web/common/ueditor/third-party/jquery-1.10.2.js"></script> <script type="text/javascript" charset="utf-8" src="<%=contextPath%>/resource/web/common/ueditor/ueditor.config.js"></script> <script type="text/javascript" charset="utf-8" src="<%=contextPath%>/resource/web/common/ueditor/ueditor.all.js"> </script> <script type="text/javascript" charset="utf-8" src="<%=contextPath%>/resource/web/common/ueditor/lang/zh-cn/zh-cn.js"></script> <script> //编辑器资源文件根路径 最好在ueditor.config.js中配置 window.UEDITOR_HOME_URL = "<%=contextPath%>/"; //建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例 var ue = UE.getEditor('editor',{initialFrameHeight: 500,initialFrameWidth:800,maximumWords:3000,elementPathEnabled:false}); //复写UEDITOR的getActionUrl 方法,定义自己的Action UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl; UE.Editor.prototype.getActionUrl = function(action) { if (action == 'uploadimage' || action == 'uploadfile') { var id = $('#carInfoId').val(); return '<%=contextPath %>/file/ueditorUpload'; } else { return this._bkGetActionUrl.call(this, action); } }; // 复写UEDITOR的getContentLength方法 解决富文本编辑器中一张图片或者一个文件只能算一个字符的问题,可跟数据库字符的长度配合使用 UE.Editor.prototype._bkGetContentLength = UE.Editor.prototype.getContentLength; UE.Editor.prototype.getContentLength = function(){ return this.getContent().length; } </script> <html> <head> <%@ include file="../../common/common.jsp"%> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="${ctx}/resource/web/sys/sys/sys.css"> <link rel="stylesheet" type="text/css" href="${ctx}/resource/web/common/css/backstageCommon.css"> <%-- <script type="text/javascript" charset="utf-8" src="${ctx }/resource/web/common/ueditor/ueditor.config.js"></script> --%> <%-- <script type="text/javascript" charset="utf-8" src="${ctx }/resource/web/common/ueditor/ueditor.all.min.js"> </script> --%> <!-- 建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败 --> <!-- 这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文 --> <%-- <script type="text/javascript" charset="utf-8" src="${ctx }/resource/web/common/ueditor/lang/zh-cn/zh-cn.js"></script> --%> </head> <body class="bgColor2" style="text-align: center;"> <div style="width: 20%;margin: 0 auto;margin-top: 10%;"> <form id="saveForm" action="${ctx }/sys/opus/saveContent" method="post"> <input type="hidden" name="id" value="${opus.id }"> <input type="button" id="close" class='bgColor2 borderColor2 fontColor1 btn alertBtn pageBtn' style='margin: 0 auto;font-size:12px;margin-bottom: 80px;' value="关&nbsp;闭"> <input type="button" id="saveContent" class='bgColor2 borderColor2 fontColor1 btn alertBtn pageBtn' style='margin: 0 auto;font-size:12px;margin-bottom: 80px;' value="保&nbsp;存"> <br/> <div style="color: white;margin-bottom: 30px;">${opus.name }</div> <script name="content" id="editor" type="text/plain"> ${opus.content } </script> </form> </div> <%@ include file="../../common/upload.jsp"%> </body> <!-- 富文本编辑器 --> <script type="text/javascript"> // document.domain = "http://localhost:8080"; $("#close").click(function() { window.close(); }); var isFirst = true; $("#saveContent").click(function() { if(!isFirst){ return; } $("#saveForm").submit(); return; $.ajax({ type: "POST", url: "${ctx}/sys/opus/saveContent", data:{ "id" : '${opus.id}', "content" : $("#editor").val() }, dataType : "json", success: function(data) { if(data.result == 0){ alert("保存成功!") }else{ alert(data.msg); } } }); }); $(".pageBtn").hover(function() { $(this).removeClass("bgColor2"); $(this).addClass("bgColor1"); $(this).removeClass("fontColor1"); $(this).addClass("fontColor3"); $(this).css("transition", "all 0.25s ease"); }, function() { $(this).removeClass("bgColor1"); $(this).addClass("bgColor2"); $(this).removeClass("fontColor3"); $(this).addClass("fontColor1"); $(this).css("transition", "all 0.5s ease"); }); </script> </html> ``` ``` **3.接收Ueditor上传的Conroller** /** * Ueditor 文件上传Action * @param req * @return UEDITOR 需要的json格式数据 */ @CrossOrigin @RequestMapping(value="ueditorUpload",method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Map<String,Object> upload(HttpServletRequest request){ Map<String,Object> result = new HashMap<String, Object>(); MultipartHttpServletRequest mReq = null; MultipartFile file = null; InputStream is = null ; String fileName = ""; try { mReq = (MultipartHttpServletRequest)request; // 从config.json中取得上传文件的ID file = mReq.getFile("upfile"); // 原始文件名 UEDITOR创建页面元素时的alt和title属性 String originalFileName = file.getOriginalFilename(); String filePath = ""; if (!file.isEmpty()) { try { String newName = UUID.randomUUID().toString() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String path = FileUtil.getUeditorDownPath(); FileUtil.uploadFile(request, new BufferedInputStream(file.getInputStream()), path + newName); filePath = path + newName; Long fileSize = file.getSize(); SysFile sysFile = new SysFile(); sysFile.setPath(filePath); sysFile.setSize(fileSize + ""); sysFile.setName(originalFileName); sysFileServiceI.saveOrUpdate(sysFile); result.put("state", "SUCCESS");// UEDITOR的规则:不为SUCCESS则显示state的内容 result.put("url", FileUtil.getHttpPath() + filePath); result.put("title", originalFileName); result.put("original", originalFileName); } catch (IOException e) { e.printStackTrace(); result.put("success", false); result.put("msg", "服务器异常,请联系管理员!"); } return result; } else { result.put("success", false); result.put("msg", "文件内容为空!"); return result; } } catch (Exception e) { System.out.println(e.getMessage()); result.put("state", "文件上传失败!"); result.put("url",""); result.put("title", ""); result.put("original", ""); System.out.println("文件 "+fileName+" 上传失败!"); } return result; } ```
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问