2017-03-24,周末整理
这一周主要的重点仍旧在servlet上,然后学习了MVC模式,如何按照这个模式去实现一些复杂的功能。实现前端和后端之间相互联系,在编写程序的时候,一定要有一个清晰的思路,不能混乱,尤其是在处理各种页面相互跳转的时候。这一周还有一个重点就是JSP(JAVA server page)本质上它仍旧是一个servlet,只不过它的侧重点在于展示页面内容,方便我们从服务器端得到响应。
- servlet的多线程问题
- servlet的多线程机制:servlet的生命周期是由Web容器负责的,当客户端第一次请求某个servlet的时候,servlet容器会根据web.xml配置文件来实例化这个servlet,之后新的客户端来请求时,不会创建新的实例,也就是有多个线程在使用这个实例,servlet容器会自动使用线程池等技术来支持。所以在servlet中设置实例变量时要慎之又慎!
- servlet的JMM(java memory model):系统存在一个主存区,java中所有的实例变量都存在这个主存当中,对于所有的线程都是共享的,然后每一个线程分配到一个工作内存区,工作内存由缓存和堆栈构成,缓存中保存的是主存中实例变量的拷贝,缓存并不总是和主存同步的,堆栈中保存的是线程中的局部变量,线程之间是无法相互直接访问堆栈中的变量。但是对于高并发的场景,此方法在一段时间内只能有一个线程在运行,所以也不是个很好的解决方法。
- 如何设计线程安全的servlet:1、实现SingleThreadModel接口,实现了此接口的类,将不会创建多线程,始终保持一个线程,也就是说容器将创建多个实例变量,所以现在被淘汰。2、使用synchronized关键字保证一次只有一个线程可以访问受保护的区段。3、避免使用实例变量,只要不使用实例变量,就不会造成数据紊乱的情况发生。
- 表单提交前的校验
- 主要是在JS中来实现,可以预先在客户端进行校验,保证数据传递的效率,方法有三种:1、在submit按钮中添加onclick事件,return true则提交,return false则不提交。2、直接用button按钮添加onclick事件,如果数据正确,则调用form对象的submit()方法。3、在form标签中修改onsubmit属性,return true则提交。
- 防止表单重复提交:在客户端中有两种方法,1、在js脚本中设置一个标志变量,来区分是否已经提交。2、在单击提交按钮后将提交按钮设置成disabled状态。但是这两种方法都不能应对浏览器后退和刷新的情况。
- Cookie:
- cookie是服务器保存在客户端上的一些信息,Cookie类,request对象的.getCookies();方法,返回的是一个Cookie数组,然后遍历就行了。有name和value属性。
- 向客户端写入Cookie:Cookie cookie=new Cookie("name","value");cookie.setMaxAge("millis");response.addCookie(cookie);注意在写入Cookie的时候要注意编码问题。
- JSP(java server page)
- 是一种服务器端脚本语言,可以混合java代码和html标签一起使用的技术,能动态生成html。JSP最终会生成java class,是一个规范,是J2EE中重要的一部分,jsp运行在web容器中,设计时是JSP形态,运行时是容器编译成的Servlet形态。
- JSP指令directives,用来设置属性,1,<%@page ... %>; 2,<%@include ... %>注意被包含的文件中不能有<html>,<head>,<body>; 3,<%@taglib ... %>;
- JSP声明Declaration,可以定义一些变量,同时也可以定义一些方法。<%! ... %>
- JSP表达式Expressions,表达式,<%= ... %>其结果会在HTML中显示。注意表达式中没有;号
- JSP脚本Scriptlet,jsp中嵌入的脚本代码。注意与html严格分开来。
- 9个内嵌变量,request, response, session, application, config, pageContext, out, page, exception(只能在isErrorPage="true"中使用)。
- jsp标签,<jsp:include .../>可以传递参数。与<%@include ..%>区别,一个是动态的取得标签所引用文件的输出结果,一个是在编译时静态的导入所引用的文件。
- JavaBean:就是一个java类,实现了SUN公司的JavaBean规范,set、get, is, 需要一个无参数的构造函数,需要实现序列化的接口Serializable
- <jsp:useBean /> ?
- <jsp:getProperty />取得JavaBean中的属性值
- <jsp:setProperty/>设置对象的属性值
- EL(ExpressionLanguage):在JSP中使用的运算式,${... },便于维护web数据,主要是用来存取、操作对象或数据。
- JSTL(Java Server Pages Standard Tag Lib):标准标记库,<c:out value=""/> <c:set var="" scope="" value=""/> <c:if test="">...</c:if> <c:choose><c:when test=""></c:when><c:otherwise></c:otherwise></c:choose> <c:foreach items="" var="" (varStatus)></c:foreach>总之JSTL就是用来解决jsp中出现<%javacode%>的情况的。*然后还可以自定义标签。
- MVC设计模式:model,指的是java的各种模型,也就是类;view,主要用jsp和jstl来实现;controller,servlet。
- filter:过滤器,是一段可重用的,转换http请求,响应内容和头信息的代码,它先于与之相关的servlet或jsp页面运行在服务器上。过滤器可以附加到多个servlet和jsp页面上,并且可以检查进入这些资源的请求信息。创建过滤器:建立一个类实现Filter接口。每个filter也只有一个实例,对请求和响应进行拦截,并执行过滤方法,然后传到下一级filter或资源中。