前言
http://192.168.0.311/sk/s01?name=dd&password=123456
sk 就是站点
s01 访问的服务类
Request对象的常用方法
//常用方法 例 http://192.168.0.311/站点名称/对外访问路径?name=dd&password=123456
//获取请求的完整路径(从http开始,到?前面结束)
log(req.getRequestURL().toString());//注: 这里是 L
//获取请求的部分路径(从项目站点开始,到最后?前面结束)
log(req.getRequestURI());//注: 这里是 I
//获取请求的参数(从?开始,到最后)
log(req.getQueryString());
//获取指定的参数
String uname=req.getParameter("name");
String upswd=req.getParameter("password");
//获取重复的参数 一般如复选框的参数他们的参数名都是一样的 例 http://192.168.0.311/站点名称/对外访问路径?name=ddd&password=123456&hobbys=羽毛球&hobbys=足球&hobbys=篮球
String[] hobbys =req.getParameterValues("hobbys");
if (hobbys.length>0&&hobbys !=null){
for (String s:hobbys){
log(s);
}
}
//获取请求方式(GET和POST)
log(req.getMethod());
//获取协议版本(HTTP/1.1)
log(req.getProtocol());
解决中文乱码问题
/**
* Tomcat8 及以上
* GET 不会出现乱码
* POST 会乱码 服务器是有一个默认的解码编码格式 ISO-8859-1,不能解析中文 ,所以解决方式是,重新设置解码编码格式
*
* 解决方式:获取参数前面加 req.setCharacterEncoding("UTF-8");
*
*
* Tomcat7 及以下版本
*
* POST 乱码
* GET 乱码
* 无论什么版本 post请求都会乱码 所以重新设置解码编码格式
* req.setCharacterEncoding("UTF-8");
*
*GET 解决方式
*
* new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")
*
*
* req.setCharacterEncoding("UTF-8"); 只针对POST请求
* */
log(new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8"));
请求转发(页面跳转)
跳转页面
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 请求转发
* 可以让请求由服务端跳转到客户端
* 服务端行为
*
* 特点:
* 1.服务端行为
* 2.地址栏不改变
* 3.
* */
@WebServlet("/s03")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uname=request.getParameter("name");
log("Servlet03 uname:"+uname);
//请求跳转到Servlet04
//request.getRequestDispatcher("s04").forward(request,response);
//请求跳转到 jsp页面
//request.getRequestDispatcher("login.jsp").forward(request,response);
//跳转到html 页面
request.getRequestDispatcher("login.html").forward(request,response);
}
}
被跳转页面
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 请求转发
* 可以让请求由服务端跳转到客户端
* 服务端行为
* */
@WebServlet("/s04")
public class Servlet04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uname=request.getParameter("name");
log("Servlet04 uname:"+uname);
}
}
请求转发(页面跳转):就是有意向的页面跳转,比如输入账号密码登录成功后的跳转
重定向:你没有登录账号,但是却直接访问了登录后的页面地址,服务端检测到你没有登录就会告诉浏览器一个地址,浏览器就会再发一次请求,重定向到登录页面地址让你登陆
请求转发 | 重定向 |
---|---|
request.getRequestDispatcher(“s05”).forward(request,response); | response.sendRedirect(“s05”); |
一次请求,数据在request中共享 | 两次请求,request中的数据不共享 |
服务端行为 | 客户端行为 |
地址栏不发生变化 | 地址栏发生变化 |
地址只能是项目下的资源,如jsp,html,等等文件 | 可以是任意地址(跨域跳转),如www.baidu.com |
Servlet 作用域(页面跳转传值)
我是这样理解的,用于页面跳转时传递数据给下个跳转的页面,只在一次请求中有效,即页面跳转中有效
使用方法:
设置域对象内容,传递的值
/*
*req.setAttribute(String name,Object value);
*req.setAttribute(键,值);
*/
req.setAttribute("uname","空白");
获取域对象内容,传递的值
/*
*req.getAttribute(String name);
*req.getAttribute(键);
*/
String name=(String)req.getAttribute("uname");
删除域对象内容,传递的值
/*
*req.removeAttribute(String name);
*req.removeAttribute(键);
*/
req.removeAttribute("uname");