javaweb基础:servlet(简单明了)
1.简介
1.1Servlet是sun公司开发动态web的一门技术
1.2Sun在这些API中提供一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个小步骤:
编写一个类,实现Servlet接口
把开发好的java类部署到web服务器中
把实现Servlet接口的java程序叫做,Servlet
**1.3Servlet接口在sun公司有两个默认的是实现类:HttpServlet
2.HwlloServlet(具体实现)
2.1 构建一个普通的Maven项目,删掉里面的src目录,以后学习就在这个项目里建立Moudel;这个工程就是Maven主工程;
2.2关于Maven父子工程的理解:
父项目中会有
<modules> <module>servlet-01</module> </modules>
子项目中有
<parent> <artifactId>javaweb-02-servlet</artifactId> <groupId>com.king</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java,子项目可以直接使用
son extends father
3. Maven环境优化
3.1修改web.xml为最新的
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <!--替换为web4.0版本,和tomcat版本一致--> </web-app>
3.2将maven的结构搭建完整
4.编写一个servlet程序
题:为什么一doPost方式提交,但以doGet方式写
答:1.由于daGet方法提交的不安全(因为提交的数据会在url栏明文显示,eg:暴露username,password);
2.两者可以相互调用;(具体可百度搜doGet和doPost区别)
4.1编写一个普通类
4.2实现servlet接口,这里直接基础HttpServlet
public class HelloServlet extends HttpServlet { //由于get和post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer= resp.getWriter();//响应流 writer.print("Hello,Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
4.3编写Servlet的映射
为什么需要映射:编写的是java程序,但是要通过浏览器访问,而浏览器需要链接web服务器,所以我们要在web服务中注册我们写的servlet,还需给他一个浏览器能够访问的路径;
<!--注册servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.king.servlet.HelloServlet</servlet-class> </servlet>
<!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
4.4配置tomcat-->启动测试
5,Servlet运行原理
Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会
6.Mapping问题
6.1一个Servlet可以指定一个映射路径
<!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
6.2一个Servlet可以指定多个映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello02</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello03</url-pattern> </servlet-mapping>
6.3一个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>
6.4指定一些后缀或者前缀等等....
注意:可以自定义后缀实现请求映射,但*前面不能加项目映射的路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.king</url-pattern> </servlet-mapping>
6.5优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
ErrorServlet实体类
public class ErrorServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); PrintWriter writer = resp.getWriter(); writer.print("<h1>404</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
web.xml配置
<!--404--> <!--404(本质走到默认请求路径)--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.king.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>