温故而知新,古人诚不欺我,每一次精进都是一次重新认识。
Servlet
- 简述Servlet
- 负责接收用户请求HttpServletRequest
- 在do- get(),doPost()中做相应的处理
- 并将回应HttpServletResponse反馈给用户
- 特点
- 初始化时init()方法,销毁时调用destroy()方法
- Servlet需要在web.xml中配置,一个Servlet可以设置多个URL访问
- Servlet不是线程安全,因此要谨慎使用类变量
- Servlet接口
- Servlet接口定义了5个方法,前三个方法与Servlet生命周期相关
- void init(ServletConfig config) throws ServletException
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
- void destory()
- java.lang.String - getServletInfo()
- ServletConfig - getServletConfig()
- 生命周期
- Web容器加载Servlet并将其实例化后,Servlet生命周期开始
- init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行
- Servlet接口定义了5个方法,前三个方法与Servlet生命周期相关
转发(Forward)和重定向(Redirect)
- 转发是服务器行为,重定向是客户端行为
- 转发(Forword) 通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServletResponse response)方法实现
request.- getRequestDispatcher("login_success.jsp").forward(request, response)
- 重定向(Redirect) 是利用服务器返回的状态吗来实现的
- 地址栏显示 redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址
- 数据共享 forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据
- 使用方式
- forward:一般用于用户登陆的时候,根据角色转发到相应的模块
- redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
JSP和Servlet
- Servlet能够依靠服务器的支持向浏览器提供显示内容
- JSP会被服务器处理成一个类似于Servlet的Java程序,目的简化页面内容的生成
- Servlet和JSP最主要的不同
- Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来
- JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件
- JSP侧重于视图,Servlet更侧重于控制逻辑,,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
JSP工作原理
- JSP是一种Servlet,但是与HttpServlet的工作方式不太一样
- HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译
- JSP只会在客户端第一次请求的时候被编译
JSP九大内置对象及作用
- request:封装客户端的请求,其中包含来自- get或POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:通过该对象可以获取其他对象;
- session: 封装用户会话的对象
- application:封装服务器运行环境的对象
- out: 输出服务器响应的输出流对象
- config: Web应用的配置对象
- page: JSP页面本身(相当于Java程序中的this)
- exception:封装页面抛出异常的对象
Request对象的主要方法
- setAttribute(String name,Object):设置名字为name的request 的参数值
- getAttribute(String name):返回由name指定的属性值
- getAttributeNames():返回request 对象所有属性的名字集合,结果是一个枚举的实例
- getCookies():返回客户端的所有 Cookie 对象,结果是一个Cookie 数组
- getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body的长度
- getHeader(String name) :获得HTTP协议定义的文件头信息
- getHeaders(String name) :返回指定名字的request Header 的所有值,结果是一个枚举的实例
- getHeaderNames() :返回所以request Header 的名字,结果是一个枚举的实例
- getInputStream() :返回请求的输入流,用于获得请求中的数据
- getMethod() :获得客户端向服务器端传送数据的方法
- getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值
- getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
- getParameterValues(String name):获得有name指定的参数的所有值
- getProtocol():获取客户端向服务器端传送数据所依据的协议名称
- getQueryString() :获得查询字符串
- getRequestURI() :获取发出请求字符串的客户端地址
- getRemoteAddr():获取客户端的 IP 地址
- getRemoteHost() :获取客户端的名字
- getSession([Boolean create]) :返回和请求相关 Session
- getServerName() :获取服务器的名字
- getServletPath():获取客户端所请求的脚本文件的路径
- getServerPort():获取服务器的端口号
- removeAttribute(String name):删除请求中的一个属性
request.getAttribute()和 request.getParameter()
- 获取方向
- getParameter()是获取 POST/GET 传递的参数值
- getAttribute()是获取对象容器中的数据值
- 使用时机
- getParameter用于客户端重定向
- 用于在用表单或url重定向传值时接收数据用
- getAttribute用于服务器端重定向时
- getAttribute 只能收到程序用 setAttribute 传过来的值
- 在 sevlet 中使用了 forward 函数,或 struts 中使用了 mapping.findForward
- 其他
- 可以用 setAttribute,getAttribute 发送接收对象.而 getParameter 显然只能传字符串
- getParameter只是应用服务器在分析你送上来的 request页面的文本时的值
- getParameter用于客户端重定向
- 小结
- getParameter 返回的是String,用于读取提交的表单中的值
- getAttribute 返回的是Object,需进行转换,可用setAttribute 设置成任意对象
include 指令与行为
- include指令: JSP可以通过include指令来包含其他文件
- 包含的文件会被同时编译执行
- 语法格式如:
<%@ include file="文件相对 url 地址" %>
- include动作: jsp:include动作元素用来包含静态和动态的文件。
- 该动作把指定文件插入正在生成的页面
- 语法格式:
<jsp:include page="相对 URL 地址" flush="true" />
- JSP九大内置对象,七大动作,三大指令
JSP中的四种作用域
- page 代表与一个页面相关的对象和属性
- request 代表与Web客户机发出的一个请求相关的对象和属性
- 个请求可能跨越多个页面,涉及多个Web组件
- 需要在页面显示的临时数据可以置于此作用域
- session 代表与某个用户与服务器建立的一次会话相关的对象和属性
- 跟某个用户相关的数据应该放在用户自己的session中。
- application 代表与整个Web应用程序相关的对象和属性
- 实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
实现JSP或Servlet的单线程模式
- 对于JSP页面,page指令进行设置。
<%@page isThreadSafe=”false”%>
- 对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口
- 如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例
会话
- 会话跟踪技术
- Cookie
- 优点 数据可以持久保存,不需要服务器资源,简单,基于文本的Key-Value
- 缺点 大小受到限制,用户可以禁用Cookie功能,由于保存在本地,有一定的安全风险。
- URL 重写
- 在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话
- 优点: 在Cookie被禁用的时候依然可以使用
- 必须对网站的URL进行编码,所有页面必须动态生成,不能用预先记录下来的URL进行访问
- 隐藏的表单域
- Cookie被禁时可以使用
- 所有页面必须是表单提交之后的结果
- HttpSession
- 当一个用户第一次访问某个网站时会自动创建 HttpSession
- 通过HttpServletRequest对象的getSession方法获得HttpSession
- HttpSession放在服务器的内存中,目前的Servlet容器可以在内存将满时将HttpSession 中的对象移到其他存储设备中
- HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口
- Cookie
- Cookie和Session的区别
- HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户
- 服务端要为特定的用户创建了特定的Session,用于标识并跟踪用户
- 在服务端保存Session的方法有内存、数据库、文件等
- 集群的时候也要考虑Session的转移,通常session信息放在内存
- 服务端识别特定客户Cookie。
- 每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端
- 第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID
- 浏览器禁用了Cookie,URL重写的技术来进行会话跟踪。
- Cookie记住密码
- HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户
- 小结
- Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中
- Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
static关键字使用场景
- 修饰成员变量和成员方法
- static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用
- 被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区
- 调用格式:类名.静态变量名 类名.静态方法名()
- 静态代码块
- 静态代码块定义在类中方法外, 静态代码块在非静态代码块之前执行
- 执行顺序 静态代码块—>非静态代码块—>构造方法
- 该类不管创建多少对象,静态代码块只执行一次
- 静态内部类(static修饰类的话只能修饰内部类)
- 静态内部类 vs 非静态内部类
- 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,静态内部类却没有
- 没有这个引用就意味着
- 它的创建是不需要依赖外围类的创建
- 它不能使用任何外围类的非static成员变量和方法
- 静态内部类 vs 非静态内部类
- 静态导包(用来导入类中的静态资源,1.5之后的新特性)
- 格式为:import static
- 指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
- static{}静态代码块与{}非静态代码块
- 相同
- 都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,定义多个时按定义的顺序执行
- 不同
- 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)
- 静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次
- 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
- 应用场景
- 如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的
- 若想要设计不需要创建对象就可以调用类中的方法,例如:Arrays类,Character类,String类等,就需要使用静态方法
- 静态代码块是自动执行的而静态方法是被调用的时候才执行的
- 相同
this关键字
- this关键字用于引用类的当前实例
- super关键字用于从子类访问父类的变量和方法
- 小结
- this、super不能用在static方法中
- super 调用父类中的其他构造方法时,调用时要放在构造方法的首行
- this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西。