Servlet接口Servlet程序
⭕Servlet是什么?
- 把实现了servlet接口的java程序叫做Servlet
- Servlet是sun公司开发动态web的一门技术
- Sun子这些API中提供了一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个步骤
a. 编写一个类,实现Servlet接口 b.把开发好的java类部署到web服务器中
⭕HelloServlet
Servlet接口有两个默认的实现类:HttpServlet
- 关于Maven父子工程
//当建立子项目时父项目中会添加<modules><module>ServletDemoSon01</module></modules>
//子项目会有<parent><artifactId>ServletDemo1.0</artifactId><groupId>com.Jack</groupId><version>1.0-SNAPSHOT</version></parent>
- Maen环境优化
- 修改web.xml文件为最新(模板就在tomcat的实例目录中)
- 将maven的结构补充完整(java文件夹和resource文件夹)
- 编写一个Servlet
public class HelloServlet extends HttpServlet {//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();//响应流writer.print("Hello,Serlvet");}@Overrideprotected 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.jack.servlet.HelloServlet</servlet-class></servlet><!-- Servlet的请求路径 --><servlet-mapping><servlet-name>Hello</servlet-name><url-pattern>/Hello</url-pattern></servlet-mapping>
- 配置Tomcat
- 启动测试
⭕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>/Hello2</url-pattern></servlet-mapping><servlet-mapping><servlet-name>Hello</servlet-name><url-pattern>/Hello3</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>*.Jack</url-pattern></servlet-mapping>
⭕ServletContext
- ServletContext是什么
web容器在启动的时候,他会为每一个web程序创建一个ServletContext对象,它代表了当前的web应用 - ServletContext可以干什么
a. 共享数据 b. 获取web初始参数 c. 请求转发 d.读取资源文件 - 共享数据
⌨这个是放置类,可以传递数据,在这个Servlet中保存数据,可以在另外一个Servlet中拿到public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();String name="Jack";servletContext.setAttribute("name",name);//将一个数据保存在ServletContext中,key为name,value为nameSystem.out.println("Hello");}}
⌨接收读取数据public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();Object getname = (String)servletContext.getAttribute("name");resp.setContentType("text/html");resp.setCharacterEncoding("utf-8");resp.getWriter().print("你好!"+getname);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}
⌨完善web.xml文件<servlet><servlet-name>Hello02</servlet-name><servlet-class>com.jack.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>Hello02</servlet-name><url-pattern>/hello02</url-pattern></servlet-mapping><servlet><servlet-name>get</servlet-name><servlet-class>com.jack.servlet.GetServlet</servlet-class></servlet><servlet-mapping><servlet-name>get</servlet-name><url-pattern>/get</url-pattern></servlet-mapping>
- 获取web初始参数
⌨配置一些web应用初始化参数<context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/mybatis</param-value></context-param>
⌨ servlet类@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();String url = servletContext.getInitParameter("url");resp.getWriter().print(url);}
- 请求转发
⌨servlet类@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletContext servletContext = this.getServletContext();System.out.println("进入了ForwardDemo");//转发的请求路径RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/sd");//调用forward方法实现请求转发requestDispatcher.forward(req,resp);//也可以这样//servletContext.getRequestDispatcher("/sd").forward(req,resp);}

- 读取资源文件
⌨Properties//- 再Java目录下新建properties//- 在resources目录下新建properties//发现:都被打包到了同一路径下:classes,我们俗称这个路径为classpath:@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");Properties properties = new Properties();properties.load(resourceAsStream);String username = properties.getProperty("username");String password = properties.getProperty("password");resp.getWriter().print(username+";"+password);}
⭕HttpServletResponse & HttpServletRequest
- web服务器接收客户端http请求,针对这个请求分别创建:
代表响应的HttpServletResponse—-给客户端发送响应的信息
代表请求的HttpServletRequest—-用来获取客户端请求过来的参数 - 服务端如何接收请求的?
客户端/浏览器通过HTTP协议访问并向服务器发出请求 , 所有的请求都会被封装进HttpServletRequest中,通过HttpServletRequest的方法,获得客户端的所有信息 - HttpServletResponse方法简单分类
⌨负责向浏览器发送数据的方法ServletOutputStream getOutputStream() throws IOException;PrintWriter getWriter() throws IOException;
⌨负责向浏览器发送响应头的方法void setCharacterEncoding(String var1);void setContentLength(int var1);void setContentLengthLong(long var1);void setContentType(String var1);void setBufferSize(int var1);void sendError(int var1, String var2) throws IOException;void sendError(int var1) throws IOException;void sendRedirect(String var1) throws IOException;void setDateHeader(String var1, long var2);void addDateHeader(String var1, long var2);void setHeader(String var1, String var2);void addHeader(String var1, String var2);void setIntHeader(String var1, int var2);void addIntHeader(String var1, int var2);void setStatus(int var1);
- 常见应用
a.向浏览器输出信息 b.下载文件 c.验证码 d.实现重定向
小结🚩
※※※※※五星级重要
