在这一步又有错,/web-app处报错:> demo1 cn.itcast.web.servlet.servletDemo1 demo1 /demo1
Element ‘web-app‘ cannot have character [children]...
找原因:
最终经过不断测试,发现问题所在: 和
这两组标签之间是不能有注释的,也就是说,需要去掉标签
去掉以后,我又重新把标签打了一遍:
配置好以后,可以启动:
在网址处打“demo1”
这个时候网页处没有反应,但是java处直接调用成功。,每刷新一次,就会出现hello servlet
二、Servlet执行原理
执行步骤:
1.tomcat将全类名对应的字节码文件加载进内存,class.forName()
2.创建对象 class.newInstance()
3.调用方法---service(),接口中的方法
执行原理:
1.当服务器接收端接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径。
2.查找Web.xml文件,是否有对应的标签体内容
3.如果有,则在找到对应的全类名
4.tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
接下来介绍servlet()方法
重建一个servletDemo2,
不要忘记在web.xml中重写标签
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class servletDemo2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
servlet的生命周期分析:
1.被创建:执行init方法,只执行一次(说明一个Servlet在内存中只有一个对象,是单例的)
在日志中,init只执行一次
2.提供服务:会执行service()方法,执行多次
3.被销毁:执行destroy()方法,执行一次
以上三个周期有如下问题:
创建阶段之servlet什么情况被创建?
默认情况下,第一次被访问时,servlet被创建
可以
配置执行servlet的创建时机
步骤如下:
设置web.xml
注意:
因为Servlet是单例的,所以当多个用户访问时,可能存在线程安全问题。
解决方案:尽量不在servlet中定义成员变量,即使定义成员变量,也不要修改值
提供服务阶段之执行service方法,执行多次
每调用一次该方法都会执行一次
被销毁:destroy执行一次,且只有服务器正常关闭时才执行。
注意:destroy()方法在servlet被销毁之前执行
关于制定servlet的创建时机,可以用标签在web.xml设置,具体方法如下:
demo2
cn.itcast.web.servlet.servletDemo1
5
demo2
/demo2
三、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体系结构
HttpServlet:(继承了GenerticServlet()方法)
对http协议的一种封装,简化操作
1.定义类继承HttpServlet
2.复写doGet()和doPost()方法
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
Title
测试结果如下:
这里补充Servlet相关的配置:
urlpartten:Servlet访问路径
1.一个servlet可以定义多个访问路径:@WebServlet{"/xxxx","/x4","/xxxx5"}
2.路径的定义规则:
/xxx(一层路径)
/Xxx/Xxx(两层路径)
*.do
比如:@WebServlet{"/user/demo"}相当于@WebServlet{"/user/*"}
get!!!
这两组标签之间是不能有注释的,也就是说,需要去掉标签
去掉以后,我又重新把标签打了一遍:
配置好以后,可以启动:
在网址处打“demo1”
这个时候网页处没有反应,但是java处直接调用成功。,每刷新一次,就会出现hello servlet
二、Servlet执行原理
执行步骤:
1.tomcat将全类名对应的字节码文件加载进内存,class.forName()
2.创建对象 class.newInstance()
3.调用方法---service(),接口中的方法
执行原理:
1.当服务器接收端接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径。
2.查找Web.xml文件,是否有对应的package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class servletDemo2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy");
}
}
servlet的生命周期分析:
1.被创建:执行init方法,只执行一次(说明一个Servlet在内存中只有一个对象,是单例的)
在日志中,init只执行一次
2.提供服务:会执行service()方法,执行多次
3.被销毁:执行destroy()方法,执行一次
以上三个周期有如下问题:
创建阶段之servlet什么情况被创建?
默认情况下,第一次被访问时,servlet被创建
可以
配置执行servlet的创建时机
步骤如下:
设置web.xml
注意:
因为Servlet是单例的,所以当多个用户访问时,可能存在线程安全问题。
解决方案:尽量不在servlet中定义成员变量,即使定义成员变量,也不要修改值
提供服务阶段之执行service方法,执行多次
每调用一次该方法都会执行一次
被销毁:destroy执行一次,且只有服务器正常关闭时才执行。
注意:destroy()方法在servlet被销毁之前执行
关于制定servlet的创建时机,可以用三、Servlet3.0版本的注解配置demo2 cn.itcast.web.servlet.servletDemo1 5 demo2 /demo2
好处:不需要在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体系结构
HttpServlet:(继承了GenerticServlet()方法)
对http协议的一种封装,简化操作
1.定义类继承HttpServlet
2.复写doGet()和doPost()方法
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
Title
测试结果如下:
这里补充Servlet相关的配置:
urlpartten:Servlet访问路径
1.一个servlet可以定义多个访问路径:@WebServlet{"/xxxx","/x4","/xxxx5"}
2.路径的定义规则:
/xxx(一层路径)
/Xxx/Xxx(两层路径)
*.do
比如:@WebServlet{"/user/demo"}相当于@WebServlet{"/user/*"}
get!!!



