Servlet
Servlet 就需要使用maven创建出一个java web 的项目,也需要通过maven来下载 Servlet 依赖的jar包,还需要maven把代码打包
Servlet 其实就是Tomcat 给我们提供的一组编程接口,这个接口就将http协议的一些细节封装供我们使用。
Servlet是一种实现 动态页面 的机制,根据用户请求参数的不同,返回的结果就可能完全不同,每次响应都是根据请求实时计算出来的。
一个简单的Servlet程序
先建立一个maven项目
补充完整的目录结构
引入Servlet依赖(引进第三方库,在中央仓库进行下载)
在 main/java 目录下创建类,这个类继承自 HttpServlet 类,在Servlet类中不需要写main方法,而是需要重写一些方法。如 doGet 方法(这里的doGet方法就对应到http中的get方法)给我们创建的类加一个 WebServlet 注解,参数写一个字符串,这个参数的含义就表示当前这个类在URL的路径为 参数(写的字符串) 的时候就会被调用。如果服务器收到的请求带有 参数(写的字符串) 的时候就会触发这个类里的方法,调用哪个方法就看当前的请求是什么请求。
打包,使用maven进行打包
部署,把war包进行拷贝,拷贝到tomcat的webapp目录下
部署完成后,运行tomcat,在浏览器中输入http://localhost:8080/HelloServlet/hello 进行访问,此时浏览器就会发送一个get请求给tomcat服务器,在tomcat的运行文件窗口中就会运行doget方法里的内容
在Tomcat中,Tomcat收到请求,会分析请求的一些信息:URL中的path,path第一级是否为wabapps下的某个目录名字(也把这一级目录名字叫做 context path),URL中的第二级path是否是该webapp下的某个类的某个注解所对应的路径,如果是,就确定了一个类,再根据当前是GET请求还是其它请求,从而确定调用哪个方法。
这个项目做完就发现现在只是在服务器控制台上打印了hello world 但是我们更希望看到的是在浏览器页面上呈现出一些内容,这就需要在代码中来构造html页面返回给浏览器。
要想在浏览器中返回html页面的话,那么就需要把html放在http响应的body中
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello world!");
// Content-Type 是HTTP响应header中一个非常重要的字段
// 这个字段是用来表示body中数据的格式
resp.setContentType("text/html");
// 此处的getWriter获取到了 流对象
// 流对象是进行输入输出一类的重要对象
resp.getWriter().write("<h3>hello world!</h3>");
}
}
再次进行打包、部署,再次打开页面就发现在页面上呈现了我们想要的结果。
简单的 动态页面
描述:我们希望在http请求中,query sring 中带有两个参数 a b,doget方法可以获取到a b 并进行相加,把结果返回给浏览器界面。
在doGet方法里使用req.getParameter();
来获取参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String a = req.getParameter("a");
String b = req.getParameter("b");
int ret = Integer.parseInt(a)+Integer.parseInt(b);
resp.getWriter().write("<h3> ret = " + ret + "</h3>");
}
经过部署,启动tomcat,访问页面发现,并不能正常访问,原因是没有query sring,所以应该在访问的地址后添加?a=1&b=1
字段作为query sting。
再次进行访问发现,返回页面显示内容为 <h3> ret = 2 </h3>
并不是想象中的ret = 2
原因是没有添加body中的数据格式resp.setContentType("text/html");
Tomcat和Servlet
在java中,一般把可以承担应用服务器+servlet标准的一套软件叫做web容器。或者说,Tomcat 是一个 webapp 的容器 container ,内部实现了一个HTTP 服务器
每个webapp都有一个独立的上下文(context)对象,可以借助这个对象来共享同一个webapp中不同的Servlet类之间的数据,在 Tomcat 的语境下,通常context指的就是一个web应用
Servlet 在 java 中可以理解为一个接口,而 HttpServlet 可以理解为一个抽象类, HttpServlet 实现了 servlet 接口,
Tomcat 本身也是一个应用程序,他的核心工作就是处理HTTP请求和响应,Tomcat能够处理HTTP请求 ,全靠操作系统内核中的网络协议栈来支撑的,Tomcat自身作为一个WEBAPP的一个容器,又对上层进行一些支撑,给用户写代码提供了一些服务。
Tomcat具体提供的服务:
收到HTTP请求的时候,按照HTTP协议的格式,把这个请求解析成一个HttpServletRequest对象
Tomcat根据请求的信息,定位到某个Servlet类,以及调用到某个方法
用户自己写的代码,就会根据HttpServletRequest的内容,动态的计算,构造生成一个HttpServletRequest对象
Tomcat拿到HttpServletRequest对象之后又会把这个对象按照HTTP协议的格式构造成一个字符串 通过内核中的下层协议栈,发送给浏览器
反射(自省):一个对象自己认清自己,能够获取到自己的一些属性(站在JVM的角度来看待的属性 如:这个对象自己的名称等)
补充
doget方法的目的就是根据请求来生成响应,这就需要代码来构造出响应的内容。
常见的错误
不再支持源选项5,请使用7或者更高版本
不再支持目标选项5,请使用7或者更高版本
maven 里默认是按照java1.5来进行编译,此时就需要把pom.xml显示的指定按照1.8的方式来进行构建(就是在pom.xml添加一些配置,如下)
<properties>
<encoding>UTF-8</encoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
404
检查url是否正确;
检查对应类的注解是否正确;
web.xml 是否正确;(文件有没有/目录对不对/有无内容/内容是否正确)
出现空白页面
检查是否给resp对象设置了返回的内容
500 ( 5xx )
检查对应类的代码是否正确
但凡出现乱码,原因只有一个,编码方式不统一,要求构造的数据的编码方式和解析数据的编码方式一样才可以,如果不一样,就会出现乱码