servlet
它是运行在web服务器端的一个java小程序
Servlet它是一个资源,用来被用户访问的资源,同时也是一个动态资源
Servlet的作用:它是基于Http协议,主要用来接收客户端发送的请求,处理请求,报数据响应给客户端
实现servlet程序
1 .实现servlet接口
2. 实现service方法( service方法专门处理请求并响应数据 )只要有请求就会用到这个方法
3.到web.xml 中去配置servlet程序的访问地址
public class Servlet extends HttpServlet {@Override//只要有请求就会用到这个方法public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {super.service(req, res);System.out.println("services methods...");}}<!--给servlet标签配置servlet程序--><servlet><!--给servlet程序起一个别名(一般是类名)--><servlet-name>hello</servlet-name><!--servlet程序的全类名地址 类包下的路径--><servlet-class>TestServlet.helloservlet</servlet-class></servlet><!--给servlet程序的配置访问地址--><servlet-mapping><!--告诉服务器当前配置的地址是给哪个servlet程序使用(一般和别名一致)--><servlet-name>hello</servlet-name><!--配置访问地址/ 斜杠在服务器解析的时候 表示为:http://ip:port/工程路径/hello 表示地址为:http://ip:port/工程路径/hello 即资源路径--><url-pattern>/hello</url-pattern></servlet-mapping>注:相当于注解 @WebServlet("/hello")

servlet的生命周期
执行servlet构造器方法,执行init初始化方法,执行service方法,执行destory方法
Servlet的接口和实现类:
servlet是一个接口
Genericservlet 它是一个类,实现了servlet接口
Httpservlet 它是一个类,继承Genericservlet
请求分发处理
@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(" service被访问了");// 类型转换(因为它有getMethod()方法)HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;// 获取请求的方式String method = httpServletRequest.getMethod();if ("GET".equals(method)) {doGet();} else if ("POST".equals(method)) {doPost();}}
一般开发中,创建servlet,通常去继承httpservlet
1 重写doGET或doPOST方法
2 到web.xml中的配置servlet程序访问地址
注:httpservlet中的service方法已经封装好了请求分发处理 只需要调用方法就行了
ServletConfig类
servlet程序的配置信息类。用于做初始化
作用:
1 可以获取servlet 程序的别名 servlet-name 的值
2 可以获取初始化参数 init-param
3 获取 servletContext 对象
servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig对象。
//web.xml 配置文件<servlet><servlet-name>helloServlet</servlet-name><servlet-class>servletTest.Servlet</servlet-class><init-param><param-name>username</param-name><param-value>H</param-value></init-param><init-param><param-name>root</param-name><param-value>abc123</param-value></init-param></servlet>//用于做初始化使用public class Servlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {//获取别名System.out.println(config.getServletName());//获取初始化参数System.out.println(config.getInitParameter("username"));System.out.println(config.getInitParameter("root"));//获取servletContext对象System.out.println(config.getServletContext());}}
ServletContext类
ServletContext是一个接口,表示servlet上下文对象。
一个web工程,只有一个ServletContext对象实例。
ServletContext对象是一个域对象。
ServletContext是在web工程部署启动的时候创建,工程停止时销毁
作用:
1 获取web.xml 中配置的上下文参数 context-param
2 获取当前的工程路径
3 获取工程部署后在服务器硬盘上的绝对路径
4 像Map一样存取数据
域对象
可以像Map一样存取数据的对象。域指的是存取数据的操作范围
方法 setAttribute,getAttribute,removeAttribute
//web.xml配置文件//context-param 是上下文参数(它属于整个web工程)<context-param><param-name>user</param-name><param-value>H</param-value></context-param>//ServletContext作用:@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 获取web.xml 中配置的上下文参数 context-paramServletContext context=getServletContext();System.out.println(context); //一个web工程,只有一个ServletContext对象实例System.out.println(context.getInitParameter("user"));//2 获取当前的工程路径System.out.println("工程路径 "+context.getContextPath());//3 获取工程部署后在服务器硬盘上的绝对路径// "/"斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录System.out.println("绝对路径 "+context.getRealPath("/"));System.out.println("工程下文件的绝对路径 "+context.getRealPath("/a.html"));//4 像Map一样存取数据context.setAttribute("key1","value1");context.setAttribute("key2","value2");context.setAttribute("key3","value3");System.out.println(context.getAttribute("key1"));System.out.println(context.getAttribute("key2"));System.out.println(context.getAttribute("key3"));}
HttpServletRequest类
每次有请求进入Tomcat服务器,服务器就会把请求过来的HTTP协议信息解析封装好到Reuqest对象中。然后传递到Service方法中供我们使用。通过HttpServletRequest对象,获取到所有请求的信息
**
//常用方法public class RequestServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {request.setCharacterEncoding("utf-8"); //解决post请求获取参数时的乱码问题//获取资源路径System.out.println("url--"+req.getRequestURI());//获取绝对路径System.out.println("url--"+req.getRequestURL());//获取客户端ip地址System.out.println("ip--"+req.getRemoteHost());//获取请求头System.out.println("user_agent--"+req.getHeader("user-agent"));//获取请求方式System.out.println("请求方式"+req.getMethod());//获取请求参数String username = req.getParameter("username");System.out.println("用户名"+username);String pwd = req.getParameter("pwd");System.out.println("密码"+pwd);String[] hob=req.getParameterValues("hob");System.out.println("爱好"+Arrays.asList(hob));}}
请求转发
服务器收到请求后,从一次资源跳转到另一个资源的操作
特点:
浏览器地址无变化;
它们是一次请求;它们共享Request域中的数据;
可以转发到WEB-INF目录下;不能访问工程外的资源
public class servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");System.out.println("在s1中查看参数"+username);//加一个值作为标识req.setAttribute("key1","s1");//转发的地点 以 / 开头 映射到web目录RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");//转发requestDispatcher.forward(req,resp);}}public class servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");System.out.println("在s2中查看参数"+username);//查看标识Object key1 = req.getAttribute("key1");System.out.println("s1是否有标识"+key1);//处理自己业务System.out.println("处理自己业务");}}
base标签
可以设置当前页面中所有相对路径工作时,参照哪个路径进行跳转。
<head><base href="src..."></head>
web中 / 的不同意义
在web中 / 是一种绝对路径
/ 被浏览器解析,得到的地址是 http://ip:port
/ 被服务器解析,得到的地址是http://ip:port/工程路径
HttpServletResponse类
每次有请求进入Tomcat服务器,服务器就会创建一个Response对象传递给servlet程序去使用。HttpServletResponse 表示所有响应的信息
public class helloservlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置服务器字符集resp.setCharacterEncoding("utf-8");//同时设置服务器和客户端都使用utf-8字符集 要在获取流对象之前才有效 法一//resp.setContentType("text/html; charset=utf-8");//通过响应头 设置浏览器也使用UTF-8字符集 解决响应乱码问题 法二resp.setHeader("content-type","text/html;charset=utf-8");//往客户端回传数据PrintWriter writer = resp.getWriter();writer.write("不是语句");}}
请求重定向
客户端给服务端发送请求,提供一个新的地址去访问。
特点:
浏览器地址栏变化;
发起了两次请求;不共享Request域中的数据;
不能访问WEB-INF下的资源;可以访问工程外的资源
//法一public class servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("s1到此一游");//设置响应码 表示重定向resp.setStatus(302);//设置响应头 说明新的地址resp.setHeader("location","http://localhost:8080/Tservlet/servlet2");//resp.setHeader("location","https://www.baidu.com/"); 重定向到工程外的资源}}public class servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("r2");}}//法2 推荐使用public class servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("s1到此一游");resp.sendRedirect("https://www.baidu.com/");}}
