sun公司制定的一种用来扩展web服务器功能的组件规范。(面试会考)
(1)扩展web服务器
apache web server
iis
….
/* web server 只能处理静态资源 html 事先把文件写好。
但是我们很多需要动态资源,比如说查询股票的价格。不是事先写好的。需要时时的去查询。
可以去访问数据库,根据数据库的结果生成的。让web server有这样的功能就用 servlet
*/ 自己写的
web 服务器通常只能够处理静态资源的请求(需要事先将html文件准备好),可以使用servlet 来扩展(即 web服务器可以通过的调用 servlet 来处理动态资源的请求,比如访问数据库)
(2)组件规范
浏览器请求给 web server ,然后server调用 servlet容器 来调用 servlet
因为容器提供了一些基础服务。(比如网络相关的服务)
(1)什么是组件
符合一定规范,实现部分功能的,并且需要部署到相应容器里面才能运行的软件模块。
servlet是一个组价,需要部署大相应的servlet容器里面才能运行
就像是轮胎,有一定规范,实现部分功能…… 并且部署到汽车上才能运行的模块
(2)什么是容器
符合一定规范,提供组件的运行环境的程序
tomcat就是一个容器,提供了servlet的运行环境。
当然容器还有很多。
(1)写一个java类,实现Servlet接口或者继承HttpServlet抽象类
注:通常选择继承的方式
(2)编译 字节码文件 .class
(3)打包 创建一个具有如下结构的文件夹:
appname(应用名) 比如 jd
WEB-INF //不能改
classess(放class文件 ) //同样不能改
lib(可选的,比如要使用jdbc驱动就这放jar文件)
web.xml(部署描述文件)
(4)部署 将第三步创建好的整个文件夹拷贝到servlet容器相应的位置
注:可以使用jar命令将第三步创建好的整个文件夹压缩成一个.war为后缀的文件,然后拷贝。
(5)启动容器,访问servlet
http://ip:port/appname/url-pattern
注:
url-pattern在web.xml文件中定义
a)解压
b)配置环境变量
i.就是JDK JAVA_HOME:JDK的安装路径
ii.CATALINA_HOME:tomcat的安装路径
iii.PATH:一些命令所在的路径 比如 tomcat下的bin
c) 启动tomcat cd切换到tomcat解压目录下bin
执行 sh startup.sh 也可以使用 sh catalina.sh run
我下载后运行 startup.bat就运行了
打开浏览器,输入 http://localhost:8080
d) 关闭 sh shutdown.sh
编译java javac -d .HelloServlet.java
-cp servlet-api.jar就是告诉编译器,在编译时,可以从这个jar中找文件
在一个web.xml可以描述多个servlet
写 servlet-class的时候要写完整,就是说要写包名也要。
url-pattern
/hello 怎么访问。
注 url-pattern 在web.xml中定义
(1)集成tomcat
倒三角中的配置服务器
选择解压后的tomcat文件夹
有可能启动失败就去看看是不是已经启动了。
netstat -a 看到有8080端口在监听。shutdown了就可以启动了
myeclipse会帮我们编译代码,创建文件夹class
但是我们要修改下web.xml文件
然后部署,完成后会自动帮我们在tomcat文件夹创建文件夹和创建文件,编译文件
然后访问 http://local:8080/项目名/hello
文字描述::
1、浏览器依据ip,port建立连接。
2、浏览器年将相关数据(比如请求参数)打包,然后发送请求
3、容器解析请求数据包,并且将解析得到的数据封装到requset对象,并且同时创建一个response对象。
4、容器创建servlet对象,调用该对象的service方法
注:容器会将request和response作为参数传递进来,可以通过
request获得请求参数,也可以将处理结果写到response。
5、容器读取response中的处理结果,然后将处理结果打包发送给浏览器。
6、浏览器解析响应数据包,生成相应的页面。
(1)404
注:404是一个状态码(是一个三位数字,由w3c定义,表示服务器处理请求的一种状态)
1)含义
服务器依据请求地址找不到相应的资源
2)产生的原因
a.没有部署该应用
b.
不一致(我就出错在这了)
c、请求地址写错
按照 http://ip:port/appname/url-pattern 检查请求地址
(2)500
1)含义:系统出错
2)产生的原因 程序在运行过程中出错。
a.没有继承HttpServlet
b.写错
c.程序代码写的不够严谨,比如对请求参数没有做检查就做一些转换。
web/hello?qty=100;问号表示后面是请求参数,qty是请求参数名,100是请求参数值
public class HelloServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
//读取请求参数值
String qty = request.getParameter("qty");
//处理
String greeting ="";
for(int i=0;i"hello Recar!
";
}
//设置服务器返回的数据类型
response.setContentType("text/html");
//获得一个输出流,把内容发送给浏览器
PrintWriter out = response.getWriter();
out.println(greeting);
out.close();
}
}
但是并没有考虑传入的值就会
所以,应该检查传入的参数是不是一个合法的
(3)405
1)含义:找不到处理方法。
2)产生的原因 service方法不规范
web.xml
<web-app version="2.5"
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">
<servlet>
<servlet-name>helloServletservlet-name>
<servlet-class>web.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>helloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
HelloServlet
package web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
//读取请求参数值
String qty = request.getParameter("qty");
//处理
String greeting ="";
for(int i=0;i"hello Recar!
";
}
//设置服务器返回的数据类型
response.setContentType("text/html");
//获得一个输出流,把内容发送给浏览器
PrintWriter out = response.getWriter();
out.println(greeting);
out.close();
}
}
DateDemo
package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DateDemo extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{
Date date = new Date();
String dateform ="yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf =new SimpleDateFormat(dateform);
String dater = sdf.format(date);
//设置服务器返回的数据类型
response.setContentType("text/html");
//获得一个输出流,把内容发送给浏览器
PrintWriter pw = response.getWriter();
pw.println("date:"+dater);
pw.close();
}
}
他的web.xml
<web-app version="2.5"
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">
<servlet>
<servlet-name>datedemoservlet-name>
<servlet-class>web.DateDemoservlet-class>
servlet>
<servlet-mapping>
<servlet-name>datedemoservlet-name>
<url-pattern>/dateurl-pattern>
servlet-mapping>
web-app>
问题,不能输出中文~。应该是编码的问题~