get和post区别:
比较项 | get | post |
缓存 | 可以 | 不可以 |
收藏为书签 | 可以 | 不可以 |
数据长度 | 有限制(URL 的最大长度是 2048 个字符) | 无限制 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
对数据类型的限制 | 只允许 ASCII 字符 | 没有限制。也允许二进制数据 |
安全性 | 不安全 | 安全 |
可见性 | 数据在 URL 中对所有人都是可见的 | 数据不会显示在 URL 中 |
1.解决中文乱码:
1.使用POST提交的解决方案:
第一种方式:设置请求编码
request.setCharacterEncoding("UTF-8");
或者
设置响应编码
response.setCharacterEncoding("UTF-8");
第二种:设置jsp页面的编码
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
2.使用get提交的解决方案:
1.治标的方法:
new String( s.getBytes("iso-8859-1"), "utf-8" );
2.通过配置文件(一劳永逸)
conf——>server.xml
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="UTF-8" />
2.资源跳转和数据传递:
1.setAttribute和getAttribute
在JSP中为了方便数据使用,会通过request对象的属性进行保存和读取
这就要使用request对象的两个方法
四大作用域的对象都能够使用这两个方法
方法 | 注意 | 例如 |
void setAttribute(String name,Object o) | 保存数据,该方法没有返回值,参数name表示属性名称,参数o表示属性的值,为Object类型 | request.setAttribute("mess","注册失败") |
public Object getAttribute(String name); | 获取数据,该方法的返回值类型是Object类型,根据属性名获取值。在读取保存数据的时候,需要将数据类型转换为最初的类型。 | String name =(String)request.getAttribute("mess"); |
注意:
- 如果请求对象中没有与参数名对应的属性,getAttribute会返回null值,所以我们在使用时要做非空判断,否则会出现空指针异常。
- getAttribute返回值类型是Object类型,而最初存入的数据是其他类型,就需要数据类型转换
2.重定向sendRedirect("URL"):
当客户端浏览器提交请求到服务器时,服务器JSP的处理结果是要客户端重新向服务器请求一个新的地址。重定向通常用于在处理完某个请求后,将用户引导到一个新的页面。这种技术在许多场景中都非常有用,例如表单提交后的结果页面跳转、登录验证后的页面跳转等。
重定向是基于response的response.sendRedirect("URL") 方法
注意:当页面跳转到指定页面时,本次请求数据将会丢失
response.sendRedirect("url")
3.使用转发实现页面跳转getRequestDispatcher
和重定向不同的是,转发可以使数据在多个页面中共享
请求转发是在服务器内部完成的,客户端不会感知到页面的变化。这意味着浏览器地址栏中的 URL 不会改变
request.getRequestDispatcher("path").forward(request,response);
4.转发和重定向比较
区别:
1.转发url没有发生变化,而重定向会
2.转发不会重新发送请求,重定向会
3.转发可以携带参数,而重定向,不可以不能够共享request,response
4.转发只可跳转当前项目路径,而重定向可以跳转任意url,转发只能在同一个WEB应用中使用,可以共享request范围内的数据
3、九大内置对象包含四大作用域:
3.1九大内置对象:
1.Cookie:
方法 | 说明 |
public void addCookie(Cookie cookie) | 添加数据 |
public Cookie[] getCookies() | 获取数据 |
public void setMaxAge(int expiry) | 设置有效期 |
一个cookie只能记住一个键值对
// 创建cookie对象
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);// 将 Cookie 添加到响应中
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
前后端分离,前端怎么存,JSP是属于后端的
前端就用Cookie
记住密码传过来的值要么是null要么是value
例子:前端cookie记住用户名和密码:
中文字段在传入的时候要编码
取出的时候要解码
//获得传过来的jzmmString jzmm = request.getParameter("jzmm");//cookie记住密码if (jzmm!=null){Cookie cookie1 = new Cookie("id",request.getParameter("id"));cookie1.setPath("/");String procode1 = URLEncoder.encode(procode);Cookie cookie2 = new Cookie("procode",procode1);cookie2.setPath("/");response.addCookie(cookie1);response.addCookie(cookie2);}
index页面读取cookie
cookie都是数组,因为浏览器默认生成一个cookie
<%String id = "";String procode="";// 获取cookieCookie[] cookies = request.getCookies();for (Cookie cookie:cookies){if (cookie.getName().equals("id")){id=cookie.getValue();}if (cookie.getName().equals("procode")){procode=URLDecoder.decode(cookie.getValue());}}
%>
2.response对象:
响应对象
重定向
response.sendRedirect("url")
3.out对象
out.print("内容");
3.2.四大作用域:
1.ContentType:
只作用在本页面,它的有效范围只在当前jsp页面里。是四大作用域里范围最小的
getAttribute的返回类型是Object
如果使用转发或者重定向离开本页面,数据不能用
//存入数据pageContext.setAttribute("name","阿梦");//取出数据String name = pageContext.getAttribute("name").toString();
2.Request:
范围是一次请求,从客户端到服务器的一次过程
使用转发数据也能用
是JSP的内置对象,所以可以在JSP中直接使用
保存了用户的请求数据,通过调用相关方法就可以实现请求数据的读取
获取数据常用方法:
方法 | 说明 |
String getParameter(String name) | 获取指定名称的请求参数值。 |
String[] getParameterValues(String name) | 获取指定名称的请求参数的所有值 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward( )方法用于转发请求 |
//存入值request.setAttribute("name","阿梦");//获取值String name = request.getAttribute("name").toString();
如果是String转int
//id是int类型
int id = Integer.parseInt(request.getParameter("id"));
案例:在注册页面中输入的数据在JSP页面中显示
表单
<form name="dataform" action="doUser.jsp" method="post"><table class="tb"><tr><td align="center" colspan="2" style="text-align: center" class="text_tabledetail2">用户注册</td></tr><tr><td class="text_tabledetail2">用户名</td><td><input type="text" name="username"></td></tr><tr><td class="text_tabledetail2">密码</td><td><input type="password" name="password"></td></tr><tr><td colspan="2" style="text-align: center"><button type="submit" class="page-btn" name="save">注册</button></td></tr></table>
</form>
jsp页面
<%String username = request.getParameter("username");//读取用户名out.print("用户名"+username);String password = request.getParameter("password");out.print("密码"+password);
%>
3.session对象
如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。
只要用户不关闭浏览器,使用同一个浏览器都可以访问到
用其他浏览器访问不到
session工作方式:
当服务器接收到客户端的请求时,服务器会先检查是否已经为这个客户端创建了session,判断方法是通过唯一标识“sessionid”来实现,如果客户端的请求中带有"sessionid"服务器就会将session读出来,否则会重现创建一个session,并生成对应的sessionid,在首次相应过程中返回到客户端保存
方法 | 说明 | 例子: |
void setAttribute(String name, Object value); | 在请求中保存属性,以key-value的方式保存对象值 | session.setAttribute("userName", "张三丰"); |
Object getAttribute(String name); | 在请求中获得属性,通过key获取对象值 | String userName=(String)session.getAttribute("userName"); |
String getId(); | 获取sessionid | |
void invalidate(); | 设置session对象失效 |
属性是加“”的。
//存入session,前头是属性,后头是值session.setAttribute("username", username);session.setAttribute("password", password);
//存入值
session.setAttribute("name","张三");
//输出sessionIDout.print(session.getId());//获取值
String name = session.getAttribute("name").toString();//清空session中name键中的值session.removeAttribute("name");
//设置60秒非session活动时间后清除session中的值
session.setMaxInactiveInterval(60);
//设置所有session失效
session.invalidate();//servlet中获取session:
HttpSession session=request.getSession();//获取session对象
4.Application
//存入值
application.setAttribute("name","张三");//获取值
String name = application.getAttribute("name").toString();servlet中获取:
ServletContext application = this.getServletContext();// 获取application
计数器:
application里面也能装好多东西,所以我们判断的时候要判断指定的key是否为空
int count=1;if (application.getAttribute("count")!=null){count = Integer.parseInt(application.getAttribute("count").toString());count++;}application.setAttribute("count",count);out.print("<h1>访问次数: " + count + "</h1>");