目录


网站请求与响应的过程:首先浏览器发送请求(HTTP协议)到服务端,请求相关的资源,资源分为动态资源(Servlet)和静态资源(三剑客),动态资源就是java代码,这些java代码遵循一定的书写规范称为Servlet、jsp等相关规范,这些java代码可以负责逻辑的处理,并且对数据库进行访问操作,获取对应的数据给到对应的静态页面,页面再进行一些css样式处理,最后将这个页面返回给浏览器,称为响应。







不建议直接使用x关闭服务器,相当于拔电源,使用Ctrl+C





使用插件 在IDEA中快速使用tomcat,如果设置了插件的configuration,需要通过maven中的run方法运行,直接点击运行按钮不会按照插件设置的端口和访问路径运行,只能支持到tomcat7



- <properties>
- <maven.compiler.source>8maven.compiler.source>
- <maven.compiler.target>8maven.compiler.target>
- properties>
-
-
-
-
- <dependencies>
- <dependency>
- <groupId>javax.servletgroupId>
- <artifactId>javax.servlet-apiartifactId>
- <version>3.1.0version>
-
-
- <scope>providedscope>
- dependency>
- dependencies>
- @WebServlet("/demo")
- public class ServletDemo1 implements Servlet {
- public void init(ServletConfig servletConfig) throws ServletException {
-
- }
-
- public ServletConfig getServletConfig() {
- return null;
- }
-
- //service会自动执行,输出结果到控制台
- public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
- System.out.println("hello world servlet");
- }
-
- public String getServletInfo() {
- return null;
- }
-
- public void destroy() {
-
- }
- }

浏览器中输入的url分为了三部分:通过第一部分的路径能够访问到Tomcat服务器,通过第二部分能够访问到这个Web项目,通过第三部分能够访问到项目中的servlet,自动执行service()方法,而要执行这个service()方法必须创建Servlet对象,通过web服务器tomcat创建


- @WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
- public class ServletDemo1 implements Servlet {
- /**
- * 初始化方法
- * 1、调用时机:默认情况下,Servlet被第一次访问时调用
- *配置参数loadOnStartup:默认为-1,默认情况下的调用时机
- *配置为0或正整数时,会在服务器启动时就初始化Servlet,而不是第一次访问时
- * 2、调用次数:1次
- */
- public void init(ServletConfig servletConfig) throws ServletException {
- System.out.println("init");
- }
-
- /**
- * 提供服务的方法
- * 1、调用时机:每一次Servlet被访问时调用
- * 2、调用次数:多次,每访问一次就调用一次
- */
- public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
- //service会自动执行,输出结果到控制台
- System.out.println("hello world servlet");
- }
-
- /**
- * 销毁方法
- * 1、调用时机:Servlet被销毁时(内存释放或者服务器关闭的时候)
- * 2、调用次数:1次
- */
- public void destroy() {
- System.out.println("destory");
- }
-
- /**
- * 返回一些作者、版本、版权等信息,一般返回空字符串
- * @return
- */
- public String getServletInfo() {
- return null;
- }
-
- /**
- * 获取Servlet配置对象
- * @return
- */
- public ServletConfig getServletConfig() {
- return null;
- }
-
- }

由于每次都是实现Servlet接口并重写五个方法,步骤过于繁琐,所以引入了Servlet实现类,使用HTTP协议封装Servlet,使得只需要继承HttpServlet实现类就能实现Servlet接口,重写HttpServlet的doGet()方法和doPost()方法即可。
HttpServlet 为什么要根据请求的方式不同,调用不同的方法?
由于get和post请求的请求方式不一样,所以需要分别处理
不同的方法如何调用?
先获取请求方式,然后采用不同的逻辑判断,是get请求就使用get方法,是post请求就使用post方法。




- @WebServlet("/demo3")
- public class ServletDemo3 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //1、使用request对象 获取请求数据
- String name = request.getParameter("name"); //url?name=zhangsan
-
- //2、使用response对象 设置响应数据
- response.setHeader("content-type","text/html;charset=UTF-8");
- response.getWriter().write("
"
+name+",欢迎您!"); - }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- }
- }


