request对象①(常用方法)
代码
<%@ page import="java.util.Enumeration" %><%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/26
Time: 16:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>request对象的常用方法①</title>
</head>
<body>
<!--<% %>小脚本:嵌入Java代码的部分-->
<%
request.setCharacterEncoding("utf-8"); // 设置当前请求编码集为utf-8 只针对于post请求 重点
String method = request.getMethod(); // 获取请求方式
String serverName = request.getServerName(); // 获取服务器名称
int serverPort = request.getServerPort(); // 获取服务器端口
String clientName = request.getRemoteAddr(); // 获取浏览器名称(IP)
/* request.getRemoteAddr();request.getRemoteUser();request.getRemoteHost();这三个方法是一样*/
int clientPort = request.getRemotePort(); // 获取浏览器端口
String uri = request.getRequestURI(); // 获取到浏览器要请求的页面路径
Enumeration<String> enumer = request.getHeaderNames(); // 获取到头部信息
String contentType = request.getContentType(); // 获取页面格式和编码集
String encoding = request.getCharacterEncoding(); // 获取到编码集
String protocol = request.getProtocol(); // 获取到协议
out.print("请求方式:"+method + "<br/>");
out.print("服务器名称:"+serverName + "<br/>");
out.print("服务器端口:"+serverPort + "<br/>");
out.print("浏览器名称(IP):"+clientName + "<br/>");
out.print("浏览器端口:"+clientPort + "<br/>");
out.print("浏览器要请求的页面路径:"+uri + "<br/>");
out.print("头部信息:"+enumer + "<br/>");
out.print("页面格式和编码集:"+contentType + "<br/>");
out.print("编码集:"+encoding + "<br/>");
out.print("协议:"+protocol + "<br/>");
%>
</body>
</html>
运行结果
这里发现ip显示的是localhost,如果想要显示 ip的是ip地址,大家可以把 网页搜索栏里的localhost改成自己的本机ip地址,想要获取自己电脑的IP地址可以在cmd命令里直接输入ipconfig就可以看到。
这里的print报红是没有错的,代码运行完全没有问题,想要去掉这个报红,可以在idea的项目设置--->项目结构--->模块--->依赖--->添加--->库,选择tomcat,添加所选项并应用就好了,如果还是解决不了,可以把要输出的部分放在一个函数里,函数在<%!%>里面定义,然后在<% %>中调用,就不会再报红了
JSP中out.print()和out.printIn()为什么是一样的效果
另外,这里的out.print()和out.printIn(),是一样的效果,如果想要换行,可以在后面+“<br/>”来实现换行,因为,printIn()是java的换行,这里就涉及到jsp的流程,用户将1.jsp传给tomcat服务器,服务器首先将1.jsp翻译为1.Java,1.java会编译成1.class,然后运行(从1.Java到1.class printIn()其实实现了换行),但是在tomcat服务器经过编译后展示给用户的是1.html,
HTML的换行是<br/>,所以,哪怕通过编译将内容换行变成两行显示,最终的1.html在响应用户的时候由于两行内容没有用<br/>进行换行,所以它仍会合并为一行显示。举例如图所示
这是两行字,但是没有<br/>进行换行,运行就会显示为一行,这也是在jsp中,为什么
out.print()和out.printIn(),是一样的效果,都无法实现换行。
request对象②(接收浏览器请求信息)
代码
2-1.jsp
<%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/26
Time: 17:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="2-2.jsp" method="post">
账号:<input type="text" name="name"/><br/>
密码:<input type="password" name="pass"/><br/>
年龄:<input type="number" name="age"/><br/>
爱好: <input type="checkbox" name="love" value="足球"/>⚽
<input type="checkbox" name="love" value="篮球"/>🏀
<input type="checkbox" name="love" value="乒乓球"/>🏓
<input type="checkbox" name="love" value="网球"/>🎾<br/>
<button>发送</button>
</form>
</body>
</html>
2-2.jsp
<%@ page import="java.util.Map" %>
<%@ page import="java.util.Arrays" %><%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/26
Time: 17:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>如何接收浏览器的请求信息</title>
</head>
<body>
<%
//设置请求的编码集,处理乱码
request.setCharacterEncoding("utf-8");
//接收浏览器的请求信息
String name=request.getParameter("name");//根据名字(name)获取到相应的值
String pass=request.getParameter("pass");//根据名字(pass)获取到相应的值
int age=Integer.parseInt(request.getParameter("age"));//getParameter()获取到的值是String,根据需要自行强转
String [] love=request.getParameterValues("love");//接收一个参数多个值的情况(复选框,下拉菜单等)
String sex=request.getParameter("sex");//没有参数名为sex的值,会显示为null
Map<String,String[]> allParam=request.getParameterMap();//获取所以请求信息
out.print(name+"<br/>");
out.print(pass+"<br/>");
out.print(age+"<br/>");
out.print(Arrays.toString(love)+"<br/>");
out.print(sex+"<br/>");
out.print("<hr/>");
out.print("所以传过来的参数名:"+allParam.keySet()+"<br/>");
out.print("所以传过来的参数值:"+allParam.values()+"<br/>");
%>
</body>
</html>
运行结果
request对象③(页面跳转---->转发)
代码
3-1.jsp
<%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/27
Time: 15:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>3-1.jsp</h1>
<%
System.out.println("3-1.jsp");//方便在控制台观察页面跳转的情况
//页面跳转---转发
request.getRequestDispatcher("3-2.jsp").forward(request,response);
//3-2.jsp 新跳转的页面,除此之外,其余写死
%>
</body>
</html>
3-2.jsp
<%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/27
Time: 15:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>3-2.jsp</h1>
<%
System.out.println("3-2.jsp");
%>
</body>
</html>
运行结果
可以发现,我去的是3-1.jsp,但是页面加载出来显示的内容实际上却是3-2.jsp的内容 ,在输出台上明显可以看出,运行了3-1.jsp,3-2.jsp也会运行。这就是通过request.getRequestDispatcher("3-2.jsp").forward(request,response);实现了3-1.jsp到3-2.jsp的一个页面跳转。
request对象④(request容器)
request容器,每次用户请求服务器的时候web容器就会自动创建request容器对象,它们是共存亡的。
代码
<%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/27
Time: 15:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>4.jsp</title>
</head>
<body>
<%
// request容器操作
// 向request对象自带容器中添加内容
request.setAttribute("A", 123); // 向request容器中存放了一个内容-->123,起名为A
request.setAttribute("B", "admin");
String[] array = {"aa", "bb", "cc"};
request.setAttribute("C", array);
request.setAttribute("D", "admin"); //Value可以重复
request.setAttribute("B", true);// Key不能重复 会覆盖原有内容
// 删除request对象自带容器中内容
request.removeAttribute("C");
// 从request对象自带容器中获取内容
Object v1 = request.getAttribute("A");
Object v2 = request.getAttribute("B");
Object v3 = request.getAttribute("C");
Object v4 = request.getAttribute("D");
Object v5 = request.getAttribute("E");
out.print(v1 + "<br/>");
out.print(v2 + "<br/>");
out.print(v3 + "<br/>");
out.print(v4 + "<br/>");
out.print(v5 + "<br/>");
%>
</body>
</html>
运行结果
这里第三个也就是key为C的值是被删除了,所以显示null,而最后一个也就是E,我们没有放内容,所以也显示的是null
request对象⑤(request的生命周期or作用域)
前面提到,每次用户请求服务器的时候web容器就会自动创建request容器对象,那我们未能在4.jsp里向request容器中放了写内容,现在我们在5.jsp里去取存放在request容器里的内容,5.jsp和4.jsp会有不同吗?
代码
<%--
Created by IntelliJ IDEA.
User: skype
Date: 2022/5/27
Time: 15:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>5.jsp</title>
</head>
<body>
<%
Object v1 = request.getAttribute("A");
Object v2 = request.getAttribute("B");
Object v3 = request.getAttribute("C");
Object v4 = request.getAttribute("D");
Object v5 = request.getAttribute("E");
out.print(v1 + "<br/>");
out.print(v2 + "<br/>");
out.print(v3 + "<br/>");
out.print(v4 + "<br/>");
out.print(v5 + "<br/>");
%>
</body>
</html>
运行结果
通过运行结果,可以明显发现,5.jsp去取request容器里的内容显示空的,也就是说什么也没有取到,既然request容器在每次用户请求服务器的时候自动创建,和服务器共存亡,那么,我在4.jsp里往request容器里存放的内容按理说5.jsp应该是可以拿到的,但事实却与之相反,这是为什么呢?这里就牵扯到一个request生命周期也就是作用域的问题
Request 作用域,它的作用域只是一次用户的请求内,即用户发送一个请求的时候Request 创建,当用户被响应这次请求的时候 Request 就会消亡。通俗来讲,就是用户请求页面加载的时候Request创建,页面展示出来时Request 消亡。
所以在这里,5.jsp拿不到4.jsp存放在容器里的内容 。