Servlet简介
- Servlet是sun公司开发动态web的一门技术
- Sun公司在这些API中提供一个接口叫Servlet 如果你想开发一个Servlet程序只需要连个小步骤
- 编写一个类实现Servlet接口
- 把开发好的java类部署到web服务器中
HelloServlet
Servlet接口在Sun公司有两个默认的实现类 HttpServlet,GenericServlet
构建一个普通的Maven项目 删除src目录 以后的学习在这个项目里建立Model
这个空的工程就是Maven主工程
关于父子工程的理解
父项目中会有一个
<modules><module>servlet-01</module></modules>
子项目中会有一个
<parent><artifactId>javaweb-02-servlet</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent>
父项目中的jar包子项目可以使用
Maven环境优化
修改web.xml为最新的
将Maven的结构搭建完整
编写一个Servlet程序
编写一个普通类
实现SerVlet接口 继承HttpServlet
package com.deng.servlet;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;public class HelloServlet extends HttpServlet {//由于get和post只是请求实现的不同方式 可以互相调用 业务逻辑都一样@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {PrintWriter writer = response.getWriter(); //响应流//ServletOutputStream outputStream = response.getOutputStream();writer.println("Hello Servlet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}}
编写Servlet的映射
- 为什么需要映射
- 写的是java代码 但是需要通过服务器访问 而浏览器需要连接web服务器 所以需要 在web服务中注册servlet 还需要给他一个浏览器能够访问的路径
Servlet原理
Servlet是由web服务器调用 web服务器在收到浏览器请求之后,会
Mapping问题
一个Servlet可以指定一个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello </url-pattern></servlet-mapping>
一个Servlet可以指定多个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello </url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello1 </url-pattern></servlet-mapping><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello2 </url-pattern></servlet-mapping>
一个Servlet可以指定通用映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/* </url-pattern></servlet-mapping>
默认请求路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/* </url-pattern></servlet-mapping>
指定后缀(前面不能加/)
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>*.deng </url-pattern></servlet-mapping>
优先级问题
ServletContexct(实现数据共享)
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext 对象,它代表了当前的web应用
共享数据
我在这个SerVlet中保存的数据 可以在另外一个servlet中拿到 ```java //在这个Servlet中为ServletContext添加数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置默认编码格式 resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); ServletContext context = this.getServletContext(); String name = “deng”; //数据 context.setAttribute(“username”,name); //将一个数据以键值对的形式保存在ServletContext中
} //在这个Servlet中从ServletContext获取数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); Object username = context.getAttribute(“username”); resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); resp.getWriter().println(username); }
```java<!--配置XML--><servlet><servlet-name>set</servlet-name><servlet-class>com.deng.servlet.HelloServlet</servlet-class></servlet><!--Servlet映射--><servlet-mapping><servlet-name>set</servlet-name><url-pattern>/setname</url-pattern></servlet-mapping><!--配置XML--><servlet><servlet-name>get</servlet-name><servlet-class>com.deng.servlet.GetServlet</servlet-class></servlet><servlet-mapping><servlet-name>get</servlet-name><url-pattern>/getname</url-pattern></servlet-mapping>
获取初始化参数
<!--web.xml--><!--以键值对的方式--><context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306</param-value></context-param>
获取初始化参数
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();resp.setCharacterEncoding("utf-8");resp.setContentType("text/html");//获取初始化参数String url = servletContext.getInitParameter("url");resp.getWriter().println(url);}
请求转发
<servlet><servlet-name>Demo4</servlet-name><servlet-class>com.deng.servlet.ServletDem04</servlet-class></servlet><servlet-mapping><servlet-name>Demo4</servlet-name><url-pattern>/demo4</url-pattern></servlet-mapping>
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();//转发的请求路径RequestDispatcher dispatcher = context.getRequestDispatcher("/get");dispatcher.forward(req,resp); //调用forward实现请求转发//context.getRequestDispatcher("/get").forward();}
读取资源文件
properties类
- 在java目录下新建properties
- 在resources目录下新建properties
发现:都被打包到了同一个路径下,classes(类路径)、
//db.propertiesDriver=driverurl=jdbc:mysql://localhost:3306/mybatiesusername=tompassword = 123321
<servlet><servlet-name>prop</servlet-name><servlet-class>com.deng.servlet.PropertiesServlet</servlet-class></servlet><servlet-mapping><servlet-name>prop</servlet-name><url-pattern>/prop</url-pattern></servlet-mapping>
@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext context = this.getServletContext();//将文件转为输入流(相对位置)InputStream stream = context.getResourceAsStream("WEB-INF/classes/db.properties");//new一个Properties对象并读入数据Properties properties = new Properties();properties.load(stream);//获取数据String username = properties.getProperty("username");String password = properties.getProperty("password");resp.getWriter().println(username+" "+password);}
