JavaEE学习笔记之Servlet/JSP(2)
java ee2016-07-08
1.Form表单的提交
A.先说说提交方式,比较常用的有两种 get 和 post ,当然还有其他的提交方式,如 pull 、header 、等等。
由form表单里面的Methed属性控制(默认为GET方式)
GET:
①把数据放在协议的头部
②可以在浏览器的地址栏里面看到
③安全性不高
④只能提交最多256个字符
POST:①把数据放在协议的体部
②不可以在浏览器的地址栏中看到
③安全性高
④数据的长度是没有限制的
⑤明确指定使用POST提交,否则默认都用GET
B.拿到你在form表单里面填写的各项数据
request.getParameter(String key); //key 为表单中输入框的中的name属性的值
2.乱码问题
原则:字符从编写到显示都采用一种编码
A.控制字符编写的编码
Eclipse中Window->Preferences–>输入 endoding–>可以对各种文件设置编码(css、html、xml、jsp)–>Encoding(GBK、UTF-8)随便选一个
这样的话你新建出来的文件的编码格式就为你设置的编码格式了。
B.数据传输上控制
request.setCharacterEncoding(“UTF-8”);
response.setCharacterEncoding(“UTF-8”);
C.request接收表单提交中文参数乱码问题解决
get方式提交表单:
对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。
解决办法:
1) 在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
String name = request.getParameter("name");//接收数据
name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request
对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
2) server.xml中配置
URIEncoding=utf-8
D.浏览器显示的乱码
//告诉浏览器发送过去的内容是什么类型的,并用什么编码格式解析
response.setHeader("content-type","text/html;charset=utf-8");
E.数据库中的乱码
存的时候是什么编码方式,那么取的时候就是什么编码格式
3.路径问题
相对路径:相对点—->相对当前访问的路径
绝对路径:全路径 —->/
1.在servlet后台中,/代表web应用的路径 WebContent
2.在前台中,/代表的是服务器根目录 webapps
4.跳转问题
假设 com.briup.servlet 包下有两个Servlet:
AServlet--->url-partern: /a
BServlet--->url-partern: /b
一、服务器的内部跳转
特点:
①浏览器的地址不会发生改变
②可以携带数据跳转
③只能访问Web应用内部的数据
如果浏览器请求a,而a请求b,b在相应浏览器,浏览器只请求了一次,所以地址不会发生变化。
两步:
1)获取跳转分发器(跳转转发器)
a.通过request获取分发器
request.getRequestDispatcher("/a");
b.可以从上下文获取分发器
getServletContext().getRequestDispatcher("/b");
/表示的是项目的根目录即WebContent
2)进行跳转
a.forword:清空前一个response的数据
b.include:保留前一个response的数据
二、.重定向跳转
response.sendRedirect("/dispatcher2");
特点:
①地址栏发生了改变
②没拿到request传递的数据
③可以访问外部资源的
如果浏览器请求a,而a返回叫浏览器访问b,就再发出请求b,b再相应,浏览器发出了两次请求,所以浏览器地址栏会发生变化。
举个例子:
假设请求地址为:http://localhost:8888/week2/one/a.jsp
而 a.jsp中是这样
<a href="loginServlet">aa</a>
当你点击aa的时候,地址变成 http://localhost:8888/week2/one/loginServlet 因为这是相对路径,并且a.jsp的路径为 http://localhost:8888/week2/one/
如果 a.jsp是这样的
<a href="/loginServlet">aa</a>
当点击aa的时候,地址变成 http://localhost:8888/loginServlet 因为/代表webapp即 http://localhost:8888/
注意:
如果想要访问在WEB-INF中的页面或者文件,必须使用内部跳转,因为WEB-INF是一个安全目录,不能直接访问。
如:请求地址:http://localhost:8888/week2/oneServlet 现在需要访问 WEB-INF/jsp/one.jsp
在oneServlet 中使用内部跳转
request.getRequestDispatcher("WEB-INF/jsp/one.jsp").forward(req,resp);
因为这是相对路径,而oneServlet 的路径为 http://localhost:8888/week2/,所以one.jsp 的地址为 http://localhost:8888/week2/WEB-INF/jsp/one.jsp,但是不能直接访问哦,因为WEB-INF是安全目录。
5.三大数据存放对象
ServletContext------application
一直存在于项目中,直到项目被关闭
application.setAttribute();
HttpServletRequest-----request
request.setAttribute();
存在于一次请求中
HttpSession-----session
存在与会话期间
session.setAttribute();
前台向后台传值
<form action="loginServlet">
<input name="username" type="text"/>
<input name="aaa" type="text"/>
<input type="submit">
</form>
<a href="loginServlet?username=terry&aaa=123">登陆</a>
LoginServlet中代码{
request.getParameter("");
}
后台向前台传值(域)
ServletContext
配置信息
HttpSession
登陆信息
HttpServletRequest
请求信息
6.Cookie & Session
1) Cookie
Cookie在服务器端产生的,以文件的形式保存在客户端的,客户端每次发送请求,都会将相应的Cookie发送给服务器端
过程:
1.在服务器端创建Cookie对象
new Cookie("name", "briup");
Cookie里面只能存放String类型
2.发送给本地、客户端保存起来。
response.addCookie(c);
3.查询Cookie,request
request.getCookies();
cookie的存活期:默认为-1
会话Cookie:把Cookie保存到浏览器上,当存活期为负数,所以只要一关闭浏览器,Cookie就没有了
持久Cookie:把Cookie保存到文件中,当存活期为正数,单位为秒
设置存活期:c.setMaxAge(int seconds);
2) session
创建于服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存到客户端的Cookie中,保存形式是以JSESSIONID来保存的。
步骤:
1.创建Session
HttpSession s = request.getSession();
2.放数据
session.setAttribute("name", "钦总");
3.取数据
session.getAttribute("name");
让Session失效
1.关闭浏览器的时候
2.session.invalidate();
3.设置session的最大存活期
a.session.setMaxInactiveInterval(10); 单位为秒
10:不活动时间(发呆时间)
b. 在servers中的web.xml的
<session-config>
<session-timeout>30</session-timeout>
</session-config>
单位为分钟(默认为20分钟)
当浏览器被禁用,session不能使用的时候,就采用重写URL,就是在URL地址后加上JSESSIONID
String url = response.encodeURL(path);
response.sendRedirect(url);