下一篇:javaWeb——Request和Response
servlet:serve applet,即运行在服务器端的小程序,他是一个接口定义了浏览器来访问服务器(我们使用Tomcat)端java类的规则。那么在实际开发中我们只需要定义一个类来实现servlet即可。 接下来我们开始演示。
tomcat软件包如下:
链接:https://pan.baidu.com/s/1Ja9aONgEEbQeyYCwQK2fwg 提取码:aud6
安装Tomcat可以参考这篇文章:Tomcat安装版 安装教程 然后配置Tomcat,可以参见这篇文章:idea配置tomcat的方法(详细图文步骤)
接下来实现Servlet接口并实现他的所有方法。
package web.servlet; 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() { System.out.println("config"); return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service"); } @Override public String getServletInfo() { System.out.println("Info"); return null; } @Override public void destroy() { System.out.println("destroy"); } }接着配置一下Tomcat: tomcat端口号默认时8080,如果改为80则表示在使用http协议访问时不需要去显式的写端口号。然后我们需要在web.xml文件里面配置映射。
<servlet> <!--servlet-name可以随便写,但是要与下面的servlet-name一致--> <servlet-name>demo</servlet-name> <!--要写全类名--> <servlet-class>web.servlet.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo</servlet-name> <!--映射配置主要是为了简化,当然也必须简化,具体的作用看下面就明白了--> <url-pattern>/demo</url-pattern> </servlet-mapping>现在我们把服务器打开 在浏览器地址栏输入:
http://localhost:8080/demo 因为上面web.servlet.ServletDemo映射为了/demo,最后访问时相当于在 http://localhost:8080补上/demo就是访问了ServletDemo类 上面的结果我们看到出现了init,在访问时Tomcat会创建ServletDemo对象(但是只会创建一次,因为servlet是单例的,这一过程通过反射实现),此时会执行init方法,接着再去执行service方法,之后在访问就不会执行init方法了,而是直接执行service方法,当关闭服务器时就会执行destroy方法,但也只执行一次。
那么这一过程是如何实现的呢? 首先浏览器会去解析http://localhost:8080/demo,读取到http://localhost:8080,于是就找到了服务器的运行端口,接下来就去在web.xml文件里面去寻找/demo于是定位到了web.servlet.ServletDemo,接下来就是上面的ServletDemo对象的创建以及方法的调用了。
1.创建对象 默认情况下,servlet是在第一次被访问是创建,但是我在这里教给大家如何去修改。 在<servlet>标签下面有一个标签: 在这个标签里面写数字,可以指定Servlet被创建的时机。
①为负整数数代表第一次访问时创建 ②0或正整数表示在服务器启动时被创建 但是Servlet只会被创建一次,那么如果有多个线程来访问怎么办?那么这时不要再Servlet里面定义成员变量就可以避免线程安全的问题。
2.Service方法的执行 每次被访问都会执行一次 3.destroy 服务器关闭(要正常关闭),先执行destroy再销毁servlet,即他在Servlet销毁前夕执行。
这一方式在Servlet3.0以后才被支持。 前面我们的映射配置都是在xml里面配置的。现在使用注解来配置。 我们需要把之前的web.xml的添加内容删除掉,否则会报错。 上面第一种方式是省略的写法(因为@WebServlet有一个方法value,当只有一个方法需要赋值时且是value可以省略方法名,而在这里value相当于取代了url-Patterns)。 接着再去访问: 下面再补充一下我们如果想访问我们的WEB-INF下的资源,是不可以的,需要我们认为用代码去实现,那么不想添麻烦就直接写在非src目录下的web目录下面,比方那个Index.jsp就是如此。
GenericServlet 讲Servlet的方法都做了空实现,但我们开发不会用这个,而是HttpServlet,也就是说今后我们不要再去实现Servet了,就直接继承HttpServlet即可,我们在提交表单的时候一般有两种方式Get,Post(也有其他的,不常用),那么HttpServlet有两种方法可以帮助我们去区分方式来执行相应的方法。 关于HttpServlet使用方法如下:
定义类继承HttpServlet复写doGet/doPost方法1.并列多名 表示下面三个路径都可以成功访问:
http://localhost:8080/a http://localhost:8080/b http://localhost:8080/c
2./XX型 前面的演示已经体现过了。 3./XX/XX型 表示下面路径可以成功访问:
http://localhost:8080/user/a
表示下面路径可以成功访问:
http://localhost:8080/user/hkaksnak 即user后面随便写 表示下面路径可以成功访问: http://localhost:8080/hkaksnak 即8080后面随便写
4.*.XX型 表示下面路径可以成功访问:
http://localhost:8080/sajsja.do 即.do前面随便写 当然@WebServlet那里不一定是写do随便写什么都可以
最后需要强调一点就是如果你现在有两个Servlet
ServletDemo1 ServletDemo2
如果他们的映射路径一样比方都是demo可以吗,在启动服务器时会报错,那如果一个/*一个/demo呢?
http://localhost:8080/demo回访问/demo的那个而不是/*的那个(虽然也匹配了),这是优先级决定的。
概念:Hyper Text Transfer Protocol 超文本传输协议 * 传输协议:定义了,客户端和服务器端通信时,发送数据的格式 * 特点: 1. 基于TCP/IP的高级协议 2. 默认端口号:80 3. 基于请求/响应模型的:一次请求对应一次响应 4. 无状态的:每次请求之间相互独立,不能交互数据
有关历史版本:
1.0:每一次请求响应都会建立新的连接1.1:复用连接右下方那里便是请求消息与响应消息,这里我们先讲请求消息。 1.请求行: 2.请求头: 3.请求空行与请求体 这个是针对Post请求而言的。请求体就是指在提交表单后里面的数据对,比方有个输入框<input>,其name属性为username,而你填写的是jack,那么请求体就有username:jack,那么请求空行就是一个空行用来隔开请求头与请求体。
最后我们来比较一下post与get以及需要记住的请求头。
Get 1. 请求参数在请求行中,在url后。 2. 请求的url长度有限制的 3. 不太安全 POST: 4. 请求参数在请求体中 5. 请求的url长度没有限制的 6. 相对安全 这里的请求参数就是上面说的username:jack这样的数据 * 常见的请求头: 1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息 * 可以在服务器端获取该头的信息,解决浏览器的兼容性问题 2. Referer:http://localhost:8080/index.jsp * 告诉服务器,我(当前请求)从哪里来?1.响应行 协议/版本 响应状态码 状态码描述 响应状态码可以告知这一次请求与响应的状态。
1xx:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码 2xx:成功。代表:200 3xx:重定向。代表:302(重定向),304(访问缓存) 4xx:客户端错误。 * 代表: * 404(请求路径没有对应的资源) * 405:请求方式没有对应的doXxx方法 5xx:服务器端错误。代表:500(服务器内部出现异常)2.响应头
1. 格式:头名称: 值 2. 常见的响应头: Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式 Content-disposition:服务器告诉客户端以什么格式打开响应体数据 值: in-line:默认值,在当前页面内打开 attachment;filename=xxx:以附件形式打开响应体。文件下载3.响应空行 4.响应体 就是用于传输数据的(比如可以返回一个页面) 下一篇:javaWeb——Request和Response