- @WebServlet("/req1")
- public class ServletDemo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //request获取请求行 GET/servlet1/req1?username=zhangsan HTTP/1.1
- //1、获取请求方式 GET
- String method = req.getMethod();
- System.out.println(method);
-
- //2、获取虚拟目录(项目访问路径,项目名) /servlet1
- String contextPath = req.getContextPath();
- System.out.println(contextPath);
-
- //3、获取请求的URL(统一资源定位符) http://localhost:8080/servlet1/req1
- StringBuffer requestURL = req.getRequestURL();
- System.out.println(requestURL.toString());
-
- //4、获取请求的URI(统一资源标识符) /servlet1/req1
- String requestURI = req.getRequestURI();
- System.out.println(requestURI);
-
- //5、获取请求参数(GET方式) username=zhangsan
- String queryString = req.getQueryString();
- System.out.println(queryString);
-
-
- }
- }

使用通用的方式获取GET和POST请求参数,而不用对GET和POST使用不同的方法分别获取请求参数。

- @WebServlet("/req2")
- public class ServletDemo2 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //使用通用方式获取GET 和 POST 请求数据
- System.out.println("get....");
- //1、获取所有参数的map集合
- Map
maps = req.getParameterMap(); - //2、对map集合的键进行遍历
- for (String key : maps.keySet()) {
- System.out.print(key + ":");
-
- //3、获取到的键对应的可能是一个数组,遍历这个值数组
- String[] values = maps.get(key);
- for (String value : values) {
- System.out.print(value + " ");
- }
- System.out.println();
- }
- System.out.println("----------------------");
-
- //4、根据key获取参数值(获取数组)
- String[] hobbys = req.getParameterValues("hobby");
- for (String hobby : hobbys) {
- System.out.println(hobby);
- }
-
- //5、根据key获取单个值
- String username = req.getParameter("username");
- System.out.println(username);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //直接调用GET请求的方法,避免代码重复
- this.doGet(req,resp);
- }
- }

- @WebServlet("/req3")
- public class ServletDemo3 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //处理post方式中文字符乱码问题
- req.setCharacterEncoding("UTF-8");
- //获取单个值
- String username = req.getParameter("username");
- System.out.println(username);
-
-
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- this.doGet(req, resp);
- }
- }

-
- @WebServlet("/req4")
- public class ServletDemo4 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("req4...");
- //存储共享数据
- req.setAttribute("msg","hello");
- req.getRequestDispatcher("/req5").forward(req,resp);
- }
-
- @WebServlet("/req5")
- public class ServletDemo5 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("req5...");
- //获取共享数据
- Object msg = req.getAttribute("msg");
- System.out.println(msg);
-
- }

浏览器向资源A请求数据时,资源A无法处理,向浏览器返回状态码302,并告诉浏览器去请求资源B,提供资源B的地址。
- @WebServlet("/resp1")
- public class ResponseDemo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("resp1.....");
- resp.sendRedirect("resp2");
- }
- }
-
-
- @WebServlet("/resp2")
- public class ResponseDemo2 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("resp2.....");
- }
- }


- @WebServlet("/resp3")
- public class ResponseDemo3 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //设置响应头及编码
- resp.setContentType("text/html;charset=utf-8");
- //获取字符输出流
- PrintWriter writer = resp.getWriter();
- writer.write("你好");
- writer.write("
你好
"); - }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- }
- }

- @WebServlet("/resp4")
- public class ResponseDemo4 extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //1、获取文件输入流
- FileInputStream fs = new FileInputStream("\\C:\\Users\\misGood\\Desktop\\图片\\1.jpg");
-
- //2、获取字符输出流管道
- ServletOutputStream os = resp.getOutputStream();
-
- //3、复制文件对象到输出流管道
- IOUtils.copy(fs,os);
-
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
- }
- }