serverlet
前言:
web资源有两种分类:
*静态资源
HTML ,javaScript
*动态资源
Java server pages ,serverlet
serverlet介绍
作用:
- 访问静态资源或者动态资源都要用到serverlet
- serverlet用于接收和响应http的请求
Servlet容器处理Servlet请求的简单流程图流程图:
UML类图如下图所示:
代码:
- 新建一个动态web工程。
如果部署好了的项目tomcat会出现如下目录:
步骤
1.新建一个动态web工程
2.建立一个Myservlet类 让他实现 implements serverlet.(其实serverlet就是一个interface)
*我们在重写的 service方法中让他打印一个hello world
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.Servletrequest;
import javax.servlet.Servletresponse;
public class Myservlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.print("hello world");
}
}
3.配置一个serverlet(作用是告诉服务器我们的serverlet有以下作用)
*打开Webcontent->WEB-INF->web.xml(这个web.xml创建web动态项目的时候应该勾选上去)
配置如下:
类路径可以鼠标右键 copy quailifile name
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myservlet</servlet-name>
<servlet-class>com.serverlet.test.Myservlet</servlet-class>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mAPPing>
<servlet-name>Myservlet</servlet-name>
<url-pattern>/s</url-pattern>
</servlet-mapping>
在浏览器中输入地址:http://localhost:8080/ServletDome/
结果
在次输入后面给的虚拟地址:/s
结果(打印两次是因为我输了两遍)
(*要是对应的servlet和servlet mapping两个不一样的话可能会报错,那么我们要注意 tomcat启动里面报错打印的信息 根据报错的信息修改相应内容)
总结过程:
- 找到tomcat应用
- 找到项目
- 找到web.xml ,然后在里面找到url-pattern,找到patter里面内容是/s的
- 找到servlet-mapping中的 servlet-name里面的Myservlet(这个名字在创建的时候可以随便写)
- 找到上面定义的servlet元素中的servlet-name 中的 myservlet
- 找到servlet-class然后开始创建该类的实例
- 继而执行该servlet中的service方法
servlet的通用写法
看一下 servlet的 方法结构
servlet(接口)---->GenericServlet------>HttpServlet–>或者其他自己定义的方法
所以可以写成其他定义的方法
例子:
首先先写一个类继承httpservlet,我写的是myservlet2.java
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Myseverlet2 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("hello servlet");
}
}
xml中配置如下:
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myservlet2</servlet-name>
<servlet-class>com.serverlet.test.Myseverlet2</servlet-class>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myservlet2</servlet-name>
<url-pattern>/ss</url-pattern>
</servlet-mapping>
运行结果
其实在运用中只经常使用的是doget 和 dopost 所以我们把service注释掉重写do’get和 dopost:
代码如下:
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Myseverlet2 extends HttpServlet{
// @Override
// protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// // TODO Auto-generated method stub
// System.out.println("hello servlet");
//
// }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("dopost...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doget servlet2...");
}
}
在继续输入地址为回车:http://localhost:8080/ServletDome/ss
结果
看出打印doget servlet2…所以//如果是doget请求就会打印这个方法
Servlet生命周期
新建class 为Myserverlet3实现servlet方法
1.
在init方法中打印servlet初始化
代码如下:
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Myserverlet3 implements Servlet{
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet初始化");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
web.xml配置如下
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet3</servlet-name>
<servlet-class>com.serverlet.test.Myserverlet3</servlet-class>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet3</servlet-name>
<url-pattern>/sss</url-pattern>
</servlet-mapping>
发布服务器地址栏输入:http://localhost:8080/ServletDome/sss
结果
重点小记
在其他浏览器继续输入该网址不能继续初始化init 因为一个servlet在创建后就初始化 并且只能初始化一次.
2.
给service方法一个打印hello service…
//2.只要客户端来了一个请求就执行这个方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("hello service...");
}
重启给地址:http://localhost:8080/ServletDome/sss
结果
在回车
重点小记
只要客户端来了一个请求就执行这个方法
该方法可以执行多次 一次执行一个
3.
给destory一个方法打印输出hello destory被调用了
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("hello destory被调用了...");
}
然后我们在server里面remove项目
结果
重点小记
servlet销毁的时候就执行这个方法
当项目从服务器 tomcat移除的时候就执行这个方法
正常关闭服务器就会执行该方法
Servlet生命周期总结:
init方法 --创建实例时候就初始化 ,只执行一次
service方法—每请求一次 就执行一次
destory方法–关闭服务器就执行
让servlet初始化时机提前
意义:默有的时候在初次访问servlet的时候,才会执行init方法,有的时候,我们需要在这个方法里面执行一些初始化工作,甚至做一些比较耗时的逻辑,那么这个时候,初次访问,可能会在init方法中逗留太久时间,那么我们就想办法让初始化的时机提前一点
继续新建Mysevlet4的class
代码如下:
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Myserverlet4 implements Servlet{
@Override
//1.一个servlet在创建后就初始化 并且只能初始化一次.
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet 初始化....");
}
//2.只要客户端来了一个请求就执行这个方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("hello service...");
}
//3.servlet销毁的时候就会执行该方法
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("hello destory被调用了...");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
web.xml配置如下
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet3</servlet-name>
<servlet-class>com.serverlet.test.Myserverlet3</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet3</servlet-name>
<url-pattern>/sss</url-pattern>
</servlet-mapping>
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet4</servlet-name>
<servlet-class>com.serverlet.test.Myserverlet4</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet4</servlet-name>
<url-pattern>/ssss</url-pattern>
</servlet-mapping>
结果:在load-on-startup2里面就先初始化了
总结:在元素load-on-startup里面只要数字越小就越先执行(如果数字相同就是随机选择)一般不写负数 但是要从2开始(因为1在tomcat conf web.xml已经先被使用来访问各种静态资源,可以打开web.xml里面来看到详细信息)
servlet config:配置servlet
新建一个Myservletconfig类
代码如下
package com.serverlet.test;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jdk.nashorn.internal.runtime.regexp.joni.Config;
public class Myservletconfig extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig config=getServletConfig();
String ServletName=config.getServletName();
System.out.println("ServletName"+ServletName);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
web.xml配置如下:
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet5</servlet-name>
<servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet5</servlet-name>
<url-pattern>/sssss</url-pattern>
</servlet-mapping>
结果:
//可以从打印输出中看到这个其实是获得servlet-name里面的文本内容
继续在doget方法中打印
代码
String getaddress=config.getInitparameter("address");
System.out.println("address:"+getaddress);
配置:
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet5</servlet-name>
<servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
<init-param>
<param-name>address</param-name>
<param-value>sichuang</param-value>
</init-param>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet5</servlet-name>
<url-pattern>/sssss</url-pattern>
</servlet-mapping>
结果
可以看出init -param里面可以初始化参数并且方法getInitParameter(“xx”);可以获得某一个参数
继续下一个方法
代码:
在web.xml中有多个初始化对象那么怎么获得了
<!-- 新建一个servlet 告诉名字叫做HelloServlet,具体路径是:包名 类名 -->
<servlet>
<servlet-name>Myserverlet5</servlet-name>
<servlet-class>com.serverlet.test.Myservletconfig</servlet-class>
<init-param>
<param-name>address</param-name>
<param-value>sichuang</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
</servlet>
<!-- 注册servelt的映射。serverletName:找到上面注册的具体servlet ,url-pattern:在地址栏上的path -->
<servlet-mapping>
<servlet-name>Myserverlet5</servlet-name>
<url-pattern>/sssss</url-pattern>
</servlet-mapping>
方法:
Enumeration<String> getAllinitparam=config.getInitParameterNames();
while (getAllinitparam.hasMoreElements()) {
String AllName = (String) getAllinitparam.nextElement();
System.out.println("Allparam:"+AllName);
}
结果
//可以获得所有参数名称
也可以传进去参数的值得到参数的值
总结:
config三个方法new 对象接收并且输出
ServletConfig config=getServletConfig();
- 获得servlet 名字的方法:getServletName();
- 获得某一个参数的方法:getInitParameter(“address”);
- 获得所有参数的方法:getInitParameterNames();
用意:
例如
ServletConfig config=getServletConfig();
String number=config.getInitParameter("unber");
if (number==null) {
throw new illegalargumentException("servlet 在创建的时候一定要写这个参数");
}else {
System.out.println("number...");
}
打印出number…
总结:
假如开发一些应用的时候使用到的一些技术,或者一些代码,我们不会,但是有人写出来了,他的代码放置在自己的servlet类里面,刚好这个servlet里面的公司在注册servlet的时候,必须要在web.xml里面,生命init-params
大总结
servlet配置web.xmlservlet元素servlet生命周期servletconfig里面的各种方法详细介绍等…
相关阅读
今天来讲javaweb的第三个阶段学习。老规矩,首先先用一张思维导图来展现今天的博客内容。ps:我的思维是用的xMind画的,如果你对我的
转载:http://blog.sina.com.cn/s/blog_85f5590f0100wm7q.html现在的JSP书籍有的是直接讲述JSP的使用,然后再讲解SERVERLET的使用;