seo如何推广网站,教育局网站群建设方案,wordpress图文混排,室内装修设计软件哪个好用1. Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。sun公司在其API中提供了一个servlet接口#xff0c;用户若想要发一个动态web资源#xff0c;只需要完成以下两步即可#xff1a; 1#xff09;编写一个servlet#xff0c;即实现servlet接口的Java类…1. Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。sun公司在其API中提供了一个servlet接口用户若想要发一个动态web资源只需要完成以下两步即可 1编写一个servlet即实现servlet接口的Java类 2 把开发好的servlet部署到web服务器中。 Servlet接口定义了所有servlet必须实现的方法。一个servlet是运行在web服务器中的一个小java程序servlet通过HTTP协议接收并响应web客户端发来的请求。这个接口中定义的方法包括初始化servlet服务请求以及remove servlet这些方法即servlet的生命周期方法调用顺序如下 1某个创建servlet对象的时候调用初始化方法: void init(ServletConfig config) 2客户端发送请求的时候service方法被执行void service(ServletRequest req, ServletResponse res) 3某个servlet对象被摧毁的时候调用destroy方法: void destroy() 除了这些与生命周期有关的方法外Servlet接口还提供了getServletConfig方法和getServletInfo方法getServletConfig方法可以获得servlet的一些启动信息getServletInfo方法可以返回servlet本身的一些信息。 sun公司定义了Servlet接口的两个默认实现类分别为javax.servlet.GenericServlet和javax.servlet.http.HttpServlet。 HttpServlet指能够处理HTTP请求的servlet它再原有的Servlet接口上添加了一些与HTTP协议处理方法它比Servlet接口的功能更为强大因此开发人员在编写Servlet时通常应继承这个类而避免直接去实现Servlet接口。HttpServlet在实现Servlet接口时覆写了service方法该方法体内的代码会自动判断用户的请求方式如为GET请求则调用HttpServlet的doGet方法如为Post请求则调用doPost方法。因此开发人员在编写Servlet时通常只需要覆写doGet或doPost方法而不要去覆写service方法。 2. Servlet的运行过程 Servlet程序是由web服务器调用web服务器接收到客户端的Servlet访问请求后 1web服务器首先检查是否已经装载并创建了该Servlet的实例对象如果是则直接执行第4步否则执行第2步。 2装载并创建该Servlet的一个实例对象。 3调用Servlet实例对象的init()方法。 4创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP相应消息的HttpServletResponse对象然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。 5web应用程序被停止或重新启动前Servlet引擎将卸载Servlet并在卸载之前调用Servlet的destroy()方法。 3. Servlet的几个细节 1. Servlet细节1 由于客户端是通过URL地址访问文本服务器中的资源所以servlet程序若想被外界访问必须把servlet程序映射到一个URL地址上这个工作在web.xml文件中使用servlet元素和servlet-mapping元素完成。 1 servlet元素用于注册Servlet它包含两个主要的子元素 servlet-name用于设置Servlet的注册名称 servlet-class用于设置Servlet的完整类名 2servlet-mapping元素用于映射一个已注册的Servlet的一个对外访问路径它包含两个子元素 servlet-name用于设置Servlet的注册名称 url-pattern用于指定Servlet的对外访问路径(可以随便指定) 例如 web-app servlet servlet-nameAnyName/servlet-name servlet-classHelloServlet/servlet-class /servlet servlet-mapping servlet-nameAnyName/servlet-name url-pattern/demo/hello.html/url-pattern /servlet-mapping
/web-app 2. Servlet细节2 同一个Servlet可以被映射到多个URL上即多个servlet-mapping元素的servlet-name子元素的设置值可以是同一个Servlet的注册名。在Servlet映射到的URL中也可以使用*通配符但是只能有两种固定的格式一种格式是“*.扩展名”另一种格式是以“/”开头并以“/*”结尾。例如 servlet-mapping servlet-nameAnyName/servlet-name url-pattern*do/url-pattern
/servlet-mapping 也可以映射到另一个url servlet-mapping servlet-nameAnyName/servlet-name url-pattern/action/*/url-pattern
/servlet-mapping 3. servlet细节3 Servlet是一个供其他java程序Servlet引擎调用的java类它不能独立运行它的运行完全由Servlet引擎来控制和调度。针对客户端的多次Servlet请求通常情况下服务器只会创建一个Servlet实例对象也就是说Servlet实例对象一旦创建它就会驻留在内存中为后续的其它请求服务直至web容器退出servlet实例对象才销毁。 在Servlet的整个生命周期中Servlet的init方法只被调用一次而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象然后将这两个对象作为参数传递给它调用的Servlet的service()方法service方法再根据请求方式分别调用doGet或doPost方法。 4. servlet细节4 如果再servlet元素中配置了一个load-on-startup元素那么web应用程序在启动时就会装载并创建Servlet的实例对象以及调用Servlet实例对象的init()方法。该技术可以用来为web写一个initServlet这个servlet配置为启动时装载为整个web应用床架必要的数据库表和数据。如 servlet servlet-name.../servlet-name servlet-class.../servlet-class load-on-startup1load-on-startiup
/servlet 5. servlet细节5 如果某个Servlet的映射路径仅仅为一个正斜杠/那么这个Servlet就成为当前Web应用程序的缺省Servlet。凡是在web.xml文件中找不到匹配的servlet-mapping元素的url它们的访问请求都将交给缺省Servlet处理也就是说缺省Servlet用于处理所有其他Servlet都不处理的访问请求。 在tomcat安装目录\conf\web.xml文件中注册了一个名称为org.apache.catalina.servlets.DefaulServlet的Servlet并将这个Servlet设置为了缺省Servlet。当访问Tomcat服务器中的某个静态HTML文件和图片时实际上是在访问这个缺省Servlet。 假设现在在工程名为test的WebRoot目录下新建一个1.html在web.xml文件中并没有配置servlet-mapping即在工程中没有Servlet映射成1.html然后访问http://localhost:8080/test/1.html时这时候这个请求就交给缺省的Servlet缺省的Servlet收到请求后会首先看一下web应用下面有没有这个1.html如果有则读取并返回到浏览器如果没有则返回一个错误页面。 6. servlet细节6 当多个客户端并发访问同一个Servlet时web服务器会为每一个客户端的访问请求创建一个线程并在这个线程上调用Servlet的service方法因为Servlet只有一个实例化对象因此service方法内如果访问了同一个资源的话就有可能引发线程安全问题。那么如何解决Servlet中的线程安全问题呢 1 如果某个Servlet实现了SingleThreadModel接口那么Servlet引擎将以单线程模式来调用其service方法。该接口没有任何方法它起到了一个标志的作用。对于实现了SingleThreadModel接口的ServletServlet引擎仍然支持对该Servlet的多线成并发访问其采用的方式是产生多个Servlet实例对象并发的每个线程分别调用一个独立Servlet实例对象。 2使用synchronized 关键字synchronized能保证一次只有一个线程可以访问被保护的区段从而可以通过同步块操作来保证线程的安全。 3尽量避免在Servlet里使用实例变量只要在Servlet里面的任何方法里面都不使用共有的实例变量那么该Servlet就是线程安全的。 以上三种方式中实现SingleThreadModel接口可以解决问题但是并不是真正解决Servlet的线程安全问题因为Servlet引擎会创建多个Servlet实例对象而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。另外创建多个Servlet实例对象也会引起大量的开销。事实上在Servlet API 2.4中已经将SingleThreadModel标记为过时的了。 同样如果在程序中使用同步来保护要使用的共享的数据也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它使得其同时处理客户请求的吞吐量降低而且很多客户处于阻塞状态。所以在实际的开发中也应避免或最小化 Servlet 中的同步代码。 所以在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。 3. Servlet的Hello Word 最后写一个再简单不过的Hello Word吧…… public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(Hello word!); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
} web.xml servlet servlet-nameServletDemo/servlet-name servlet-classservlet.ServletDemo/servlet-class load-on-startup1/load-on-startup
/servlet
servlet-mapping servlet-nameServletDemo/servlet-name url-pattern/ServletDemo/url-pattern
/servlet-mapping 入门就这么多吧如有错误之处欢迎留言指正~