关于servelt的相关介绍
1.@WebServlet注解的作用
在Servlet 3.0中,使用@WebServlet注解可实现servlet和url的映射,它告知容器哪些Servlet会提供服务以及额外信息,其作用相当于之前在web.xml中设置的servlet配置。
以下两种方法二选一:
a.一种使用注解
@WebServlet{helloUser}
public class helloUser extends HttpServlet{
}
只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息。上面的@WebServlet告诉容器,如果请求的URL是“/helloUser”,则由helloUser的实例提供服务。
可以使用@WebServlet提供更多信息。

@WebServlet(
name="Hello",
urlPatterns={"/hello.view"},
loadOnStartup=1
)
public class HelloServlet extends HttpServlet {
上面的@WebServlet告知容器,HelloServlet这个Servlet的名称是Hello,这是由name属性指定的,而如果客户端请求的URL是/hello.view,则由具Hello名称的Servlet来处理,这是由urlPatterns属性来指定的。在Java EE相关应用程序中使用标注时,可以记得的是,没有设置的属性通常会有默认值。例如,若没有设置@WebServlet的name属性,默认值会是Servlet的类完整名称。
当应用程序启动后,事实上并没有创建所有的Servlet实例。容器会在首次请求需要某个Servlet服务时,才将对应的Servlet类实例化、进行初始化操作,然后再处理请求。这意味着第一次请求该Servlet的客户端,必须等待Servlet类实例化、进行初始动作所必须花费的时间,才真正得到请求的处理。
如果希望应用程序启动时,就先将Servlet类载入、实例化并做好初始化动作,则可以使用loadOnStartup设置。设置大于0的值(默认值为-1),表示启动应用程序后就要初始化Servlet(而不是实例化几个Servlet)。数字代表了Servlet的初始顺序,容器必须保证有较小数字的Servlet先初始化,在使用标注的情况下,如果有多个Servlet在设置loadOnStartup时使用了相同的数字,则容器实现厂商可以自行决定要如何载入哪个Servlet。
b.使用web.xml配置方式
<servlet>
<servlet-name>helloUser</servlet-name>
<servlet-class>com.servlet.HelloUser</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloUser</servlet-name>
<url-pattern>/helloUser</url-pattern>
</servlet-mapping>
2.多个请求访问同一个servlet
在我们刚开始编写java web程序时,可能会一个jsp页面功能对应一个服务器的servlet。例如对我们的客户表(Customer)实行增删改查时,每个操作对一个servlet。这样的话,不仅使得代码量很大,而且会使得代码不好管理。那我们想到的是,怎么实现JSP页面的多个请求对应一个servlet呢?通过一个servlet完成增删改查等多个功能呢?
例如我的jsp页面中查询数据库中的表customer时,展现的如下图所示
我们需要实现的是在输入框中输入要查找的名字或者地址或者电话时,可以实现模糊查询,点击submit时,可以在当前页面下面显示查询的数据结果,例如输入数据库中有的用户名rose
再点击submit,页面呈现
当点击upadate和Delete,可是实现对用户的信息修改和删除功能。在我们刚开始的学习中,会将这些功能都分别对应一个servlet,现在实现的就是这些功能都对应一个servlet。
第一:我们可以在jsp页面中对from中的action统一格式为,都以.do结尾。
<form action="query.do" method="post">
<td><a href="addCustomer.jsp">Add a new customer</a></td>
<td><a href="edit.do?id=<%=customer.getId() %>">Update</a></td>
<td><a href="delete.do?id=<%=customer.getId() %>">Delete</a></td>
</form>
那么在我们的一个名为CustomerServlet的web.xml配置文件中可以改写为
1 <servlet>
2 <servlet-name>CustomerServlet</servlet-name>
3 <servlet-class>com.servlet.CustomerServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6 <servlet-name>CustomerServlet</servlet-name>
7 <url-pattern>*.do</url-pattern>
8 </servlet-mapping>
那么只要页面中以.do结尾的action在提交后,都会去寻找CustomerServlet。那么我们在CustomerServlet中怎么辨别每一个不同的action呢?我们的做法如下:我们在CustomerServlet中的doGet方法中实现
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取servletpath
String servletPath = request.getServletPath();
//去除路径后缀名中的.do
String methodName = servletPath.substring(1);
methodName = methodName.substring(0, methodName.length()-3);
try {
//利用反射获取methodName 对应的方法
Method method = getClass().getDeclaredMethod(methodName,
HttpServletRequest.class,
HttpServletResponse.class);
//利用反射调用相应的方法
method.invoke(this, request, response);
} catch (Exception e) {
response.sendRedirect("error.jsp");
}
}
这样实现可以根据页面的不同请求,截掉.do,得到不同请求名。但注意的是必须页面中的请求名和seevlet中各实现功能的方法名相同。如页面中是delete.do,那么我们的servlet中的方法名就应该写成delete,这样才能该请求获取相应的功能。
3.继承httpservlet实现service/doget/dopost之间的关系
如下图,service方法中判断请求(request)的方式(getMethod()),若返回“GET”则调用doGet方法,返回"POST"则调用doPost方法,若为其他put/delete等方法,则调用相应的方法。即service负责根据请求调度其它方法。

