Servlet

tech2024-10-03  14

Http协议

概述

HTTP 协议(Hypertext Transfer Protocol, 超⽂本传输协议),是⼀个客户端请求和响应的标准协 议,这个协议详细规定了浏览器和万维⽹服务器之间互相通信的规则。⽤户输⼊地址和端⼝号之后就可 以从服务器上取得所需要的⽹⻚信息。

浏览器中的书写格式

HTTP协议的特点

⽀持客户/服务器模式。简单快速灵活⽆连接⽆状态

Servlet

创建一个基本的Servlet类

1:创建一个类继承HttpServlet 2:重写service方法 3:设置注解 示例

@WebServlet("/myservlet2") public class MyServlet2 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应编码格式 resp.setContentType("text/html;charset=UTF-8"); /* resp.getWriter().write("hahah ");*/ resp.sendRedirect("http://www.baidu.com"); } }

Servlet的⼯作流程

通过请求头获知浏览器访问的是哪个主机再通过请求⾏获取访问的是哪个⼀个web应⽤再通过请求⾏中的请求路径获知访问的是哪个资源通过获取的资源路径在配置中匹配到真实的路径,服务器会创建servlet对象,(如果是第⼀次访问时,创建servlet实例,并调⽤init⽅法进⾏初始化 操作)调⽤service(request, response)⽅法来处理请求和响应的操作调⽤service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给 浏览器

Servlet的⽣命周期

servlet 类加载–>实例化–>服务–>销毁。

HttpServletRequest对象

常用方法

1. 获取请求的方式 (GET|POST等) 2. 获取请求的完整路径 (从http开始,到?结束) 3. 获取请求的部分路径 (从项目路径开始,到?结束) 4. 获取请求的参数字符串 (从?开始,到最后) 5. 获取请求的协议版本 6. 获取项目的访问路径 (站点名) System.out.println(request.getMethod()); System.out.println(request.getRequestURL()); System.out.println(request.getRequestURI()); System.out.println(request.getQueryString()); System.out.println(request.getProtocol()); System.out.println(request.getContextPath());

获取请求的参数

获取请求的参数 1. 获取指定参数名的参数值 request.getParameter("参数名") 注: 1. 表单提交 参数名表示的是表单元素的name属性值 2. 地址栏输入 参数名表示的是"?键=值&键=值"中的键 2. 获取指定参数名的所有参数值 request.getParameterValue("参数名") // 获取指定参数 String uname = request.getParameter("userName"); System.out.println("姓名:" + uname); String upwd = request.getParameter("userPwd"); System.out.println("密码:" + upwd);

请求转发

if (uname.equals("admin") && upwd.equals("admin")) { /** * 设置请求域:设置数据存放在作用域中,让客户端能够获取数据 */ request.setAttribute("userName",uname); /** * 请求转发 */ request.getRequestDispatcher("index.jsp").forward(request,response); } else { /** * 设置请求域:设置数据存放在作用域中,让客户端能够获取数据 */ request.setAttribute("msg","姓名或密码不正确!"); /** * 请求转发 */ request.getRequestDispatcher("login.jsp").forward(request,response); }

HttpServletResponse对象

响应数据

getWriter() 获取字符流(只能响应回字符) getOutputStream() 获取字节流(能响应⼀切数据)

// 字符输出流 PrintWriter writer = response.getWriter(); writer.write("Hello"); writer.write("<h2>Hello</h2>"); // 字节输出流 ServletOutputStream out = response.getOutputStream(); out.write("Hello".getBytes()); out.write("<h2>Hello</h2>".getBytes());

响应乱码问题

设置响应编码格式

//设置响应编码格式 resp.setContentType("text/html;charset=UTF-8");

重定向

示例代码

// 重定向 response.sendRedirect("http://www.baidu.com");

重定向与请求转发的区别

重定向

一种跳转方式。 由服务端指导的客户端跳转。 1. 客户端跳转。 2. 地址栏会发生改变 3. 存在两次请求 4. request数据不能共享

请求转发

一种跳转方式。 1. 服务端跳转。 2. 地址栏不会发生改变 3. 只有一次请求 4. 数据可以共享

请求转发只能跳转到当前站点名下的资源,不可以跨域。重定向可以跳转到任意资源。

Cookie对象

概述

Cookie是浏览器提供的⼀种技术,通过服务器的程序能将⼀些只须保存在客户端,或者在客户端进⾏ 处理的数据,放在本地的计算机上,不需要通过⽹络传输,因⽽提⾼⽹⻚处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常⻅的记住密码则可以通过 Cookie 来实现。

Cookie对象的创建和发送

创建以及发送的示例代码

