目录
③使用继承 HttpServlet 的方法来开发Serlvet
开发servlet的三种方法
- 实现 Servlet接口
- 通过继承 GenericServlet
- 通过继承 HttpServlet
①实现servlet接口的方式
需求如下: 请使用实现 接口的方式,来开发一个Servlet ,要求该Servlet 可以显示Hello,world,同时显示当前时间.
步骤
- 在webapps下建立一个web应用 hspWeb1
- 在hspWeb1 下建立 WEB-INF->web.xml [web.xml可以从 ROOT/WEB-INF/web.xml拷贝]
- 在WEB-INF 下建立 classes 目录(我们的Servlet 就要在该目录开发.),建立 lib文件夹
4. 开发MyServlet.java
package com.hsp;
import javax.servlet.*;
import javax.servlet.http.*; 为了能将servlet-api.jar包引入,需要配置环境变量
变量值; E:\tomcat\apache-tomcat-6.0.20\lib\servlet-api.jar 记得带上文件名
import java.io.*;
class MyFirstServlet implements Servlet
{
//该函数用于初始化servlet,就是把该servlet装载到内存中
//该函数只会被调用一次
public void init(ServletConfig config)
throws ServletException{
}
//得到ServletConfig对象
public ServletConfig getServletConfig(){
return null;
}
//该函数是服务函数,我们的业务逻辑代码就是写在这里
//该函数每次都会被调用
public void service(ServletRequest req,
ServletResponse res)
throws ServletException,
java.io.IOException{
}
//该函数时得到servlet配置信息
public java.lang.String getServletInfo(){
return null;
}
//销毁该servlet,从内存中清除,该函数被调用一次
public void destroy(){
}
}
5. 根据Servlet规范,我们还需要部署Servlet
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--根据serlvet规范,需要将Servlet部署到web.xml文件,该部署配置可以从examples下拷贝-->
<servlet>
<!--servlet-name 给该Servlet取名, 该名字可以自己定义:默认就使用该Servlet的名字-->
<servlet-name>MyFirstServlet</servlet-name>③
<!--servlet-class要指明该Servlet 放在哪个包下 的,形式是 包/包/../类-->
<servlet-class>com.hsp.MyFirstServlet</servlet-class> 注意:后面不要带.java④
</servlet>
<!--Servlet的映射-->
<servlet-mapping>
<!--这个Servlet-name要和上面的servlet-name名字一样-->
<servlet-name>MyFirstServlet</servlet-name>②
<!--url-pattern 这里就是将来访问该Servlet的资源名部分,可以自定义,默认与servlet-name一样-->
<url-pattern>/ABC</url-pattern>①
</servlet-mapping>
</web-app>
服务器调用流程:http://localhost:8088/ABC--->①--->②--->③--->④
6. 在浏览器中测试
在浏览器中输入
http://localhost:8088/hspweb1/ABC
7. 分析一下自己写可能出现的错误
1)<servlet-name>MyFirstServlet</servlet-name> 名字不一样 (启动tomcat错误)
2)<servlet-class>com.hsp.MyFirstServlet</servlet-class> 写成 MyFirstServlet.java,会报告500
3)资源名自己写错http://localhost:8088/hspweb1/错误的资源url-pattern(404 错误)
②使用GenericServlet开发servlet
了解即可:
案例 :
package com.hsp;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyGenericServlet extends GenericServlet
{
public void service(ServletRequest req,
ServletResponse res)
throws ServletException,
java.io.IOException{
res.getWriter().println("hello,world,i am geneirc servlet");
}
}
将该Servlet部署到web.xml文件中:
<!--根据serlvet规范,需要将Servlet部署到web.xml文件,该部署配置可以从examples下拷贝-->
<servlet>
<!--servlet-name 给该Servlet取名, 该名字可以自己定义:默认就使用该Servlet的名字-->
<servlet-name>MyGenericServlet</servlet-name>
<!--servlet-class要指明该Servlet 放在哪个包下 的,形式是 包/包/../类-->
<servlet-class>com.hsp.MyGenericServlet</servlet-class>
</servlet>
<!--Servlet的映射-->
<servlet-mapping>
<!--这个Servlet-name要和上面的servlet-name名字一样-->
<servlet-name>MyGenericServlet</servlet-name>
<!--url-pattern 这里就是将来访问该Servlet的资源名部分,默认命名规范:
就是该Servlet的名字-->
<url-pattern>/MyGenericServlet</url-pattern>
</servlet-mapping>
③使用继承 HttpServlet 的方法来开发Serlvet
- 在软件公司 90%都是通过该方法开发.
- 举例说明; 还是显示 hello,world 当前日期
代码:
package com.hsp;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class MyHttpServlet extends HttpServlet
{
//在HttpServlet 中,设计者对post 提交和 get提交分别处理
//回忆 <form action="提交给?" method="post|get"/>,默认是get
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,
java.io.IOException{
resp.getWriter().println("i am httpServet doGet()");
}
protected void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,
java.io.IOException{
resp.getWriter().println("i am httpServet doPost() post name="+req.getParameter("username"));
}
}
还有一个login.html
<html>
<body>
<form action="/hspWeb1/MyHttpServlet" method="post">
u:<input type="text" name="username"/>
<input type="submit" value="login"/>
</body>
</html>
小结 get 提交 和 post的提交的区别
- 从安全看 get<post 因为get 会把提交的信息显示到地址栏
- 从提交内容看 get<post get 一般不要大于2k, post理论上无限制,但是在实际开发中,建议不要大于64k
- 从速度看 get>post,get要求服务器立即处理请求,post请求可能形成一个队列请求
- Get可以保留uri中的参数,利于收藏
补充
补充: 如果使用javac 去编译一个带包的java文件,则需要带命令参数
javac –d . java文件
补充: 如何不重启tomcat,就指定去 reload 一个web应用,方法:
进入到 tomcat 的 manager:
点击reload即可.