Servlet学习
一、Servlet的认识
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
编写一个Servlet程序只需完成下面两步:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
简单明了一句话就是,实现了Servlet接口的Java程序叫做Servlet!
二、Servlet程序测试
完整步骤思路如下:
-
构建一个普通Maven项目,删除里面的src目录,其他文件保留,把该工程作为Maven的主工程
-
在上面Maven项目下创建新的Moudel,作为项目的子工程,子项目会继承父项目中的所有Java,可以直接使用。项目创建成功表现在:
- 父项目的pom.xml有
<modules> <module>servlet01</module>//为子共工程名称 </modules>
- 子项目的pom.xml有
<parent> <artifactId>JavaWeb-02-maven</artifactId>//为主工程名称 <groupId>com.yg</groupId> <version>1.0-SNAPSHOT</version> </parent>
-
Maven环境优化
- 修改web.xml为最新版本
- 把Maven结构搭建完整
-
编写一个HelloServlet程序
- 创建一个普通类HelloServlet.java
- 实现Servlet接口(直接继承HttpServlet)
例:
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入doGet方法"); PrintWriter writer = resp.getWriter();//响应流 writer.print("hello,servlet!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
编写Servlet的映射
该步骤的作用:我们写的是Java程序,要想通过浏览器访问,则需要浏览器连接web服务器,所以我们需要在web服务中注册我们写的Servlet,给浏览器提供一个能访问的路径
做法:
<!-- 注册我们写的Servlet --> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.yg.servlet.HelloServlet</servlet-class> </servlet> <!-- 注册Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
-
找到编辑位置
-
添加启动服务器
-
填写好相应信息
-
部署需要运行的工作
-
最后点击应用->确定,即可部署完成
-
-
启动测试
-
浏览器访问结果
出现上面结果,恭喜你已经成功编写了第一个Servlet程序!
三、Servlet工作原理
Servlet是由Web服务器调用的,web服务器在收到浏览器请求后会:
其中调用service(ServletRequest,ServletResponse)方法这一块是需要我们学习编写的,其他步骤都是我们看不到的!
四、Servlet Mapping问题
关于mapping问题详情可以看这篇文章:https://www.cnblogs.com/qianguyihao/p/4140529.html
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用元素和元素完成。
其中:
- 元素用于注册Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。
- 一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径
注意!
- 一个可以对应多个,从而一个Servlet可以有多个路径来访问
- url-partten中的路径也可以使用通配符,但是只能有两种固定的格式*:一种格式是“.扩展名”,另一种格式是以正斜杠(/)开头并以“/”结尾。*
- 由于的引入,有可能一个路径被多个url-partten匹配,这是优先级判断条件如下:
- 哪个越精确找哪个
- *.后缀的格式永远匹配级最低
- 可以在标签里配置****可以用来指定启动顺序。Servlet默认是在第一次被访问的时候创建,如果配置了这个标签,就会随着Web应用的启动而创建
五、ServletContext应用
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
常见的ServletContext应用介绍:
-
共享数据
在这个Servlet中保存的数据,可以在另一个Servlet中取
例:
//创建SetServlet public class SetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建一个ServletContext对象 ServletContext context = this.getServletContext(); //1.共享数据测试 String username = "百度";//数据 context.setAttribute("username",username);//将一个数据存放在ServletContext中,名字为:username,值为:username } } //创建GetServlet public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建一个ServletContext对象 ServletContext context = this.getServletContext(); //1.共享数据测试 resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8");//设置响应字符编码 String username = (String) context.getAttribute("username");//从context中取键为username的值 resp.getWriter().print("名字:"+username);//在windows中打印出来 } }
web.xml中注册servlet:
测试访问结果为:
-
获取初始化参数
在web.xml中配置一些web应用的初始化参数
<context-param> <param-name>url</param-name> <param-value>https://www.baidu.com</param-value> </context-param>
在GetServlet中编写以下代码
//2.获取初始化参数测试 String url = context.getInitParameter("url"); resp.getWriter().println(url);
-
请求转发
在GetServlet中编写以下代码
//3.请求转发测试 RequestDispatcher requestDispatcher = context.getRequestDispatcher("/hello");//请求转发的路径 requestDispatcher.forward(req,resp);//调用forward实现请求转发
测试结果:
-
读取资源文件
Properties
在resources模块下新建properties,Tomcat运行后会打包到了classes路径下,俗称classpath
步骤:创建一个文件,然后在GetServlet中获取文件流即可
-
创建db.properties
username=root password=123456
-
GetServlet中获取
//4.读取资源文件测试 InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");//获取打包后web容器中的db.properties文件路径,并转化为流文件 Properties prop = new Properties(); prop.load(is);//把流文件加载加载进响应中 String user = prop.getProperty("username"); String pwd = prop.getProperty("password"); resp.getWriter().println(user+":"+pwd);
-
最后测试结果即可!