JavaWeb-Servlet基础
目录
一、创建第一个Web项目
二、Servlet介绍
三、Servlet的请求处理
四、Response对象
五、Servlet的使用流程
六、页面跳转
七、Cookie
一、创建第一个Web项目
1.需要继承HttpServlet类
2.需要重写service方法
3.需要在当前类的外面加一个注解:@webServlet("当前程序提供的对外访问的路径")
(1)这个路径我们称为URI
4.可以使用service方法的形参resp调用getWriter()方法,然后再调用write()方法向页面输出内容
(1)格式:resp.getWriter().write("要输出的内容")
5.案例:
package com.web;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;/*** @Description:com.web* @version:1.0* url:网络中的统一定位符*/
@WebServlet("/abc") //@WebServlet注解:指定在浏览器中访问java程序的名称:my 注意要带斜杠(/my是提供对外的访问路径(URI))
public class MyServlet extends HttpServlet {//提供服务@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("MyServlet运行了");//响应数据到浏览器上resp.getWriter().write("my first web");}
}
二、Servlet介绍
1.概念:
(1)狭义的:Servlet是指Java语言实现的一个接口。
(2)广义的:Servlet是指任何实现了这个Servlet接口的的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2.特点:
(1)运行再支持java的应用服务器上(tomcat/ibm/微软)。
(2)Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的servlet进行请求处理。
(3)简单方便,可移植性强。
3.使用:
(1)创建普通的java类并继承HttpServlet;
(2)覆写service方法;
(3)在service方法中书写逻辑代码即可;
(4)在webRoot下的WEB-INF文件夹下的web.xml文件中配置servlet;
4.当前程序除了使用注解的方式可以提供对外访问的路径以外,还可以配置WEB-INF文件夹下面的web.xml文件
(1)xml文件的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
<!-- 当前这个xml文件中的配置相当于tomcat服务器中,所有servlet程序的目录--><servlet><servlet-name>myServlet2</servlet-name><servlet-class>com.web.MyServlet2</servlet-class></servlet><servlet-mapping><servlet-name>myServlet2</servlet-name><url-pattern>/aaa</url-pattern></servlet-mapping>
</web-app>
- 需要先自定义两个标签servlet和servlet-mapping;
- servlet中的servlet-name是随便写的,但是必须和下面servlet-mapping中的servlet-name对应,也就是这个两个必须是一致的;
- servlet中的servlet-class标签之间放的是你要定义访问路径的程序的全路径名,就是包名加类名;
- servlet-mapping中的url-pattern标签之间放的是从浏览器访问的路径,类似于注解@WebServlet("/路径"),这个路径是随便写的;
- 流程:
- 从浏览器访问/aaa-->找到servlet-mapping标签下的servlet-name之间的数据,再当前xml文件中查找有没有和这个servlet-name之间的数据相同的标签-->找到servlet标签下的servlet-name发现这个标签之间的数据和前面servlet-mapping下面的那个标签之间的数据相同-->再同过servlet标签下的servlet-name标签找到当前标签下的servlet-class标签之间的数据-->最后找到处理请求的对应的servlet程序。
5.运行流程:
(1)URL:http://localhost:8888/MyFirstWeb_war_exploded/bbb
(2)URL组成:服务器ip:端口号/虚拟项目名/servlet的别名(访问路径)
(3)URI是RUL的中的一部分:/虚拟项目名/servlet的别名
(4)浏览器发送请求到服务器,服务器根据请求URL地址中的RUI信息再webapps目录下找到对应的项目文件夹,然后再web.xml中检索对应的servlet,找到后调用并执行Servlet。
6.总结:Servlet就是把java代码转换为可以在服务器中运行的手段。
三、Servlet的请求处理
1.HttpServletRequest对象:用来封装浏览器发送的请求数据的对象
(1)使用HttpServletRequest对象名.getParameter("表单提交数据的name值"),可以获取用户提交的数据;
(2)使用HttpServletRequest对象名.getHeader("请求头中对应的标记"),可以获取请求头中的数据;
(3)使用HttpServletRequest对象名.getRequestURI(),可以获取客户端访问的URI;
(4)使用HttpServletRequest对象名.getRemoteAddr(),可以获取客户端ip;
2.tomcat是支持多线程的,每个请求tomcat都会创建一个新的线程去处理
3.请求服务器运行流程
4.Servlet的生命周期方法
(1)Servlet创建对象的时机是用户发送第一次请求时。
(2)init():在Servlet创建对象时调用
- 注意:这个init方法只会在创建Servlet对象的时候调用,而Servlet对象只会在用户发送第一次请求时创建,之后的请求都会使用第一次请求所创建的对象,也就是说,init方法之后在创建Servlet对象时调用一次,之后就不会在调用了。
- 这个方法一般用于service方法中运行需要一些提前准备的数据的初始化。
(3)destroy():在Servlet对象销毁时调用
- 这个方法一般用于在服务器停止前销毁一些数据用的
(4)HttpServletRequest的声明周期:一次会话(发起请求到响应完成,由服务器创建,由服务器销毁)。
5.避免请求提交的中文数据乱码,可以指定请求的编码格式:
(1)HttpServletRequest对象名.setCharacterEncoding("utf-8");
6.案例:
package com.web;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;/*** @Description:com.web* @version:1.0** 总结Servlet* MyServlet4:创建对象的时机是用户发送第一次请求时* init方法只会在MyServlet4创建对象时调用一次,一般用于service方法中运行需要一些提前准备的数据的初始化* destroy方法在服务器停止的时候被调用(用来在服务器停止前销毁一些数据用的)* servlet的声明周期:是用户发送第一次请求,到服务器停止之间* HttpServletRequest:的声明周期是一次会话(发起请求到响应完成,由服务器创建,由服务器销毁)*/
public class MyServlet4 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//为了避免请求提交的中文数据乱码,指定请求的编码格式req.setCharacterEncoding("utf-8");//在springmvc中会有这个设置请求编码的过程/*** HttpServletRequest:用来封装浏览器发送的请求数据的对象*///获取用户提交的数据String uname = req.getParameter("uname");System.out.println(uname);String pwd = req.getParameter("pwd");System.out.println("pwd:" + pwd);String sex = req.getParameter("sex");System.out.println("sex:" + sex);//接收数组数据String[] favors = req.getParameterValues("favor");System.out.println("favors" + Arrays.toString(favors));//获取请求头里的数据String accept = req.getHeader("Accept");String host = req.getHeader("Host");System.out.println(accept);System.out.println(host);//获取请求行中的数据String requestURI = req.getRequestURI();String remoteAddr = req.getRemoteAddr();System.out.println("uri:" + requestURI);System.out.println("客户端ip:" + remoteAddr);//通过响应对象创建了一个流对象PrintWriter p = resp.getWriter();p.write("back data");}//在MyServlet4创建对象时调用@Overridepublic void init() throws ServletException {System.out.println("init方法被调用了");}//在MyServlet4创建对象之前调用@Overridepublic void destroy() {System.out.println("destroy方法被调用了");}
}
四、Response对象
1.设置响应头:
(1)resp.setHeader("key","value")
(2)注意:这个key和value可以随便写。
2.设置响应编码格式
(1)resp.setContentType("text/html;charset=utf-8")
3.设置响应行信息
(1)设置状态码信息
- resp.sendError(500,"系统繁忙中,请稍后再访问")
4.设置响应体信息
(1)resp.getWrite().write("页面信息")
5.案例:
package com.web;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;
import java.io.PrintWriter;/*** @Description:com.web* @version:1.0*/
@WebServlet("/abc")
public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置响应的编码格式resp.setContentType("text/html;charset=utf-8");//设置响应体信息PrintWriter p = resp.getWriter();p.write("我是Servlet程序");//设置响应头信息resp.setHeader("mouse","logi");resp.setHeader("keybord","two birds fly");//设置响应行信息resp.sendError(500,"系统繁忙中,请稍后再访问...");}
}
五、Servlet的使用流程
1.设置请求编码格式;
2.设置响应编码格式;
3.获取请求信息;
4.处理请求信息;
5.响应处理结果;
六、页面跳转
1.请求转发
(1)格式:req.getRequestDispatcher("转发的页面").forward(req,resp)
(2)特点:
- 浏览器地址栏信息不改变。(浏览器不知道后台服务器的数据来自哪个Servlet,浏览器一直认为请求的是第一个servlet);
- 只有一次请求;
- 请求转发内的servlet共享此次请求的request和response对象;
- 不同的servlet可以处理不同的逻辑业务;
(3)注意:请求转发不适用于登录和转账
(4)使用请求转发携带数据
- 格式:req.setAttribute("key","value")
- 注意:将数据放入req对象中时,会将数据自动提升为Object对象。
(5)获取的携带的数据
- 格式:req.getAttribute("key")
- 注意:这个获取到数据的值后,需要强转一下才可以赋值
(6)案例:
- Servlet1中的代码
-
package com.web.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;/*** @Description:com.web.servlet* @version:1.0*/ @WebServlet("/servlet1") public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String uname = req.getParameter("uname");System.out.println("servlet1:" + uname);/*请求转发携带数据流转到servlet2中请求对象可以实现不同servlet之间的数据共享存入数据:setAttribute(key,value)取出数据:getAttribute(key)不适于转账和登录场景*/req.setAttribute("data","abc");//数据abc放入req中,会自动提升为Object对象req.getRequestDispatcher("servlet2").forward(req,resp);} }
- Servlet2中的代码
-
package com.web.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;/*** @Description:com.web.servlet* @version:1.0*/ @WebServlet("/servlet2") public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String data = (String) req.getAttribute("data");System.out.println("servlet2:" + data);resp.getWriter().println("欢迎来到了servlet2");} }
2.重定向
(1)格式:resp.sendRedirect("重定向的页面")
(2)特点:
- 地址栏发生了变化;
- 有两次请求;
- 可以避免表单重复提交;
(3)注意:重定向不能像请求转发一样携带数据流转,如果我们要在重定向时携带数据流转,就需要接下来学习新的知识Session,而Session依赖于cookie,所以我们要先学习cookie。
(4)案例:
- Servlet3中的代码
-
package com.web.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;/*** @Description:com.web.servlet* @version:1.0*/ @WebServlet("/servlet3") public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String uname = req.getParameter("uname");System.out.println("uname:" + uname);//重定向resp.sendRedirect("servlet4");} }
- Servlet4中的代码
-
package com.web.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;/*** @Description:com.web.servlet* @version:1.0*/ @WebServlet("/servlet4") public class Servlet4 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");resp.getWriter().println("来自于servlet4");} }
七、Cookie
1.cookie技术:
(1)服务端可以通过cookie技术将一些信息存储到客户的浏览器上。
(2)cookie技术其实是浏览器端的数据存储技术,解决了同一个工程下不同请求需要使用的相同的请求数据的问题。
2.特点:
(1)浏览器端的数据存储技术;
(2)适合少量数据;
(3)键值对;
(4)不安全;
(5)注意:一个cookie对象只能存储一条数据,多条数据可以创建多个cookie对象进行存储;
3.作用:cookie技术可以解决不同请求发送之间的数据共享问题。
4.修改cookie:直接覆盖就可以了。
5.cookie在默认情况下是临时存储:
(1)不设置cookie信息的存储时间,周期为一次会话,存储在浏览器的运行内存中,关闭浏览器即失效了。
(2)默认cookie存储之后,每次请求都会附带,除非设置有效路径。
6.如果想要cookie保存一段时间,可以设置cookie的有效期:
(1)格式:cookie对象名.setMaxAge(具体时间,单位为秒)
(2)使用场景:七天免登录。
7.案例:
(1)servlet1中的代码
package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建cookie对象Cookie c1 = new Cookie("a","abc");Cookie c2 = new Cookie("b","bbb");/*设置cookie的有效时间(在这个时间内关闭浏览器,重开cookie还是存在,设置了一个时间,浏览器会把cookie存在硬盘上并倒计时,时间到达之后会销毁它)*/c1.setMaxAge(600);//单位是秒(使用场景,7天免登录)//通过响应对象,把cookie响应给浏览器,保存到浏览器上(关闭浏览器)resp.addCookie(c1);resp.addCookie(c2);}
}
(2)servlet2中的代码
package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取cookieCookie[] cookies = req.getCookies();for (Cookie c: cookies) {String cname = c.getName();if(cname.equals("a")){System.out.println("servlet2: " + c.getName() + "--" + c.getValue());}else if(cname.equals("b")){System.out.println("servlet2: " + c.getName() + "--" + c.getValue());}}}
}
(3)servlet3中的代码
package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet3")
public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//修改cookieCookie c1 = new Cookie("a","aaa");resp.addCookie(c1);}
}