2018.5.02
web应用目录结构
|--webroot web项目/应用的根目录(这个名字没有中文)
|- 静态资源 (HTML css javascript img veido audio)
|- WEB-INF: [固定写法]
|-classes:存放二进制字节码文件的目录 放入.class文件【固定写法,可选】
|-lib:存放当前 WEB项目运行需要的JAR包【固定写法,可选】
|-web.xml 非常重要【现在非常重要】
注意事项:
1.WEB-INF目录下的内容不能通过浏览器目录方式访问。
2.如果需要访问WEB-INF里面的资源内容,需要配置web.xml
1.Servlt入门
暂时不要研究源代码 手动创建一个servlet
1.1什么是Servlet?
前提 静态资源和动态资源的区别(源代码有无变化)
静态资源:
用户在多次访问的情况下,但是每一次页面的源代码没有发生任何的改变。
动态资源:
用户在每一次访问申请到的页面源代码都是不一样的
Servlt是java语言实现动态资源的开发技术
要求:
1.Servlet程序只能在Tomcat服务器上运行。【记住】
2.Servlet其实是一个非常普通的类,只不过集成了HttpServlet,覆盖了doGet和doPost方法。
1.2 手动书写一个Servlet程序
1.定义一个类,要求继承HttpServlet
HttpServlet并不存在当前使用的JDK1.8中,Servlet程序要交给Tomcat运行的,所以
Tomcat是支持HttpServlet,那么在 Tomcat下必须有HttpServlet当前整个代码
在Tomcat安装路径/lib/servlet-api.jar
把servlet-api.jar 复制到当前的项目目录下,添加到工作路径中add path
2.书写Servlet程序
HttpServletRequest servlet请求
HttpServletResponse servlet响应
使用响应给浏览器发送数据
设置响应在浏览器上展示的方式和编码集 使用HTML展示,字符集为utf-8
resp.setContentType("text/html;charset=utf-8");
PrintWrite resp.getWriter(); 专门用来给浏览器写入数据的对象。 基于IO流的
3.执行Servlet程序
这里servlet程序不能再交给Eclipse执行了,而是要在Tomcat服务器上执行Servlet程序
在Tomcat服务器软件根目录下webApps中创建一个web项目文件夹,要按照Web项目要求创建。
找到当前Servelet程序的class文件,要把这个文件放入到class文件中
【注意】
要求放入的class文件要带有完整的包名
在WEB-INF文件
|--day39
|- WEB-INF: [固定写法]
|-classes: 存放二进制字节码文件的目录 放入.class文件【固定写法,可选】
|-web.xml 按照Servlet程序的规范书写XML文件
4.web.xml文件中的内容
<?xml version = "1.0" encoding = "utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet>
<!-- servlet的内部名称 这个名字可以自定义-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的class文件,这里要求是完整的类名 包名.类名-->
<servlet-class>包名+类名</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的名字 要求和上面的名字一模一样-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet的访问名称:http://localhost:8080/mywebs/访问名-->
<url-pattern>/hello</url-pattern>//专门用来匹配浏览器中输入的内容
</servlet-mapping>
</web-app>
servlet映射路径
Tomcat服务器启动之后
http://localhost:8080/day40/TestHttp
web.xml的配置文件
<servlet>
<!-- 自定义的名字-->
<servlet-name>TestHttp</servlet-name>
<!-- Servlet程序的完整的包名.类名-->
<servlet-class>com.bitware.http.TestHttp</servlet-class>
</servlet>
<servlet-mapping>
<!--要求和上面name一致-->
<servlet-name>TestHttp</servlet-name>
<!--映射路径-->
<url-pattern>/TestHttp</url-pattern>
</servlet-mapping>
浏览器访问服务器的URL分析
1.浏览器根据输入的URL来访问Tomcat服务器 http://localhost:8080
2./day40 访问在Tomcat服务器下webapps里面的day40项目文件夹
3./TestHttp 用来匹配在[WEB-INF]下的web.xml文件里面的url-pattern
/TestHttp称之为 映射路径
映射的流程:
1.在[WEB-INF]下的web.xml文件中匹配url-pattern
2.匹配到就可以获取<servlet-mapping>,可以找到<servlet-name>标签内容,获取servlet-name
3.通过匹配<servlet-name>找到<servlet>,也就可以获取到<servlet-class>标签内容
在这个标签中宝包含了servlet程序运行需要执行的.class文件
4.通过这个包名.类名就可以加载这个.class(字节码文件),运行servlet程序,这里
用到的就是[反射]的思想。
url-patter 匹配形式:
精确匹配:
url-pattern规定的是写什么样的匹配,就在URL中些什么
例如:
/TestHttp 在浏览器中只能输入:
http://localhost:8080/day40/TestHttp
/TestHttp/hi 在浏览器中只能输入:
http://localhost:8080/day40/TestHttp/hi
一个字符都不能差,负责404.
模糊匹配:
/* http://localhost:8080/day40/任意内容 都可以访问当前servlet程序
*.do http://localhost:8080/day40/任意内容.do结尾都可以访问当前servlet程序
*.html(伪静态) http://localhost:8080/day40/任意内容.html
*.action
*.jsp
注意事项:
1.模糊匹配不能同时使用\和* 不允许
2.如果同时存在模糊匹配和精确匹配,精确匹配的优先级更高
3.使用后缀名的迷糊匹配优先级最低。
4.要求所有的Servlet的url-pattern都不能为/,不允许和Tomcat默认servlet冲突
Tomcat默认的servlet程序【缺省】 ----defaultServlet 最终的保障机制
在URL中输入
Http://localhost:8080/day40/
流程:
1.在day40的项目目录下的【WEB-INF】里面的web.xml中匹配url-pattern为 / 的标签 【精确匹配】
2.如果没有匹配到这个 / 映射路径,这个时候tomcat会把这个映射路径交给 在Tomcat中默认的servlet程序中
,DefaultServlet
3.DefaultServlet会首先在day40的项目目录下找有没有对应的index.**文件
这里可以支持 index.html index.jsp
4.如果有,将对应的index.html发送给浏览器
如果没有,报状态码404,跳转到默认的404页面