servlet
1.java_web概述
java_web应用是由servlet,html网页,类,以及其他资源组成。java_web应用可以在各种供应商提供的容器中运行。
常用的容器有 tomcat ,resin,weblogic等。
2.什么是servlet
servlet本身就是一种Java类,这种Java类提供了web形式的方法(JavaEE规范中),只要实现了servlet接口的类,都是一种servlet资源。
HTML只能用来保存静态内容,而通常情况下,静态页面很难满足实际应用的需要,鉴于此,动态页面的概念被引入。所谓动态页面,指的是能够根据不同时间、不同用户而显示不同内容的页面,例如常见的论坛、留言板、电子商务网站等都是通过动态页面来实现的。
Servlet是采用Java语言编写的服务器端程序,它运行于Web服务器中的Servlet容器中,其主要功能是提供请求/响应的Web服务模式,可以生成动态的Web内容,而这正是HTML所不具备的功能。
与其他生成动态页面的技术相比,Servlet有诸多优点,具体而言,主要表现在如下几个方面:
-
较好的可移植性。
由于Java语言具有跨平台和可移植性强的特点,使得Servlet也有较好的可移植性,即无需修改代码就可以部署到多种不同类型的Web服务器上。 -
执行效率高。
由于CGI针对每个请求都会创建一个进程来处理,而Servlet针对每个请求创建一个线程来执行,而创建线程比创建进程的开销要小,因此与CGI相比,Servlet在交互过程中有更短的响应时间,响应效率更高。 -
功能强大。
Servlet可以与Web服务器进行交互,而CGI却无法与Web服务器直接交互。 -
使用方便。
Servlet提供了许多非常有用的接口以用来读取或设置HTTP头消息,处理Cookie和跟踪会话状态等。 -
可扩展性强。
由于Servlet是用Java语言编写的,因此它具备了Java语言的所有优点。
Java语言是健壮的、面向对象的编程语言,它很容易扩展,Servlet自然也具备这样的优点。为了更好地说明Servlet,在介绍Servlet处理请求的过程前,首先引入Servlet程序的基本结构,如下所示:
从以上Servlet的程序结构中可以看出,在Servlet中,并没有main()方法,连所谓的入口方法都没有,那么它到底是如何执行的呢?其实,它是在容器的控制下执行的,最常被使用的容器为Tomcat。当Web服务器获取到一个对Servlet的请求时,该服务器将会把这个请求交给对应的容器来处理,容器通过调用Servlet的方法(doGet()或doPost())来响应客户端的请求。
3.doPost()方法与doGet()方法怎么选择
从Web容器处理HTTP请求的流程中可以看出,最终的请求都会交给Servlet来处理,而Servlet是通过调用service()方法来处理请求的,service()方法会根据不同的请求类型分别调用doPost()方法(用于处理POST请求)或doGet()方法(用于处理GET请求)来处理用户请求,实现对客户的响应。如果请求是GET,就调用doGet()方法;如果请求是POST,就调用doPost()方法。在Servlet接口和GenericServlet(一个通用的、不特定于任何协议的Servlet,它实现了Servlet接口)中是没有doGet()方法与doPost()方法的,而HttpServlet中定义了这些方法,但是都是返回error信息,所以,当定义一个Servlet时,都必须实现doGet()方法或doPost()方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。
具体而言,当HTTP请求中的method属性为get时,调用doGet()方法;当method属性为post时,则调用doPost()方法。
4.JSP与Servlet有何异同
JSP与Servlet的相同点为:JSP可以被看作一个特殊的Servlet,它只不过是对Servlet的扩展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成动态页面。由于JSP页面最终要被转换成Servlet来运行,因此处理请求实际上是编译后的Servlet。
JSP与Servlet的不同点为:
①Servlet的实现方式是在Java中嵌入HTML代码,编写和修改HTML非常不方便,所以它比较适合做流程控制、业务处理;而JSP的实现方式为在HTML中嵌入Java代码,比较适合页面的显示,例如,在Struts框架中,Servlet位于MVC设计模式的控制层,而JSP位于视图层。
②Servlet中没有内置对象,JSP中的内置对象都是必须通过HtpServletRequest对象、HttpServletResponse对象以及HtpServlet对象得到。
5.如何创建servlet
实现servlet接口
继承HttpServlet
HttpServlet-继承–>Servlet
5.1实现servlet接口
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /主要实现该方法,当浏览器访问一个servlet 时,该方法被tomcat服务器调用/
5.2service方法:
我们可看出来,service还是抽象方法,并没有被重写,如果以这种方式创建servlet我们需要自己写service方法。
init方法:
有个带参数的init方法,该方法在启动tomcat服务器时会被调用【执行一些初始化工作】。
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
5.3继承HTTPServlet抽象类
这种方法使我们最常用的也是最好用的。
仔细看可以发现HTTPServlet并没有抽象方法,却是抽象类,why?
回想一下抽象类和接口。当写了一个类,方法也全部实现,但是却不想别人直接使用它,可以把它声明为抽象类,让想使用
他的人通过继承来使用。
service源码:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
servlet配置
当我们写了一个servlet,如何让他与一般的java类不同,tomcat服务器如何识别他?这就需要配置文件【配置文件会在tomcat服务器启动时被解析,只要按它的约束,就能正常解析】。
当然,直接创建servlet,ecplise会帮我们配置好。
HelloWorld
HelloWorld
com.briup.servlet.HelloWorld
HelloWorld
/HelloWorld
servlet的生命周期
servlet默认是单例,在web运行期间一个servlet类只会创建一个对象。
servlet的生命周期可以用3个方法体现init、service、destory
init(ServletConfig config)
servlet初始化。调用时间取决于标签。
标签表示当前这个servlet需要在启动tomcat服务器期间就被创建出来
标签里面需要放一个正整数,数值的大小可以决定servlet对象被创建的先后顺序,【数值越小就越先被创建】。
(如果有多个servlet对象需要在tomcat启动期间被创建的话)
注意:如果值一样,也是可以创建成功的,有内部顺序,并非依次创建。
service(ServletRequest req,ServletResponse res)
tomcat服务器会执行该方法处理浏览器的请求。
destory()
当servlet需要销毁时调用servlet中的该方法。
销毁时间:
1.tomcat服务器【正常】关闭
2.tomcat重新加载项目的时候
6.连接数据库
6.1建项目
这里填完之后直接点击完成就可以了
6.2导入oracle jar包
把包复制到lib文件夹里面
把包复制过来后记住操作图片上的步骤
6.3建包建类别写java代码
反键src创建包
反键刚刚创建的包在包里创建类
在新建类DBHelper里编写java代码连接数据库
package com.zking.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBHelper {
private static final String URL="jdbc:oracle:thin:@localhost:1522:orcl";
private static final String CLASS_NAME="oracle.jdbc.driver.OracleDriver";
//代码块
static {
try {
Class.forName(CLASS_NAME);
} catch (Exception e) {
e.printStackTrace();
}
}
//创建连接
public static Connection getCon() {
Connection con=null;
try {
con=DriverManager.getConnection(URL, "scott", "tiger");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
//释放连接
public static void myClose(Connection con,PreparedStatement ps,ResultSet rs) {
try {
if(con!=null&&!con.isClosed()) {
con.close();
}
if(ps!=null) {
ps.close();
}
if(rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(DBHelper.getCon());
}
}
上面代码输入完后可以写一个main方法测试是否连接oracle数据库
,如果连接数据库成功的话控制台输出的东西就会与下方图片一致,测试失败的话就会报错