一、Servlet概述
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.servletDemo1</servlet-class>
</servlet>>
<!--映射-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
Element ‘web-app‘ cannot have character [children]...
找原因:
最终经过不断测试,发现问题所在:<servlet></servlet>和<servlet-mapping><servlet-mapping>
这两组标签之间是不能有注释的,也就是说,需要去掉<!--映射-->标签
去掉以后,我又重新把标签打了一遍:
二、Servlet执行原理
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class servletDemo2 implements Servlet {
/*
servlet方法,不要忘了在web.xml中配置
*/
/*
*初始化方法
* 在servlet被创建时,执行,只会执行一次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
/*
*获取servletConfig对象
* servletConfig:Servlet的配置对象
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
*提供服务的方法、
* 每一次servlet被访问的时候执行
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
/*
*获取Servlet的信息,版本,作者等
*/
@Override
public String getServletInfo() {
return null;
}
/*
*销毁方法
* 在服务器正常关闭时,执行,只执行一次
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
servlet的生命周期分析:
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>cn.itcast.web.servlet.servletDemo1</servlet-class>
<!--指定Servlet的创建时机
1.在第一次被访问时,创建,此时 <load-on-startup>的值为负数,默认为-1
2.在服务器启动时,创建,此时 <load-on-startup>的值为正,一般在0-10之间
-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
三、Servlet3.0版本的注解配置
好处:不需要在web.xml中配置了
步骤:
1.创建JavaEE项目,选择servlet3.0以上版本
2.定义一个类实现servlet接口
3.复习方法
4.在类上使用@WebServlet注解,进行配置
创建module时,Version下面的Web.xml不要勾选即可。
查看WebServlet,选中@后面的WebServlet,不要包括@,crtl+b
需要配置虚拟路径,在@WebServlet后面写
@WebServlet(urlPatterns = "/demo")
测试:
还可以更简洁,直接写servlet的资源路径,同样可以访问
@WebServlet("/demo2")
四、GenericServlet-----抽象类
GenericServlet,将Servlet接口中其他方法做了默认空实现,只有service()方法作为抽象
将来定义Servlet类时,可以继承GenericServet,实现service()方法即可。
HttpServlet-----抽象类
package cn.itcast.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo2")
public class servletDemo extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("GenericServlet.....");
}
}
测试结果如下:
//servlet中service()方法的判断请求方式:
// 判断请求方式
String method = req.getMethod();
if("GET".equals(method)){
//get方式获取数据
doGet();
}else if("POST".equals(method)){
//post方法获取数据
doPost();
}
五、servlet体系结构
package cn.itcast.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo2")
public class servletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
System.out.println("doGet....");
}
@Override
protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
System.out.println("doPost...");
}
}
测试结果如下:
还可以在此编写一个login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo2" method="post">
<input name = "username">
<input type="submit" value="提交">
</form>
</body>
</html>
测试结果如下:
这里补充Servlet相关的配置:
urlpartten:Servlet访问路径
1.一个servlet可以定义多个访问路径:@WebServlet{"/xxxx","/x4","/xxxx5"}
2.路径的定义规则:
/xxx(一层路径)
/Xxx/Xxx(两层路径)
*.do
比如:@WebServlet{"/user/demo"}相当于@WebServlet{"/user/*"}
get!!!