浏览器访问Servlet过程示意图

Servlet主要作用就是处理客户端请求和响应。浏览器每一次请求Servlet,服务器Tomcat在调用Service()方法之前,都会创建两个对象,分别是HttpServletRequest对象和HttpServletResponse对象。HttpServletResponse的作用:封装HTTP响应消息。
HttpServletRequest对象:
a.作用:
封装HTTP请求消息
获取请求头、请求行、请求消息体
b.获取请求行的一些方法
String getMethod():获取HTTP请求消息的请求方式。
String getRequestURI():获取URL的主机和端口号之后,参数部分之前的部分。
String getQueryString():获取资源路径以后的所有内容。
String getProtacol():获取请求行的协议名和版本。
String getContextPath():获取web应用程序的路径。
String getServletPath():获取Servlet映射的路径。
String getRemoteAddr():获取客户端的IP地址。
String getRemoteHost():获取完整主机名。
String getLocalName():获取web服务器上接收当前网络连接IP对应的主机名。
String getLocalAddr():获取web服务器上接收当前网络连接IP地址。
String getServletName():获取当前请求 所指向的主机名。
int getServletPort():获取当前请求所连接的服务器端口号。
String getScheme():获取请求协议名。
StringBuffere getRequestURL():获取客户端发出请求的完整URL.
c.输出结果 :

