Servlet的概念和特点
Servlet简介:
实现了特殊接口的java类。此类tomcat服务器是认识的。
是一种服务器端编程技术。
由支持Servlet的Web服务器调用和启动运行
一个Servlet负责对应的一个或者一组URL访问请求,并返回相应的响应内容。
特点:
Servlet由程序员创建,但是由服务器调用执行。
总结:
1、Servlet其实就是一个服务器可以识别的java类
2、我们需要将业务逻辑处理规则放入Servlet中
3、然后将Servlet放入Tomcat服务器中
4、服务器根据请求调用对应的Servlet处理
5、Servlet可以称为后台处理程序的入口
动态网页
以数据库技术为基础
不是独立存在于服务器上的网页文件
B/S和C/S架构
C/S:
client/server:客户机和服务器架构
B/S:
Browser/server:浏览器和服务器架构
C/S和B/S架构比较
|
服务器负荷 |
维护升级成本 |
B/S |
重 |
低 |
C/S |
轻 |
高 |
Servlet运行过程
浏览器发送请求到服务器
服务器根据请求的url,去调用相应的serlvet类。
通过servlet中的打印流对象将生成的HTML数据输出给服务器。
服务器将servlet生成的数据再输出给客户端浏览器
第一个Web项目
新建web项目
new Web Project
建包
com.xjion.action
新建class:HelloServlet
继承:HttpServlet(javax.servlet.HttpServlet)
重写service方法(两个service方法中带HttpServletRequest、HttpServletResponse参数的)
package com.xjion.action;
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 HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello,girl!!!!");
}
}
在web.xml配置写好的servlet
访问一个servlet程序的过程:
浏览器发送一个URL
服务器根据收到的url,调用相应的servlet程序
配置Servlet的两个作用:
让服务器知道这个Servlet类的存在
让URL和Servlet匹配,从而来了新的请求方法
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.cssxt.xjion.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
servlet-name需要保持一致,需要映射
url-pattern必须以/开头,除了*开头
安装和启动tomcat服务器
将TOMCAT压缩包解压。
设置环境变量: JAVA_HOME: C:\Program Files\Java\jdk1.5.0_11
进入TOMCAT子目录bin,点击:startup.bat,启动tomcat.
访问:http://localhost:8080/
如果出现tomcat主页,则安装成功。
手动发布项目:
在tomcat子目录:webapps中新建一个文件夹:gg
将web项目的WebRoot目录中所有的内容copy到gg中.
重启tomcat
访问刚刚写好的Servlet:
http://localhost:8080/gg/one
http://127.0.0.1:8080/gg/one
http://自己机器的ip:8080/gg/one
Myeclipse中集成tomcat
进入配置选项(windowpreferencemyeclipseapplication serverstomcattomcat6)
在Myeclipse中自动发布web项目
Tomcat目录结构
/bin 存放tomcat命令
shutdown和startup负责启动和关闭服务器
修改catalina可以设置tomcat的内存
/conf 负责管理配置文件,常用的有web.xml和server.xml
server.xml可以设置端口号、域名或IP、默认加载的项目、请求编码
web.xml可以设置tomcat支持的文件类型
context.xml可以用来配置数据源之类的
tomcat-users.xml用来配置管理tomcat的用户与权限
在Catalina目录下可以设置默认加载的项目
/lib 存放tomcat运行需要加载的jar包
/logs 存放在运行过程中产生的日志文件,非常重要的是在控制台输出的日志
/temp 用来存放tomcat在运行过程中产生的临时文件
/webapps 用来存放应用程序,当tomcat启动时会去加载webapps目录下的应用程序
/work 用来存放tomcat在运行时编译生成的class和java文件
清空work目录,然后重启tomcat可以清除缓存
发布web项目的两种常用方式
发布按钮(或者说,通过将项目内容copy到tomcat/webapps/目录下)
发布:直接点击"发布按钮"将开发项目发布到tomcat目录webapps/下面
访问:项目名+<url-pattern>
server.xml(该文件描述了tomcat如何启动服务,即启动时如何加载相关组件)
发布:在server.xml中<Host>下面增加一个<Context>元素:
<Context path="/ab" docBase="D:\workspace3066\java310\WebRoot" reloadable="true" />
访问:path属性+<url-pattern>
Servlet配置详解
<url-pattern>的问题
必须以/开头(不然,启动 是会报错:invalid url-pattern ** in servlet mapping)
常见的url 的模式:
<url-pattern>/one/*</url-pattern>匹配所有one下面的请求
<url-pattern>/one</url-pattern>匹配one请求
<url-pattern>*.one </url-pattern>匹配所有.one结尾的请求
错误写法:<url-pattern>/yi/*.one</url-pattern>
一个<servlet>可以对应多个<servlet-mapping>,即多个url可以对应一个serlvet
分析:
tomcat启动报错,一般情况都是项目的配置文件出错,可以通过查找case by 语句得到相关信息。
Servlet的生命周期
结论:
从第一次被调用到服务器关闭
验证:
init方法:servlet被初始化创建的时候调用
service方法:处理请求的时候
destory方法:servlet被销毁的时候。
当服务器关闭的时候销毁servlet,触发destroy方法的执行
注意:
我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。
生命周期就变为从服务器开启到服务器关闭。
package com.xjion.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("我被初始化了");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我被执行了");
}
@Override
public void destroy() {
System.out.println("我被销毁了");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<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_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>se</servlet-name>
<servlet-class>com.xjion.action.Servlet</servlet-class>
<load-on-startup>1</load-on-startup> <!--配置servlet服务器启动时完成加载和初始化创建-->
</servlet>
<servlet-mapping>
<servlet-name>se</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
doGet,doPost,service,init,destory方法的区别
doGet
处理doGet的请求
doPost
处理doPost的请求
service
无论什么请求方式服务器都会优先执行service方法
执行顺序:
servlet(公共的)
httpServlet(受保护的)
init
当servlet对象被初始化之后会调用init方法
destroy
当servlet对象在销毁之前会调用destroy方法
注意
servlet中没有声明service方法,会根据请求方式调用对应的方法进行请求处理,如果在servlet中没有声明对应的请求处理方法,则会报405错误。
tomcat服务器其实只认识service方法,如果我们自己声明的servlet中没有覆写service方法,则会执行HttpServlet中的sercice方法,而该方法会根据请求方法调用对应的doXX()方法执行请求处理
package com.xjion.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeServlet extends HttpServlet{
/**
* 当servlet对象在销毁之前会调用destroy方法
*/
@Override
public void destroy() {
System.out.println("servlet销毁了");
}
/**
* 当servlet对象被初始化之后会调用init方法
*/
@Override
public void init() throws ServletException {
System.out.println("servlet初始化了");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("受保护的service方法");
super.service(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet方法...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost方法...");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("公共的service方法 ");
super.service(req, res);
}
}
Servlet的常见错误总结:
Servlet的常见错误:
404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
错误一:java.lang.ClassNotFoundException
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:因为service方法体的代码执行错误导致。
解决:根据错误提示对service方法体中的代码进行错误更改
405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要在service方法中调用父类的service.
request对象
package com.xjion.action;
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 RequestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
testRequestLine(request);
testRequestHeader(request);
testRequestNetMsg(request);
}
/**
* 测试请求行信息
*/
public void testRequestLine(HttpServletRequest request){
//获取请求方式
String method=request.getMethod();
System.out.println("method:"+method);
//获取?之前端口号之后
String uri=request.getRequestURI();
System.out.println("uri:"+uri);
//获取?之前所有
String url=request.getRequestURL().toString();
System.out.println("url:"+url);
//获取?之后内容
String queryString=request.getQueryString();
System.out.println("queryString:"+queryString);
//获取协议名
String scheme=request.getScheme();
System.out.println("scheme:"+scheme);
//获取根目录
//注意: 结果是 /根目录名
String contextPath=request.getContextPath();
System.out.println("contextPath:"+contextPath);
}
/**
* 测试请求的头信息获取
*/
public void testRequestHeader(HttpServletRequest request){
//request.getHeader(键名)
//不区分大小写
String conn=request.getHeader("Connection");
System.out.println("conn:"+conn);
String acceptLanguage=request.getHeader("ACCEPT-language");
System.out.println("acceptLanguage:"+acceptLanguage);
}
/**
* 获取网络信息
*/
public void testRequestNetMsg(HttpServletRequest request){
//获取服务器信息
String addr1=request.getLocalAddr();
int port1=request.getLocalPort();
System.out.println("服务器ip地址:"+addr1);
System.out.println("服务器端口号:"+port1);
//获取客户端信息
String addr2=request.getRemoteAddr();
int port2=request.getRemotePort();
System.out.println("客户端ip地址:"+addr2);
System.out.println("客户端端口号:"+port2);
}
}
package com.cdsxt.action;
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 RequestServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
/**
* 获取表单参数
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取单键单值的表单参数
//request.getParameter(键名)
//注意:
//如果获取的是一个连键都没有的值,则结果是null,获取一个只有键没有值则结果是空字符串。
String a=request.getParameter("a");
String b=request.getParameter("b");
String name=request.getParameter("name");
System.out.println(a+"----"+b+"----"+name);
}
}
response对象
package com.xjion.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* resp对象之处理响应学习
* 设置响应行:协议 状态码 状态消息
* resp.sendError(int status);
* 作用:可以自主的响应状态给浏览器
* 设置响应头:
* addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
* setHeader(String name,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息
* 设置响应实体(处理结果):
* resp.getWriter().write("实体内容")
* 注意:
* 实体内容可以分开进行响应。
* 注意:
* 一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关的req对象和resp对象销毁。
*/
@WebServlet(name = "ResponseServlet")
public class ResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求数据
//处理请求数据
//响应处理结果
//设置响应行
//自定义响应404异常
//resp.sendError(404);
//设置响应头
//添加响应头信息
resp.addHeader("mouse","thinkpad");
resp.addHeader("mouse","thinkpad2");
//设置响应头
resp.setHeader("mouse","two fly birds");
//设置响应实体
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
}
}