Web开发–Response,Request
绝对路径:
两种写法
1、带有网络三要素:
http://ip地址:端口号/资源路径
2、不带有网络三要素:(要求是访问的资源必须在同一个服务器上)
/资源路径 /不能省略
配置web.xml的Servlet类的映射地址
<servlet>
<servlet-name>PathDemo1Servlet</servlet-name>
<servlet-class>com.geshihua.PathDemo1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PathDemo1Servlet</servlet-name>
<url-pattern>/pathAbso</url-pattern>
</servlet-mapping>
通过资源路径
http://localhost:8080/demo01.html
在这个demo01这个html文件中访问servlet的资源路径
<a href="http://127.0.0.1:8080/pathAbso">带有网络三要素的绝对路径</a>
<br>
<a href="/pathAbso">不带有网络三要素的绝对路径</a>
发现两种写法都可以发出对应的Get请求
相对路径
(相对路径相对的是当前的URL地址,而不是相对于当前项目而言的)
配置web.xml的Servlet类的映射地址
<servlet>
<servlet-name>PathDemo2Servlet</servlet-name>
<servlet-class>com.geshihua.PathDemo2Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PathDemo2Servlet</servlet-name>
<url-pattern>/pathAbso2</url-pattern>
</servlet-mapping>
通过资源路径
http://localhost:8080/demo02.html
在这个demo02这个html文件中访问servlet的资源路径
<a href="./pathAbso2">相对路径第一种写法</a>
<br>
<a href="pathAbso2">相对路径第二种写法</a>
发现两种写法都可以发出对应的Get请求
用../表示访问的是上一级目录
用./表示访问的是当前的目录
Servlet基于注解进行开发
注解开发实现
1、导入对应的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
2、通过注解@WebServlet(urlPatterns=“/Xxx”)
//urlPatterns:表示该Servlet的访问路径
@WebServlet(name = "AnnotationServlet", urlPatterns = "/AnnotationServlet")
如果绑定的是多个路径地址
urlPatterns={"/Xxx1","Xxx2"}
value属性相当于urlPatterns属性但是如果只有一个属性的时候可以省略等同于是注解的原理
(注解中只有一个value属性的时候属性名value可以不写直接写对应的值即可
)
@WebServlet("/Xxx")
request和response测试样例
在浏览器客户端url中输入对应的get请求
http://localhost:8080/requestAndResponse?username=zhangsan
通过服务器接收对应的请求
@WebServlet("/requestAndResponse")
public class RequestAndResponseDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO:request对象处理客户端浏览器的请求数据
String username=request.getParameter("username");
System.out.println(username);
// TODO:response对象处理服务器向客户端浏览器的响应数据
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("<h1>Hello World</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
通过response对象返回响应到浏览器客户端中
// TODO:response对象处理服务器向客户端浏览器的响应数据
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("<h1>Hello World</h1>");
在浏览器中得到对应的结果
<h1>Hello World</h1>
HTTP协议(请求报文协议,响应报文协议)–通过F12按键点击网络查看具体信息
浏览器客户端发出 ++请求
++ 到Tomcat服务器
遵循请求报文协议
1、请求行–》位于标头(Header)的常规栏(General)
1.1请求服务器的地址
1.2请求方式(方法):Get/Post
2、请求头–》位于标头的请求标头(Request Headers)中
** 通过key:value的形式存在**
(表示的是客户端浏览器的一些信息,通过请求头设置告知给Tomcat服务器)
3、请求体–》位于载荷Payload中
3.1、内容为浏览器发给服务器的请求参数
username:zhangsan
pwd:123
3.2、get请求没有请求体,请求参数位于url地址后面通过拼接在?后面:url?请求参数名1=请求参数值1&请求参数名2=请求参数值2
3.3、Post请求的请求参数位于请求体中
3.4、get只能传输字符数据,Post可以传输字符数据,字节数据
3.5、get有大小传输限制,Post没有限制
request实例对象获取请求行的常用API方法
@WebServlet("/demo1")
public class RequestApiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//TODO:request对象获取请求行的常见API方法:
String method = request.getMethod();//获取请求方式
System.out.println(method);
String contextPath = request.getContextPath();//获取项目访问路径-->
// 如果项目访问路径为/web01,则输出/web01,如果为/,则输出空字符串
System.out.println(contextPath);
String queryString = request.getQueryString();//获取请求参数
System.out.println(queryString);
String requestURI = request.getRequestURI();//获取请求URI不包括网络三要素
System.out.println(requestURI);
String requestURL = request.getRequestURL().toString();//获取请求URL包含网络三要素
System.out.println(requestURL);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
request实例对象获取请求头的常用API方法
request.getHeader("User-Agent");
//TODO:参数
的值必须和请求头的名称(key)
保持一致
@WebServlet("/demo2")
public class RequestHeaderApiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//TODO:request对象获取请求头的常见API方法:
String header = request.getHeader("User-Agent");//TODO:参数的值必须和请求头的名称(key)保持一致
System.out.println(header);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
request实例对象获取请求体的常用API方法—》获取请求体只能通过Post的方式获取,因为get方法是没有请求体的
@WebServlet("/demo3")
public class RequestBodyApiServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*TODO:request对象获取请求体的常见API方法:
获取请求体数据方法:
1、BufferedReader getReader()方法:获取字符数据
2、InputStream getInputStream()方法:获取字节数据或者字符数据
*/
//1、获取输入流的对象
BufferedReader reader = request.getReader();
//2、使用字符缓冲流读取数据
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);//输出为:
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
总结得出对应的请求参数的获取如下:
get方式的请求获取请求参数的方法是:getQueryString()
post方式的请求获取请求参数的方法是:
(1)getReader()
(2)getInputStream()
获取请求参数的通用方式:
1、Map<String,String[]> getParameterMap()方法:获取所有请求参数的Map集合,抓包冒号左边的参数名,就是Map集合的key,冒号右边的参数值,就是Map集合的value
2、String getParameter(String name)方法:获取指定请求参数的值
3、String[] getParameterValues(String name)方法:获取指定请求参数的所有值
@WebServlet("/demo4")
public class RequestDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
TODO:获取请求参数的通用方式:
1、Map<String,String[]> getParameterMap()方法:获取所有请求参数的Map集合
抓包冒号左边的参数名,就是Map集合的key,冒号右边的参数值,就是Map集合的value
2、String getParameter(String name)方法:获取指定请求参数的值
3、String[] getParameterValues(String name)方法:获取指定请求参数的所有值
*/
Map<String, String[]> map = request.getParameterMap();
map.forEach((key, values) -> {
System.out.println(key + "=" + Arrays.toString(values));
});
String username = request.getParameter("username");
System.out.println(username);
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
页面前端发送表单请求通过post的形式进行提交
input标签中的name就是对应的Map集合的key,如果有value指定那么对应的value就是Map集合的value集合的value
<form action="/demo4" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="1"> 游泳
<input type="checkbox" name="hobby" value="2"> 爬山 <br>
<input type="submit">
</form>
请求转发:
(如果要在转发的过程中携带数据的话就需要通过在获取转发器之前设置参数到request请求域中去 request.setAttribute("msg","请求转发");
前一个参数为参数的key,后一个参数为值value)
1、获取转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/testForward2");
2、转发跳转到目标资源路径 dispatcher.forward(request,response);
3、跳转到目标资源了之后通过**request.getAttribute("msg");
** 获取对应的request域中的数据
@WebServlet("/testForward1")
public class TestForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* TODO;请求转发
*/
System.out.println("danqian");
//TODO:设置request请求域数据
request.setAttribute("msg","请求转发");
//TODO:获取转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/testForward2");
//TODO:转发跳转到目标资源中
dispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
@WebServlet("/testForward2")
public class TestForward1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* TODO;接收请求转发
*/
//接收转发的请求,执行代码
System.out.println("forward");
//TODO:获取转发的请求域数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Tomcat服务器 ++响应
++ 到浏览器客户端
遵循响应报文协议
1、响应行:位于控制台网络中的标头的常规中
1.1、状态代码:200 OK,404,500,405等
1.2、响应协议:版本
2、响应头:位于控制台网络中的标头的响应标头中
2.1、响应时间
2.2、响应到浏览器的字符个数
3、响应体
服务器发给浏览器的数据位于响应中,如果是进行的一次静态页面的访问的话,响应的数据为对应的HTML页面的代码显示在响应体中
API方法:
Response请求重定向:进行重定向的话对应的url地址栏会根据重定向的路径相应的改变(原理是服务器的一个资源没有能力去处理这个业务,会将新的资源路径告知给浏览器,浏览器重新访问这个新的资源路径)----------》这个过程request只会存在一个,前面那个request会在重定向之后自动销毁
实现步骤:
1、设置响应状态码:
Response.setStatus()
2、设置新的地址location,通过response设置响应头的相关数据response.setHeader()
@WebServlet("/responseDemo1")
public class ResponseDemo1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//TODO:设置响应状态码为302:表示需要进行重定向
response.setStatus(302);
//TODO:设置响应头,包含location信息,表示重定向的地址
response.setHeader("location", "/responseDemo2");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
@WebServlet("/responseDemo2")
public class ResponseDemo2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 重定向之后,进行响应
System.out.println("我可以处理相关的请求");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向和请求转发的区别:
注意:如果携带有request域对象的数据就需要使用请求转发,否则使用重定向
关于这两者的跳转路径来说:
1、请求转发的跳转路径不能加虚拟路径(访问服务器内部资源)
2、重定向转发的跳转路径需要加虚拟路径(访问服务器外部资源)