// 得到Cookie对象 Cookie cookie = new Cookie("name","admin"); // 发送cookie(将cookie对象响应给客户端) response.addCookie(cookie);

Cookie对象的获取

示例代码

// 获取所有的Cookie对象 Cookie[] cookies = request.getCookies();

Cookie设置到期时间

Cookie的失效时间

cookie默认是关闭浏览器失效(与服务器是否关闭无关) 通过maxAge设置cookie的失效时间 1. 正整数 表示cookie存活指定秒数。 2. 负整数 表示cookie只在浏览器中存活,浏览器关闭即失效.默 认值是-1 3. 零 表示删除cookie

示例

// 得到Cookie对象 Cookie cookie = new Cookie("uname1","zhangsan"); // 设置7天失效 cookie.setMaxAge(7*24*60*60); // 发送cookie(将cookie对象响应给客户端) response.addCookie(cookie);

HttpSession对象

1. Session对象的获取 request.getSession(); 如果session对象存在,则直接获取;如果session对象不存在,则新建session 2. JSESSIONID标识符 当请求到达服务器时,如果使用了session,服务器会去获取一个JSESSIONID的cookie对象 如果cookie对象不存在,则新建session对象,并设置sessionId,将sessionId回传给客户端中,设置对应的cookie 如果cookie对象存在,服务器会比较客户端传递的sessionID是否与服务端的一致 如果不一致,新建session对象,并设置sessionId,将sessionId回传给客户端中,重新设置对应的cookie 如果一致,则获取到当前session对象 Session底层是依赖cookie的,默认关闭浏览器失效。 3. session作用域 在一次会话有效,可以有多次请求和响应,在会话中数据共享。 setAttribute() getAttribute() removeAttribute() request作用域 一次请求中有效,在请求转发中有效,在重定向失效 session作用域 一次会话中有效,无论请求转发还是重定向都有效,会话销毁则失效 4. session的销毁 1. 关闭服务器 2. 关闭浏览器 session底层依赖cookie,cookie默认只在浏览器中存活,浏览器关闭则失效 3. 默认最大不活动时间 当指定时间内没有任何操作,则session对象失效;在时间未到达之前有操作,则会重新计时 服务器中设定了session的最大不活动时间,Tomcat服务器设置的是30分钟 在Tomcat的解压目录的conf中web.xml配置文件中 <!-- session 默认的最大不活动时间。单位:分钟。 --> <session-config> <session-timeout>30</session-timeout> </session-config> 4. 手动设置失效时间 通过session.setMaxInactiveInterval(int) 来设定 session 的最大不活动时间,单位为秒。 通过getMaxInactiveInterval()方法获取当前最大不活动时间 5. 手动销毁 session.invalidate(); // 获取session对象 HttpSession session = req.getSession(); /** * 常用方法 */ System.out.println("SessionId:" + session.getId()); System.out.println("会话创建时间:" + session.getCreationTime()); System.out.println("最后一次访问时间:" + session.getLastAccessedTime()); System.out.println("是否是新的对象:" + session.isNew()); /** * 设置作用域 */ // 设置request作用域 req.setAttribute("name","request"); // 设置session作用域 session.setAttribute("name2","session"); /** * session的销毁 */ // 获取最大不活动时间 int sec = session.getMaxInactiveInterval(); System.out.println("最大不活动时间:" + sec); // 设置最大不活动时间 session.setMaxInactiveInterval(20); // 20秒失效 // 手动销毁 session.invalidate();

ServletContext对象

ServletContext对象的获取

1:通过request对象获取 2:通过session对象获取 3:通过servletConfig对象获取 4:直接获取

示例代码以及常用方法的代码

/** * ServletContext对象的获取 */ // 通过request对象 ServletContext servletContext = req.getServletContext(); // 通过session对象获取 ServletContext servletContext1 = req.getSession().getServletContext(); // 通过servletConfig对象 ServletContext servletContext2 = getServletConfig().getServletContext(); // 直接获取 ServletContext servletContext3 = getServletContext(); /** * 常用方法 */ // 获取项目的真实路径 String realPath = servletContext.getRealPath("/"); System.out.println("获取项目的真实路径:" + realPath); // 获取服务器的版本信息 String serverInfo = req.getServletContext().getServerInfo(); System.out.println("获取服务器的版本信息:" + serverInfo); /** * servletContext作用域 * 在整个应用程序中有效,服务器关闭失效 * setAttribute(); * getAttribute(); * removeAttribute(); */

JSP

基本的语法

JSP Java Server Page,Java Web端的动态资源,是动态页面。