d.HttpServletRequest获取请求消息头的一些方法
String getHeader(String name):获取指定头字段值
Emumeration getHeaders(String name):获取Emumeration集合
Emumeration getHeaderNames():获取一个包含所有请求头字段的Emumeration
int getIntHeader(String name):获取指定名称的头字段。
long getDateHeader(String name):获取指定头字段的值。
String getContentType():获取Content-type头字段值。
int getContentLength():获取Content-Type头字段的值。
String getCharacterEncoding():获取编码。
HttpServletResponse对象
a.作用 :
封装HTTP响应消息(响应状态行、响应消息头、响应消息体)
b.发送状态码的一些方法
setStatus(int status):设置HTTP消息响应的状态码,并生成消息的相应行。
sendError(int sc):发送表示错误消息的状态码。
c.发送响应消息头的一些方法
void addHeader(String name,String value)
void setHeader(String name,String value):设置HTTP协议响应头字段。
void addIntHeader(String name,int value):
void setIntHeader(String name,int value):设置包含整数值得消息头
void setContentType(String type):设置Servlet输出内容的MIME类型
void setContentLength(int len):设置响应消息体的内容大小,单位为字节。
void setLocale(locale loc):设置响应消息体的本地化消息。
void setCharacterEncoding(String charset):设置输出内容使用的编码。
d.发送响应消息的一些方法
Servlet中的数据要呈现到浏览器界面,需要通过IO流来实现
getOutputStream():直接输出字节数组中的二进制数据。(ServletOutputStream)
getWriter():输出的内容全部为字符文本的网页文档。(PrintWriter)
4.ServletContext.getRealPath()
ServletContext.getRealPath() 是从当前servlet 在tomcat 中的存放文件夹开始计算起的
比如,有个servlet 叫 UploadServlet,它部署在tomcat 下面以后的绝对路径如下:
"C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"
那么,
ServletContext.getRealPath("/") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet"
ServletContext.getRealPath("/attachment") 返回 "C:\Program Files\apache-tomcat-8.0.3\webapps\UploadServlet\attachment"
ServletContext.getRealPath("attachment") 会导致NullPointerException
结论就是:
在使用ServletContext.getRealPath() 时,传入的参数是从 当前servlet 部署在tomcat中的文件夹算起的相对路径,要以"/" 开头,否则会找不到路径,导致NullPointerException
测试如下:
System.out.println("request.getServletContext().getRealPath(\"/\")+\"WEB-INF\":"+request.getServletContext().getRealPath("/")+"WEB-INF");
System.out.println("request.getServletContext().getRealPath(\"/\")+\"WEB-INF\\\\web.xml\"):"+request.getServletContext().getRealPath("/")+"WEB-INF\\web.xml");
System.out.println("request.getServletContext().getRealPath(\"/index.html\"):"+request.getServletContext().getRealPath("/index.html"));
4.System.out.println("request.getServletContext().getRealPath(\"index.html\"):"+request.getServletContext().getRealPath("index.html"));
5. System.out.println("request.getServletContext().getRealPath(\"/\"):"+request.getServletContext().getRealPath("/"));
结果如下:
request.getServletContext().getRealPath("/")+"WEB-INF":G:\gitrepository\Spring_MVC_071-master\target\SpringMVC71-0.0.1-SNAPSHOT\WEB-INF
request.getServletContext().getRealPath("/")+"WEB-INF\\web.xml"):G:\gitrepository\Spring_MVC_071-master\target\SpringMVC71-0.0.1-SNAPSHOT\WEB-INF\web.xml
request.getServletContext().getRealPath("/index.html"):G:\gitrepository\Spring_MVC_071-master\target\SpringMVC71-0.0.1-SNAPSHOT\index.html
4 request.getServletContext().getRealPath("index.html"):null
request.getServletContext().getRealPath("/"):G:\gitrepository\Spring_MVC_071-master\target\SpringMVC71-0.0.1-SNAPSHOT\
5.解决中文输出乱码问题
方法一:
response.setContentType("text/html,charser=utf-8");
方法二:
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type","text/html;charset=utf-8")
参考网址
https://my.oschina.net/zjllovecode/blog/961994
https://blog.csdn.net/congmingpig_htt/article/details/50492339
https://blog.csdn.net/sinat_32560085/article/details/70144760
https://blog.csdn.net/weixin_36279318/article/details/77990402
https://blog.csdn.net/lonely7345/article/details/695785
关于servelt的相关介绍的更多相关文章
- ppDelegate的相关介绍
// AppDelegate的相关介绍// IOS笔记 //@interface AppDelegate : UIResponder <UIApplicationDelegate>// ...
- 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输
002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...
- Android HttpClient HttpURLConnection相关介绍
Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- CSS3 Backgrounds相关介绍
CSS3 Backgrounds相关介绍 1.背景图片(background images)是在padding-box的左上角落脚安家的,我们可以使用background-position属性改变默认 ...
- 一 hadoop 相关介绍
hadoop 相关介绍 hadoop的首页有下面这样一段介绍.对hadoop是什么这个问题,做了简要的回答. The Apache™ Hadoop® project develops open-sou ...
- Django day 33 vue中使用element-ui的使用,课程的相关介绍,vue绑定图片,课程列表接口,课程详情页面
一:vue中使用element-ui的使用, 二:课程的相关介绍, 三:vue绑定图片, 四:课程列表接口, 五:课程详情页面
- SONiC项目的发展及其相关介绍(转载)
SONiC作为一个开源项目,理论上是包含了SAI(switch abstraction interface,交换机抽象接口),SAI是没有开源的,厂商自己完成统一的API,提供给上层sonic用户来调 ...
- 转载:Nginx 相关介绍
转载自:https://www.cnblogs.com/wcwnina/p/8728391.html Nginx 相关介绍(Nginx是什么?能干嘛?) Nginx的产生 没有听过Nginx?那么 ...
随机推荐
- linux上安装mysql5.6
CentOS-6.6+MySQL-5.6 部署环境操作系统:CentOS-6.6-x86_64-bin-DVD1.isoMySQL 版本:mysql-5.6.26.tar.gz操作用户:root系统 ...
- 6.1 集合和映射--集合Set->底层基于二叉搜索树实现
前言:在第5章的系列学习中,已经实现了关于二叉搜索树的相关操作,详情查看第5章即可.在本节中着重学习使用底层是我们已经封装好的二叉搜索树相关操作来实现一个基本的集合(set)这种数据结构.集合set的 ...
- Vue stage2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- 关于前段JS代码报错问题的解决方法
最近接手别人的一个项目,项目导入到Myeclipse中,JS代码一直报错,说missing semicolon.该错误是Myeclipse在检查JS代码的过程出现的. 后来经过检查,发现JS代码本身没 ...
- java中对list进行分页显示数据到页面
http://blog.csdn.net/Tang_Mr/article/details/76212184#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2 ...
- Oracle :多表更新多个字段
https://blog.csdn.net/funnyfu0101/article/details/52765235 总体原则:1)更新的时候一定要加where条件,否则必然引起该字段的所有记录更新 ...
- 使用hexo在GitHub上无法上传博客
原以为是秘钥或者其他错误,后来发现是邮箱设置的问题 在GitHub的你账号网页上右上角,个人的登录退出的位置,找到setting: setting->emails->Keep my ema ...
- CSS 背景图像 背景图片定位
背景图片定位 background-position属性可以给背景图片定位. background-position属性有两个值,第一个值是水平位置,第二个值是垂直位置.这两个值可以使用百分比来表示( ...
- 爬虫之进阶 基于twisted实现自制简易scrapy框架(便于对scrapy源码的理解)
1.调度器 class Scheduler(object): """调度器""" def __init__(self, engine): & ...