一、表单提交方式之Get和Post的区别
Get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB,安全性较低但效率比Post方式高。适合提交数据量不大,安全性不高的数据。比如:搜索、查询等功能。
Post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。比如:注册、登录、修改、上传等功能。
二、Jsp内置对象
1、Request对象
request对象封装了客户端的请求信息,通过它才能了解到客户的需求,然后做出响应,request对象具有请求域,即完成客户端的请求之前,该对象一直有效,是HttpServletRequest的实例对象,常用方法如下:
String getParameter(String name):返回name指定参数的参数值,常用于获取页面提交的数据
String[] getParameterValues(String name) :返回所有包含参数name的数组
void setAttribute(String,Object):存储此请求中的属性,常用于请求转发时给下个页面传递数据
object getAttribute(String name):返回name指定的属性值,常用于获取RequestScode的属性
String getContentType():返回请求体的MIME类型
String getProtocol():返回请求用的协议类型及版本号
String getServerName():返回接收请求的服务器主机名
2、Response对象
response对象包含了响应客户请求的有关信息,但在Jsp中很少直接用到它,它的对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效,是HttpServletResponse的实例对象,常用方法如下:
String getCharacterEncoding():返回响应用的字符编码格式
void setContentType(String type):设置相应的MIME类型
PrintWriter getWriter():返回一个可以向客户端输出字符的对象,注意:getWriter()获得的对象输出内容会提前于内置对象out输出内容。解决:调用out.flush();
sendRedirect(String location):重新定向客户端的请求
3、Session对象
session对象在第一个Jsp页面被装载时自动创建,完成会话期管理,从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话,当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器通过session对象可知这几个页面是同一个客户操作,服务器的内存中保存着不同用户的session,是HttpSession的实例对象,在HttpServerletRequest中获取,常用方法如下:
long getCreateTime():返回SESSION创建时间
String getId():返回SESSION创建时Jsp引擎为它设置的唯一标识
Object setAttribute(String name,Object value):用指定名称将对象绑定到此会话
Object getAttribute(String name):返回指定名称绑定的对象,如不存在,返回null
String[] getValueNames():返回一个包含此SESSION所有可用数据的集合
int getMaxInactiveInterval():返回SESSION在两次请求之间的最大存活时间,单位秒
Session的生命周期:创建、活动、销毁。
Session的销毁方式(3种):session.invalidate();session超时;服务器重启;
服务器如何判断多个页面是同一个会话:在Session被创建时,服务器会为Session对象指定一个唯一的标识ID,当客户端后续访问服务器时,Session对象都会把这个标识ID传给服务器,这样服务器就能识别出访问当前页面的是哪一个会话了。同一个Session对象的生命周期为打开浏览器开始,直到关闭浏览器结束。
Session的使用场景:保存登录验证码图片的文字、保存登录前的访问路径(如在商城中浏览商品无须登录,当购买商品时,需要进行用户登录,此时就需要保存当前访问的路径,直到登录成功后,从Session中将路径取出,这里保存的是相对路径,即经过控制器拦截处理的路径)。
注意:当所有页面关闭后,重新打开一个新的页面,Session对象虽然会重新创建,但原有的Session不会被销毁,这个旧的Session对象仍存在于服务器端,只不过再无客户端携带它与服务器校验,直到Session超时,这个Session对象才被销毁,Tomcat默认的Session超时时间为30分钟,我们可以通过session.setMaxInactiveInterval(时间/秒),也可在xml中配置
4、Out对象
out对象常用于向客户端输出内容。
void println():向客户端打印字符串
void clear():清除缓冲区的内容,如果在flush()方法后调用会抛出异常
void clearBuffer():清除缓冲区的内容,在flush()方法后调用不会抛出异常
void flush():将缓冲区内容输出到客户端
int getBufferSize():返回缓冲区字节数的大小,如不设缓冲区,则大小为0
int getRemaining():返回缓冲区剩余可用的空间大小
boolean isAutoFlush():返回缓冲区满时,是自动清空还是抛出异常
void close():关闭输出流
5、Application对象
application对象实现了用户间数据的共享,可存放全局变量,它开始于服务器的启动,终止于服务器的关闭,在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性操作,在任何地方对application对象属性的操作,都将影响到其他用户对此的访问,服务器的启动和关闭决定了application对象的生命,它是ServletContext类的实例,常用方法如下:
void setAttribute(String name,Object value):使用指定名称将对象绑定
Object getAttribute(String name):返回指定名称绑定的对象,如无绑定,返回null
Enumeration getAttributeNames():返回所有可用属性名的枚举
String getServerInfo():返回Jsp(Servlet)引擎名和版本号
6、Page对象
page对象就是指向当前Jsp页面本身,有点像类中的this指针,它是Java.lang.Object类的实例,常用方法如下:
class getClass():返回此Object的类
int hashCode():返回此Object的hash码
boolean equals(Object obj):判断此Object是否与指定的Object对象相等
void copy(Object obj):把此Object拷贝到指定的obj对象中
Object clone():克隆此Object对象
String toString():把此Object对象转换成String类的对象
void notify():唤醒一个等待的线程
void notifyAll():唤醒所有等待的线程
void wait(int timeout):使一个线程处于等待状态知道timeout结束或被唤醒
void wait():使一个线程处于等待直到被唤醒
7、PageContext对象
pageContext对象提供了对Jsp页面内所有的对象及名字空间的使用,它可以访问到本页所在的session,也可以取得本页面所在的application的某一属性值,它相当于页面中所有功能的集成者,它本类名也是pageContext,常用方法如下:
JspWriter getOut():返回当前客户端响应被使用的JspWriter流(out)
HttpSession getSession():返回当前页中的HttpSession对象
Object getPage():返回当前页的Object对象(page)
ServletRequest getRequest():返回当前页的ServletRequest对象
ServletResponse getResponse():返回当前页的ServletResponse对象
void setAttribute(String name,Object attr):设置属性和属性值
Object getAttribute(String name,int scope):指定范围内取出属性值
int getAttributeScope(String name):返回某属性的作用范围
void forward(String relativeUrlPath):使当前页面重导到另一页面
void include(String relativeUrlPath):在当前位置包含另一文件
8、Config对象
config对象是在一个Servlet初始化时,Jsp引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(属性名和属性值构成)以及服务器的有关信息(传递一个ServletContext对象),常用方法如下:
ServletContext getServletContext():返回含有服务器相关信息的ServletContext对象
String getInitParameter(String name):返回初始化参数的值
Enumeration getInitParameterNames():返回Servlet初始化所需所有参数的枚举
9、exception对象
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象,如果一个Jsp页面要应用此对象,就必须把isErrorPage设为true,否则无法编译,它是Java.lang.Throwable的实例,常用方法如下:
String getMessage():返回描述异常的消息
String toString():返回关于异常的简短描述信息
void printStackTrace():显示异常及其栈轨迹
Throwable FillInStackTrace():重写异常的执行栈轨迹
捕捉页面使用:errorPage="异常捕捉交给谁处理"
处理页面使用 :isErrorPage="是否应用exception对象"
三、请求转发与请求重定向
请求重定向:客户端行为,本质等于两次请求,第一次请求对象不保存,URL地址会改变
通过HttpServerletResponse对象:response.sendRedirect("/login.html");
通过Controller返回类型:return "redirect:/login.html";
通过Jsp指令:
例子:你去A局办事,A局的人告诉你这事属于B局管,然后你走出A局,自己乘车去了B局。
请求转发 :服务器行为,是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变
通过HttpServerletRequest对象:request.getRequestDispatcher("/login.html").forward(req,resp);
通过Controller返回类型:return "forward:/login.html";
通过Jsp指令:
例子:你去A局办事,A局知道这事属于B局管,它并没有拒绝你的请求,而是帮你联系B局办事。
四、JavaBean的使用
1、Javabean的设计原则
共有类、无参的共有构造方法、属性私有、getter()和setter()方法
2、Jsp动作
Jsp动作元素为请求处理阶段提供信息,动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选的内容、与开始标签匹配的结束标签。
3、Jsp中使用Javabean的两种方式
像Java类一样,直接创建实例
<% Manager manager =new Manager(); %>
Jsp动作标签里使用Javabean
<jsp:useBeanid="manager" scope="page" class="jspUseBean.Manager">
scope是作用域范围,id是唯一标识,class是Javabean的全类名(包名+类名)
4、给已实例化的Javabean对象属性赋值的四种方式
name的属性是useBean的id,property的值是所匹配的javabean的属性,从表单获取,value的值是手动为javabean设置属性,params的值是从request对象的参数获取,request参数的赋值方法,如:
<jsp:setProperty property=" * " name="manager"/>
<jsp:setProperty property="username" name="manager" />
<jsp:setProperty property="username" name="manager" value="wjx" />
<jsp:setProperty property="username" name="manager" params="wjx" />
5、获取Javabean对象属性的值
<jsp:getProperty property="username" name="manager" value="wjx" />
6、Javabean的4个作用域范围,可用userBean的scope属性来设置范围
page: 仅在当前页面有效
request:请求范围,可以通过HttpRequest.getAttribute()方法获取Javabean对象,
session:会话范围,可以通过HttpSession.getAttribute()方法获取Javabean对象
application:全局范围,可以通过application.getAttribute(0方法获取Javabean对象
五、Cookie对象
Cookie是Web服务器保存在客户端的一系列的文本信息,典型应用:判断注册用户是否已经登录网站,购物车的处理等。作用:对特定对象的追踪,保存用户网页浏览记录与习惯,简化登录,弊端是容易泄漏用户信息,常用方法如下:
void setmaxAge(int expiry):设置cookie有效期,单位秒
int getMaxAge():获取cookie对象的有效时长,单位秒
void setValue(String value):对cookie对象进行赋值
String getValue():获取cookie的值
String getName():获取cookie的名称
void setPath("/"); 设置共享路径
完整的创建过程:
Cookie cookie = new Cookie("userId", String.valueOf(user.getId()));
cookie.setMaxAge(60 * 60 * 24 * 30);
cookie.setPath("/");
response.addCookie(cookie);
使用场景:商城的购物车(购物车的内容是一个Json数组,转换成Java即是一个List)、用户的登录状态(用户的唯一标识可以存放在浏览器中)
六、Cookie和Session对比
七、Jsp指令和动作元素
1、include动作(动态引入,不能获取jsp页面数据)
page 指要包含的页面 , flush 指被包含的页面是否从缓冲区读取
2、forward动作
3、param动作
常常与
4、include指令(静态引入,能获取jsp页面数据)
<%@ include file="/WEB-INF/include/taglib.jsp" %>
5、指令和动作比较
八、中文乱码
1、URL传中文参数出现乱码
例子:URL传中文参数
解决:选择Tomcat目录下的Server.xml,找到Connector字段,Connector里面是默认端口号以及其他配置信息,再往里添加URIEncoding="utf-8"字段,然后重启Tomcat服务器。注:在代码中使用request.setCharacterEncoding("utf-8");不能解决URL传中文乱码的问题。
URI和URL的区别:URL是绝对路径,URI是相对路径。
2、表单传中文参数出现乱码
例子:<%=request.getParameter("username")%> (接收表单页面的代码)
原因:Tomcat在提交表单时默认的编码格式是ISO-8859-1,我们需要的是utf-8。
解决:在例子代码执行前设置Tomcat的编码格式,request.setCharacterEncoding("utf-8");
3、中文信息保存在cookie对象中,先转码再保存,获取后再解码。
import Java.net.*;
request.setCharacterEncoding("utf-8");
转码:String username =URLEncoder.encode(request.getParameter("username"),"utf-8");
解码:username =URLDecoder.decode(cookie.getValue(),"utf-8");
4、Jsp文件里写中文后不能保存代码
原因:Jsp文件的编码格式是ISO-8859-1。
解决:把所有的编码格式都改为utf-8。