概念
Servlet
1
| Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。 Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立 的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。
|
Servlet容器
1
| Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。
|
Tomcat
1 2 3 4 5 6 7
| Tomcat是一个免费的开放源代码的Servlet容器。 Tomcat服务器接受客户请求并做出响应的过程如下,与上图类似: 1)客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。 2)Web服务器接收到请求后,传递给Servlet容器。 3)Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。 4)Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。 5)Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。
|
tomcat目录结构
1 2 3 4 5 6
| bin,用于存放Tomcat的各种配置文件,比如,web.xml、server.xml lib,用于存放Tomcat服务器,和所有Web应用程序需要访问的JAR文件 logs,用于存放Tomcat的日志文件 temp,用于存放Tomcat运行时,产生的临时文件 webapps,Web应用程序的主要发布目录,通常将要发布的应用程序放到这个目录下 work,Tomcat的工作目录,JSP编译生成的Servlet源文件,和字节码文件放在这个目录下
|
idea tomcat部署过程
https://blog.csdn.net/qq_28513801/article/details/92838236
servlet
什么是servlet?
本质上就是一个运行在web容器(web服务器中)的java类,tomcat是web容器中的一个。
作用:
servlet与普通的java程序的区别:
1 2 3 4
| 1.本质上就是一个java类 2.所有的servlet必须实现接口:Servlet 3.运行Tomcat中,web容器中 4.对用户的请求进行处理,并且做出响应
|
编写步骤:
1 2 3
| 1.创建一个继承于HttpServlet的类(HttpServlet实现了Servlet接口) 2.重写doGet或doPost方法,分别用来处理浏览器提交的get或post请求 3.配置webapp/WEB-INF/web.xml 文件,配置Servlet 的访问地址。
|
配置Servlet
写好的Serlvet保存在src目录中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.example.myServlet;
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;
public class DemoServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter writer=resp.getWriter(); writer.println("<h1 style='color:red'>11111</h1>"); }
}
|
在WEB-INF/web.xml中配置servlet-mapping和servlet-name
访问效果
servlet生命周期
一个servlet只会在tomcat容器中实例化一次,且只会产生一个对象,常驻内存,要等到服务器关闭才会销毁。tomcat对它做了多线程处理,这样才能实现一个对象多个请求
init:
service :
destory:
继承Servlet类并重写三个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package com.example.myServlet;
import javax.servlet.*; import java.io.IOException;
public class ServletDemo implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException{ System.out.println("init"); }
@Override public ServletConfig getServletConfig(){ return null; }
@Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException{ System.out.println("service"); }
@Override public String getServletInfo() { return null; } @Override public void destroy(){ System.out.println("destroy"); }
}
|
访问页面后,可以看到执行了service方法
ServletConfig接口
在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>
标签为servlet配置一些初始化参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <servlet> <servlet-name>mytest</servlet-name> <servlet-class>com.example.myServlet.ConfigServlet</servlet-class> <init-param> <param-name>name</param-name> <param-value>admin</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123456</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>mytest</servlet-name> <url-pattern>/mytest</url-pattern> </servlet-mapping>
|
getInitParameter(“参数”) 通过参数名,得到文件中参数值
getInitParameterNames() 得到所有参数名字
tomcat在创建Servlet实例时会自动把上面的初始化参数封装对ServletConfig对象中,并在调用init方法时,把ServletConfig对象传递给servlet。通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package com.example.myServlet;
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.Enumeration;
public class ConfigServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ resp.setContentType("text/html;charset=utf-8"); PrintWriter writer=resp.getWriter(); String name=getInitParameter("name");
writer.println(name);
Enumeration initParameterNames=getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String element= (String) initParameterNames.nextElement(); String value=getInitParameter(element); writer.println("参数名:"+element+"值:"+value); } } }
|
成功获取到了配置的信息
HttpServletRequest 对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.example.myServlet;
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;
public class HttpServletRequestDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType(("text/html;charset=utf-8")); PrintWriter writer=response.getWriter();
writer.println(request.getMethod()); writer.println(request.getRequestURI()); writer.println(request.getProtocol()); writer.println(request.getQueryString()); writer.println(request.getHeader("user-agent"));
} }
|
效果
BeanUtils
BeanUtils是apache commons 组件的成员之一,用于简化javaBean封装数据的操作。也就是说可以简化获取参数的方式
先导入包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package com.example.myServlet;
import org.apache.commons.beanutils.BeanUtils;
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.lang.reflect.InvocationTargetException; import java.util.Map;
class User{ private String name; private String sex; private int age;
}
public class HttpServletRequestDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(("text/html;charset=utf-8")); PrintWriter writer = response.getWriter();
Map parameterMap = request.getParameterMap(); User user = new User(); try{ BeanUtils.populate(user,parameterMap); }catch (IllegalAccessException e){ e.printStackTrace(); }catch (InvocationTargetException e){ e.printStackTrace(); } writer.println(user); } }
|
作用域
sevlet中的请求会根据作用域的范围分为请求域、会话域、上下文域
1 2 3
| 请求域:一个用户的一次请求 会话域:一个用户的所有请求 上下文域:所有用户的所有请求
|
范围大小
作用域存值
取值
删除
转发
实现页面跳转,从一个servlet跳转到另一个servlet
1 2 3 4 5 6 7 8 9
| public class HttpServletRequestDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(("text/html;charset=utf-8")); RequestDispatcher requestDispatcher=request.getRequestDispatcher("demo"); requestDispatcher.forward(request,response); } }
|
跳转到demo
转发的特点:
1 2 3 4
| 1.地址栏不会发生变化,显示的还是上一个servlet的地址 2.一共只有一次请求:请求不断链 3.请求域中数据不会丢失:还是要满足请求不断链。 4.转发中,是一次请求的
|
重定向
1 2 3 4 5 6
| public class HttpServletRequestDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect("demo"); } }
|
效果
重定向的特点:
1 2 3 4
| 1.地址栏:有变化,显示新的地址 2.2次请求 3.请求域中的数据:断链就数据丢失了 4.重定向的根目录是:http://localhost:8080/不包含项目的访问地址
|
HttpServletResponse
设置响应的状态码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.example.myServlet;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;
public class ResponseDemo extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(200); } }
|