学习目标(常用九大内置对象)
- out
- request
- response
- page
- session
- application
- pageContext
- config
- exception
1、什么是JSP内置对象
- JSP内置对象是Web容器创建的一组对象,在JSP页面中不需要new就可以直接使用。
1.1、out对象
- 在网页中输出文本语法:
<%="文本内容1<br/>"%> #表达式输出 <% out.print("文本内容2<br/>"); %> #out对象 <% out.println("文本内容3<br/>"); %> #out对象
- out对象是向用户输出内容最常用的内置对象
- out对象常用方法:
- 常用方法的使用:
out.println(out.getRemaining()); out.println(out.isAutoFlush()); out.println("<br>调用clearBuffer前"); out.flush(); out.clearBuffer(); out.println("<br>调用clearBuffer后"); out.println("<br>调用clear前"); out.flush(); out.clear();//此时发生错误 out.println("<br>调用clear后"); out.flush();
- out对象缓冲区自动刷新设置
<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8" autoFlush="true"%> #此处的autoFlush代表自动输出缓冲池内容 <% out.clearBuffer(); for(int i=0;i<8174;i++){ out.print("a"); } out.print("<br>"); out.print("缓冲区大小:"+out.getBufferSize()); out.print("<br>"); out.print("缓冲区剩余:"+out.getRemaining()); %>
- out对象的close方法
<% out.println("<br>调用close前"); out.close(); out.println("<br>调用close后"); out.flush(); %>
1.2、request对象
-
request对象主要用于处理客户端请求
-
request对象常用方法:
-
将页面中的动态信息提交给服务器,封装客户端的请求信息
-
有如下登录页面表单login.jsp
<div class="box"> <h1>欢迎回到易买网</h1> <form id="loginForm" method="post" action="UserServlet" onsubmit="return checkForm(this)"> <table> //此处是一个隐式输入框,用于传递参数op <input type="hidden" name="op" value="login"/> <tr> <td class="field">用户名:</td> <td><input class="text" type="text" name="userName" onfocus="FocusItem(this)" onblur="CheckItem(this);"/><span></span></td> </tr> <tr> <td class="field">登录密码:</td> <td><input class="text" type="password" id="passWord" name="passWord" onfocus="FocusItem(this)" onblur="CheckItem(this);"/><span></span></td> </tr> <tr> <td class="field">验证码:</td> <td><input class="text verycode" type="text" name="veryCode" onfocus="FocusItem(this)" onblur="CheckItem(this);"/><img id="veryCode" src="checkCode" onclick="changeCheckCode(this)"/><span></span> </td> </tr> <tr> <td></td> <td> <label class="ui-green"><input type="submit" name="submit" value="立即登录"/></label> <label><a href="forgetPassword.jsp">忘记密码?</a></label> <label style="width:180px;text-align:right;color:red;font-size: 18px;"> ${requestScope.ERRORS}</label> </td> </tr> </table> </form> </div>
-
servlet服务程序端
/** * @author 一宿君(CSDN : qq_52596258) * @date 2021-05-25 07:04:03 */ @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { UserService userService = new UserServiceImpl(); /** * 登录 * * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { try { //请求转发 req.getRequestDispatcher("HelloWorld.jsp?id=1001&name=zhangsan").forward(req,resp); }catch (Exception ex){ ex.printStackTrace(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); String op = req.getParameter("op"); switch (op){ case "register": register(req,resp); break; case "login": login(req,resp); break; case "forgetPassword": forgetPassword(req,resp); break; case "showUpdatePwdPage": showUpdatePwdPage(req,resp); break; case "updatePwd": updatePwd(req,resp); break; } } }
-
HelloWorld.jsp接收页面
<%-- Created by IntelliJ IDEA. User: wang'bo'shi Date: 2021/5/28 Time: 10:49 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> <% String userName = request.getParameter("userName"); out.print("用户名:" + userName); String password = request.getParameter("passWord"); out.print("<br>密码:" + password); %> <br>提交方式: <%=request.getMethod() %><br> 请求的URL地址: <%=request.getRequestURI() %><br> 协议名称: <%=request.getProtocol() %><br> 客户端请求服务器文件的路径: <%=request.getServletPath() %><br> URL的查询部分: <%=request.getQueryString() %><br> 服务器的名称: <%=request.getServerName() %><br> 服务器口号: <%=request.getServerPort() %><br> 远程客户端的IP地址: <%=request.getRemoteAddr()%><br> 获得发出请求的客户端地址: <%=request.getRequestURI()%><br> </body> </html>
1.3、请求转发与重定向的区别
1.3.1、请求转发
- 请求转发(依然从上述login.jsp页面提交請求到UserServlet中的login)
/** * 登录 * * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { /** * 请求转发: * 1、是Web服务器的一次内部行为 * 2、请求地址栏到达servlet层不会改变 * 3、request.setAttribute("userId",userId),可以在请求转发到的页面中通过request.getAttribute("userId"); * 4、页面之跳转一次request还是同一个 */ req.setAttribute("userId","1001"); req.getRequestDispatcher("HelloWorld.jsp").forward(req,resp); }
- HelloWorld.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--此处的request跟UserServlet中的是同一个request--%> userId:<%=request.getAttribute("userId")%> <br> <br>提交方式: <%=request.getMethod() %><br> 请求的URL地址: <%=request.getRequestURI() %><br> 协议名称: <%=request.getProtocol() %><br> 客户端请求服务器文件的路径: <%=request.getServletPath() %><br> URL的查询部分: <%=request.getQueryString() %><br> 服务器的名称: <%=request.getServerName() %><br> 服务器口号: <%=request.getServerPort() %><br> 远程客户端的IP地址: <%=request.getRemoteAddr()%><br> 获得发出请求的客户端地址: <%=request.getRequestURI()%><br> </body> </html>
1.3.2、重定向
- 请求转发(依然从上述login.jsp页面提交請求到UserServlet中的login)
/** * 重定向 * 1、请求地址栏会发生改变 * 2、在重定向到的页面中无法使用request.getAttribute(""); * 3、页面跳转了两次(先请求到servlet,再跳转到重定向页面) */ req.setAttribute("userId","1001"); resp.sendRedirect("HelloWorld.jsp"); }
- HelloWorld.jsp(有新注释)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--注意: --此处的request跟UserServlet中的不是同一个request了 --刚问不到UserServlet中的userId了 --%> userId:<%=request.getAttribute("userId")%> <br> <br>提交方式: <%=request.getMethod() %><br> 请求的URL地址: <%=request.getRequestURI() %><br> 协议名称: <%=request.getProtocol() %><br> 客户端请求服务器文件的路径: <%=request.getServletPath() %><br> URL的查询部分: <%=request.getQueryString() %><br> 服务器的名称: <%=request.getServerName() %><br> 服务器口号: <%=request.getServerPort() %><br> 远程客户端的IP地址: <%=request.getRemoteAddr()%><br> 获得发出请求的客户端地址: <%=request.getRequestURI()%><br> </body> </html>
1.4、getParameterMap()获取所有可用参数的枚举
- 同样是在上述UserServlet的login中
/** * 登录 * * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { try { /** * 获取表单中的所有name参数map集合 */ Map<String,String[]> map = req.getParameterMap(); Set<String> stringSet = map.keySet(); for(String key:stringSet){ System.out.println(key + ":" + req.getParameter(key)); } //请求转发 req.getRequestDispatcher("HelloWorld.jsp?id=1001&name=zhangsan").forward(req,resp); }catch (Exception ex){ ex.printStackTrace(); } }
- 控制台输出
1.5、response对象
- response对象用于响应客户请求并向客户端返回信息
- response对象常用方法:
1.5.1、response对象设置响应数据类型
- 当用户访问JSP页面时,可以使用setContentType操作动态改变contentType属性值,设置响应数据类型有以下几种:
text/html:网页; text/plain:纯文本; application/x-msexcel:Excel文件; application/msword:World文件; application/json:json格式对象
- 仍然是从login.jsp页面进行提交到servlet中的login
- 在login中直接将信息返回给浏览器(text/html:网页)
/** * 登录 * * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { //改变 contentType 的属性值 resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.println("hello ,my name is 一宿君"); }
- 响应json数据类型
/** * 登录 * * @param req * @param resp */ public void login(HttpServletRequest req, HttpServletResponse resp) { //改变 contentType 的属性值 resp.setContentType("application/json;charset=utf-8"); PrintWriter out = resp.getWriter(); //此处要使用转义字符,才能识别双引号 out.println("{\"id\":\"1001\",\"name\":\"一宿君\",\"age\":21}"); }
1.6、自动转换json格式数据(alibaba)
- 在pom.xml文件中引入如下依赖
<!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
1.6.1、测试Map
public static void main(String[] args) {
Map<Object,Object> map = new HashMap<>();
map.put("id","1001");
map.put("name","zhangsan");
map.put("age",21);
System.out.println(JSON.toJSON(map));
}
1.6.2、测试list集合
public static void main(String[] args) {
List list = new ArrayList();
list.add("1002");
list.add("lisi");
list.add(22);
System.out.println(list);
}
1.6.3、测试将User对象存入list集合中
User user1 = new User();
user1.setUserId("1001");
user1.setUserName("zhangsan");
user1.setPassword("123456");
User user2 = new User();
user2.setUserId("1002");
user2.setUserName("lisi");
user2.setPassword("123456");
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
System.out.println(JSON.toJSON(userList));
控制台输出(list集合输出没有顺序)
[{"password":"123456","role":0,"userName":"zhangsan","userId":"1001","status":0},
{"password":"123456","role":0,"userName":"lisi","userId":"1002","status":0}]
这就很强悍了哈,以后我们会大量使用这种转换json数据格式。