1、第一个servlet应用
导入jar包
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>
创建一个类
注意: 创建的包名:不能以java开头, package com.zy.servlet; package java.com.zy.servlet(会报错的)
package com.zy.servlet; 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 ServletDemo extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("<h1>haha</h1>"); } }
补充
如果重写的是service方法,那么所有的请求都当成get请求来执行下面的代码,如果需要判断get、post方法,通过req.getMethod()
public class ServletDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("<h1>hahaha</h1>"); } }
配置web.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"> <!--配置servlet--> <servlet> <!--配置servlet类路径,servlet-name任意,servlet-class是一开始创建的servlet类的路径--> <servlet-name>ServletDemo</servlet-name> <servlet-class>com.zy.servlet.ServletDemo</servlet-class> </servlet> <!--servlet-name必须和上面的名字一样,url-pattern配置访问的路由 localhost:8080/my--> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/my</url-pattern> </servlet-mapping> </web-app>
在idea配置tomcat,启动,浏览器访问:localhost:8080/my
补充
web3.0可以使用注解的方式替换上面web.xml配置,如下
@WebServlet("/haha") //注意格式:/url ,url前必须要有"/" public class ServletDemo implements Servlet {} //注意这个Servlet是一个接口,HttpServlet也是继承这个接口的
tomcat中启动
在tomcat的webapps目录中创建一个project目录,将下面的文件放进去
进入tomcat的bin目录,双击startup.bat,浏览器访问 localhost:8080/project/my
总结
每一个请求,都需要配置一个servlet,非常麻烦,spring MVC,就是用一个servlet(DispatchServlet),通过这个servlet来讲请求发送给各个handler
Servlet使用
仿照HttpServlet写的接口
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ResourceBundle; public class ServletDemo implements Servlet { private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings"); @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("servlet begin"); } @Override public ServletConfig getServletConfig() { return null; } public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest)req; response = (HttpServletResponse)res; } catch (ClassCastException var6) { throw new ServletException(lStrings.getString("http.non_http")); } System.out.println(request.getMethod()); response.getWriter().write(request.getMethod()); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("servlet end"); } }
请求转发学习
注意:无论项目是否有根路径(不是ROOT目录),转发的地址都是"/"
请求转发学习: 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。 使用: req.getRequestDispatcher(“要转发的地址").forward(req,resp);地址:相对路径,直接书写servlet的别名即可。 特点: 一次请求,浏览器地址栏信息不改变。 注意: 请求转发后直接return结束即可。 网址栏上url不变
请求重定向
注意:如果项目有根路径(不是ROOT目录),转发的地址都是"/项目更目录/"
使用: resp.sendRedirect("/1ogin/main"); 特点 两次请求,两个request对象。 浏览器地址栏信息改变 时机: 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
servlet对象
request对象
1、获取
(1)服务器在调用对应的servlet接口,肯定会把request传递进去,我们可以直接获取到
public class ServletDemo extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("<h1>hahaha</h1>"); } }
(2)通过工具类获取
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
2、使用
#获取请求头数据 #获取请求方式 String method=req.getMethod(); #获取请求URL StringBuffer url=req.getRequestURL(); String uri=req.getRequestURI(); #获取协议 String h=req.getscheme(); #获取请求行数据 //获取指定的请求行信息 String value=req.getHeader("User-Agent"); #获取所有的请求行的键的枚举 Enumeration e=req.getHeaderNames(); while(e. hasMoreElements()){ string name=(String)e. nextElement()); #获取参数 String name=req.getParameter("uname), #注意getparameter不能获取同键不同值的多个数据(像复选框之类的); String[] likes=req.getParameterValues("like"); #可以获取多个值了
Response对象
//设置响应头 resp.setHeader(String name,String value);//在响应头中添加多个响应信息,但是同键会覆盖 resp.addHeader(String name,String value);//在响应头中添加多个响应信息,但是不会覆盖。 //设置响应状态码 resp. sendError(405,"this Method is not supported"); //设置响应实体(在页面上展示的) resp.getWriter().write("this is resp study"); //设置响应编码格式,解决乱码 resp.setHeader("content-type","text/html;charset=utf-8"); resp.setContentType("text/html;charset=utf-8");//简写,text/html,会将<b></b>等html标签解析 resp.setContentType("text/plain;charset=utf-8"); //会把<b></b>等标签当做普通的文本显示在浏览器上 resp.setContentType("text/xml;charset=utf-8"); //会把响应的数据以xml的格式显示在浏览器上
ServletContext对象
- 需求:不同的用户需要使用同一个对象
- 特点:服务器创建,用户共享
- 生命周期:服务器启动到服务器关闭
- 作用域:整个项目内
getParameter()是获取POST/GET传递的参数值; getInitParameter获取Tomcat的server.xml中设置Context的初始化参数 getAttribute()是获取对象容器中的数据值; getRequestDispatcher是请求转发。
1、介绍
获取方式: //第一种方式(常用) ServletContext sc=this.getservletContext(); //第二种方式 ServletContext sc2=this.getServletConfig().getServletContext(); //第三种方式(常用) ServletContext sc3=req.getSession().getServletContext(); 数据存储 sc.setAttribute(String name,Object value); 数据获取 sc.getAttribute("str")返回的是0bject类型
2、使用
获取项目中web.xml文件中的全局配置数据
作用:使静态数据和代码进行解耦
(1)在web.xml 配置全局数据
<!--配置全局数据--> <context-param> #注意一个context-param只能配置一个键值对 <param-name>name</param-name> <param-value>zhangsan</param-value> </context-param>
(2)获取
#获取项目中web.xm1文件中的全局配置数据 sc.getInitParameter(String name);根据键的名字返回web.xml中配置的全局数据的值,返回String类型。如果数据不存在返回nul1。 sc.getInitParameterNames();返回键名的枚举
(3)获取资源的绝对路径和资源的流对象
#获取项目webroot下的资源的绝对路径。 String path=sc.getRealPath(String path);获取的路径为项目根目录,path参数为项目根目录中的路径 #获取webroot下的资源的流对象 InputStream is=sc.getResourceAsStream(String path); 注意: 此种方式只能获取项目根目录下的资源流对象,c1ass文件的流对象需要使用类加载器获取。 path参数为项目根目录中的路径 webroot:在tomcat服务器上,就相当于webapps的绝对路径
ServletConfig对象
- 作用:专门给servlet自己做配置的对象,别的servlet获取不到该数据。
- 操作:在web.xml配置
1、配置
<servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>com.zy.servlet.ServletDemo</servlet-class> <init-param> //注意只能在自己的servlet中配置数据 <param-name>name</param-name> <param-value>zhangsan</param-value> </init-param> </servlet>
2、获取
//获取ServletConfig对象 ServletConfig sc=this.getServletConfig(); //获取web.xm1中的配置数据 String name=sc.getInitParameter("name"); System.out.print1n(name);
web.xml解析
区别:
Web项目下的web.xml文件为局部配置,针对本项目的位置。
Tomcat下的web.xml文件为全局配置,配置公共信息。
内容(核心组件):
全局上下文配置(全局配置参数)
Servlet配置
过滤器配置
监听器配置
加载顺序:
Web容器会按ServletContext->context-param->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。
加载时机:
服务器启动时。
server.xml解析
核心组件
<Server> <Service> //一个server下可以配置多个service,可以在配置端口,就可以通过不同的端口访问 <Connector/> //配置端口,可以配置多个 <Connector/> <Engine> //引擎,只能配置一个 <Host> //配置项目的存放位置的根目录 <Context/> </Host> </Engine> </Service> </Server>
热部署
在Host中配置,如果将项目删除了,记得tomcat的server.xml要将这段代码删除掉,否则会报错,但是tomcat其他的项目还是正常的启动。
<Context path ="/Pet" reloadable ="true" docBase="F:/PetWeb"/>
解释:/Pet :虚拟路径,请求的时候需要带上
/F:/PetWeb :热部署的项目;
servlet过滤器
<filter> <filter-name>LogFilter</filter-name> <filter-class>com.runoob.test.LogFilter</filter-class> <init-param> <param-name>Site</param-name> <param-value>菜鸟教程</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
补充:Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。
注意doFilter既可以拦截请求,可以拦截响应(是典型的责任链模式)
chain.doFilter(request,response); Systen.out.println("--MyFilter过滤器执行之后");
参考:https://www.runoob.com/jsp/jsp-writing-filters.html
https://my.oschina.net/u/1171518/blog/265467
Servlet监听器
监听器Listener就是在application,session,request三个对象创建,销毁,或者往其中添加修改删除属性时自动执行代码的功能组件。Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。
创建几个java类实现监听接口
package com.zy.listener; import javax.servlet.*; import javax.servlet.http.*; public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener , HttpSessionListener , HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{ //对request对象 @Override public void requestDestroyed(ServletRequestEvent sre) { //如果某些数据有用,在销毁的前,将他存放到ServletContext中 Object xx = sre.getServletRequest().getAttribute("xx"); sre.getServletContext().setAttribute("xx",xx); System.out.println("request对象被销毁"); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("request对象初始化"); } //对request属性监听 @Override public void attributeAdded(ServletRequestAttributeEvent srae) { String name = srae.getName(); Object value = srae.getValue(); } @Override public void attributeRemoved(ServletRequestAttributeEvent srae) { } @Override public void attributeReplaced(ServletRequestAttributeEvent srae) { } //对session对象监听 @Override public void sessionCreated(HttpSessionEvent se) { } @Override public void sessionDestroyed(HttpSessionEvent se) { } //对session属性的监听 @Override public void attributeAdded(HttpSessionBindingEvent se) { } @Override public void attributeRemoved(HttpSessionBindingEvent se) { } @Override public void attributeReplaced(HttpSessionBindingEvent se) { } //对servletcontext对象监听 @Override public void contextInitialized(ServletContextEvent sce) { } @Override public void contextDestroyed(ServletContextEvent sce) { } //对servletcontext属性的监听 @Override public void attributeAdded(ServletContextAttributeEvent scae) { } @Override public void attributeRemoved(ServletContextAttributeEvent scae) { } @Override public void attributeReplaced(ServletContextAttributeEvent scae) { } }
web.xml配置
Listener的配置信息必须在Filter和Servlet的配置之前,Listener的初始化(ServletContextListener初始化)比Servlet和Filetr都优先,而销毁比Servlet和Filter都慢。
<listener> <listener-class>com.zy.listener.RequestListener</listener-class> </listener>
需求,Tomcat启动的时候,加载配置文件
1、方式1:使用servlet--->init方法---><load-on-startup>
2、方式2:使用filter--->init方法--->web.xml注册过滤器之后自动调用初始化
3、方式3:使用监听器,ContextLoaderLister(spring推荐使用)
使用方式3:
需要额外导入jar包,spring-web
参考我的另一篇博客:https://i.cnblogs.com/EditPosts.aspx?postid=10827203&update=1