JSP的注释 1. 显式注释 (在浏览器中审查元素或查看源代码可以看到的注释) 1. 继承HTML风格 <!-- HTML的注释 --> 2. 隐式注释(在浏览器中审查元素或查看源代码不可以看到的注释) 1. JSP自己的注释 <%-- JSP注释 --% > 2. 继承Java风格 // 单行注释 /* 多行注释 */ Scriptlet脚本 1. Java脚本段 定义局部变量,编写语句。JSP生成的源码在编译后的Servlet类中的service方法体中 <% %> 2. 声明 声明全局变量、方法、类等。JSP生成的源码在编译后的Servlet类体中 <%! %> 3. 输出 输出变量或字面量。JSP生成的源码在编译后的Servlet类中的service方法体中 <%= %>

静态包括

静态包括 <%@include file="要包含的文件的路径"%> 特点: 相当于将内容进行复制,只会生成一个jsp源码文件,不能出现同名变量。运行效率高一点点,但耦合度高,不够灵活。

代码示例

<%@include file="head.jsp"%> <h2>主体内容</h2> <%@include file="foot.jsp"%>

动态包括

动态包括 <jsp:include page="要包含文件的路径"></jsp:include> 特点: 相当于方法的调用,会生成多个JSP的源码文件,可以定义同名变量。运行效率高,耦合度低。 通过动态包含传递参数 <jsp:include page="head.jsp"> <jsp:param name="参数名" value="参数值"/> </jsp:include> 注: 1. 如果include动态包含没有参数需要传递,双标签中不要有任何内容,包括空格和回车 2. 设置参数时,name属性不支持任何表达式,value属性支持表达式

示例代码

<jsp:include page="head.jsp"></jsp:include> <h2>主体内容</h2> <jsp:include page="foot.jsp"></jsp:include> <%-- 通过动态包含传递参数 --%> <jsp:include page="head.jsp"> <jsp:param name="uname" value="admin"/> <jsp:param name="upwd" value="<%=pwd%>"/> </jsp:include>

EL表达式

语法:${限域变量名} 一般操作的是域对象的值,无法操作变量。 取值范围:从小到大范围,依次查找;如果找到,则显示;未找到,则往大范围找,如果都未找到,则显示空字符串。 从小到大:page范围 -> request范围 -> session范围 -> application范围 获取指定范围的值: pageScope、requestScope、sessionScope、applicationScope 操作数据 List 大小:${限域变量名.size()} 获取指定值:${限域变量名[下标]} Map 获取指定值:${限域变量名.key} -- ${限域变量名["key"]} JavaBean 给属性字段提供get方法 ${限域变量名.属性字段名} -- ${限域变量名.get属性字段名()} empty为空判断 (空返回true;否则返回false) 字符串:判断null和空字符串 List:判断null和size JavaBean:判断null 等值比较 比较两个值是否相等,返回true或false == 或 eq 获取域对象:${uname} <br> 获取域对象:${userName} <br> 获取指定范围的域对象:${sessionScope.uname} <br> 获取变量:${str} <br> <hr><br> <h2>操作指定类型的数据</h2> <% List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); request.setAttribute("mylist", list); %> 获取List的size:${mylist.size()} <br> 获取指定下标的值:${mylist[1]}<br> <br> <% Map map = new HashMap(); map.put("aaa", "111"); map.put("bbb", 2222); map.put("ccc-a", 333); request.setAttribute("map", map); %> 获取Map的值:${map.aaa} -- ${map["bbb"]}<br> <br> <% User user = new User(); user.setUserId(1); user.setUname("zhangsan"); user.setUpwd("123456"); request.setAttribute("user",user); %> 获取JavaBean对象:${user} <br> 获取属性字段:${user.uname } -- ${user.getUpwd()} <br> <br><hr> <h4>empty</h4> <% // 字符串 String str1 = null; String str2 = ""; String str3 = "test"; request.setAttribute("str1",str1); request.setAttribute("str2",str2); request.setAttribute("str3",str3); %> ${str1 == null || str1 == ""} -- ${str1 != null && str1 != ""} -- ${!empty str1} <%-- 判断null与空字符串 --%> ${empty str1} -- ${empty str2} -- ${empty str3} <br><br> <% // List List list1 = null; List list2 = new ArrayList<>(); List<String> list3 = new ArrayList<>(); list3.add("ccc"); request.setAttribute("list1", list1); request.setAttribute("list2", list2); request.setAttribute("list3", list3); %> <%-- 判断null和长度为0 --%> ${empty list1} -- ${empty list2} -- ${empty list3} <br><br> <% // JavaBean User user1 = null; User user2 = new User(); User user3 = new User(); user3.setUserId(1); request.setAttribute("user1",user1); request.setAttribute("user2",user2); request.setAttribute("user3",user3); %> <%-- 判断null --%> ${empty user1} -- ${empty user2} -- ${empty user3}
最新回复(0)