Servlet是Tomcat给java提供的原生的进行web开发的api.Servlet 是一种实现动态页面的技术.
静态页面就只是单纯的html,动态页面则是html + 数据.
先写个hello world
,预期写个servlet程序,部署到Tomcat上,通过浏览器访问,得到hello world字符串.(史上最难hello world)
此处要创建一个maven项目.maven是个"工程管理"工具.
如果首次使用maven,项目创建好后,会在下面出现读条,需要联网从中央仓库加载一些maven依赖.因为maven仓库在国外,网络不一定稳定,这里的读条可能会比较久.(长的可能会1个小时).如果报错失败,过两天再试试.
注意此处的目录结构:
main
放业务代码.
java
放Java代码.
resources
放程序依赖文件(配置文件,数据文件,图片,图标,声音…)
test
放测试代码.
pom.xml
是一个maven项目总的配置文件.
引入ser
3.1.0和Tomcat8是匹配的,点击3.1.0,将下代码赋值粘贴到pom.xml
下面代码有可能标红,是因为依赖还没引入成功,也有可能是网络的问题,刷新试试就可以了.
虽然maven已经帮我们自动创建了一些目录,但是还不够,此处需要maven开发一个web程序,还需要别的目录.
给web.xml
写入下代码即可
DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Applicationdisplay-name>
web-app>
但是我们发现下面有一段代码标红,其实这里不一定是错的,idea只是针对java代码能够进行比较准确的分析和判定.idea里的其他代码:包括不限于html,css,js,xml,json,sql… 如果标红,是否是错的,是不好说的.判定代码是否正确的唯一标准就是看运行结果.
在main目录下的java中创建新的类HelloServlet
让HelloServlet
继承HttpServlet
,HttpServlet
是servlet api里提供的现成的类,写servlet代码一般都是继承HttpServlet
这个类.
重写doGet方法:HttpServlet
里已经有doGet方法了,此处是希望用子类的版本代替父类的.
HttpServletRequest
这个参数表示一个HTTP请求.HttpServletResponse
这个参数表示一个HTTP响应.
我们写的doGet方法不需要我们自己手动调用,而是交给Tomcat来调用,Tomcat收到get请求,就会触发doGet方法.Tomcat会构造好两个参数,req(TCP socket中读出来的字符串,按照HTTP协议解析)和resp(空的对象),我们就需要在doGet根据请求req,结合自己的业务逻辑构造出一个resp对象.
//下面的注解把当前类和一个HTTP请求的路径关联起来
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这个只是在服务器的控制台打印
System.out.println("hello world");
//要想把hello world返回到客户端,需要使用下面的代码
//getWriter 会得到一个Writer对象
resp.getWriter().write("hello world");
}
}
把程序编译好(得到一些.clss文件),再把这些.class打成压缩包.此处打的是war包,它是Tomcat专属的用来描述webapp的程序.
借助maven点击即可:
双击package运行,如下就成功了:
打包完毕,包会生成在target目录下.
默认情况下maven打的是jar包,此处我们需要微调一下.在pom.xml
里进行修改:
然后继续打开maven打包就会出现war包.然后右键open in
继续 explore
接下来,就可以进行部署操作.
把刚才打包好的war拷贝到tomcat的webapps目录中即可.
打开浏览器输入URL(127.0.0.1:8080/hello_servlet/hello
),访问写好的这个代码.
hello_servlet
和/hello
分别在如下路径找:
第一级路径对应我们打的war包的目录名,第一级路径也叫做context path
/ application path
(这个目录就代表一个webapp网站)
访问成功的页面如下:
小结:
我们在浏览器地址栏中输入URL之后,浏览器就构造了一个对应的HTTP GET请求,发给了Tomcat,Tomcat就根据第一级路径,确定了具体的webapp,再根据第二级路径确定了具体调用哪个类,再通过GET/POST方法确定调用HelloServlet的哪个方法(doGet,doPost),此时Tomcat就执行对应的代码完成对应工作.
上述步骤是使用Servlet最朴素的步骤,当然也可以通过一些操作来简化上述过程.
打包和部署程序我们可以使用IDEA的Tomcat插件,把Tomcat集成到IDEA中,就省去手动打包,手动部署的过程,只需要按一下运行就可以自动打包部署.
插件的位置:点击File
然后Settings
点击Plugins
搜索 Smart Tomcat
插件安装即可:
安装完成后首次使用Smart Tomcat
需要配置:
新增一个运行配置,点击新增配置,双击选择Smart Tomcat
这个选项.
然后设置Tomcat所在的路径,其他的默认,最后运行就行了.
如果我们发现运行报错了,原因可能是13868号进程(Tomcat)占用了这个端口.
将Tomcat关了,13868号进程自然就没了.
如果没有出现报错就直接在网址栏输入:127.0.0.1:8080/hello_servlet/hello
访问即可.这样我们的打包和部署操作就简化了.
Smart Tomcat
工作原理不是自动把war包拷贝了,它是让Tomcat加载单个webapp运行.(让IDEA直接调用Tomcat,让Tomcat加载当前项目中的目录,这个过程其实没有打war包,也没有拷贝和解压缩的过程)
上述一套写代码方式很麻烦,后面学习了Spring,Spring Boot,Spring MVC再来实现类似的功能就方便了.
405 表示对应的 HTTP 请求方法没有实现.
本质上就是代码抛出异常了,出现500的时候日志中会明确告诉异常调用栈,告诉是哪一行代码出现的异常.
代码没写:
resp.getWriter().write();