Servlet(Server Applet) 详解
Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。
Servlet的工作模式
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
Servlet 的工作原理
Servlet接口定义了Servlet与servlet容器之间的契约:
Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。
在一个应用程序中,每种Servlet类型只能有一个实例。
ServletRequest对象和ServletResponse对象:
ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,
并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletContext对象:
这个对象中封装了上下文(应用程序)的环境详情,可以共享应用程序的信息。。
每个应用程序只有一个ServletContext。
ServletConfig对象:
配置信息
web.xml的配置文件:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.LoginServlet</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>location</param-name>
<param-value>aaa</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
转发:request.getRequestDispatcher("/welcome.jsp").forward(request,response);
重定向:response.sendRedirect("/welcome.jsp");
二者区别:
转发不会改变地址栏中的URL,而重定向则会改变
转发只能访问到当前web应用中的内容,而重定向则可以访问到任意web应用中的内容
转发后,在转发后的页面中仍然可以使用原来的request对象,而重定向,原来的request对象则失去作用
Servlet接口
package javax.servlet;
public interface Servlet {
/**
* 当Servlet第一次被请求时,Servlet容器就会调用这个方法(传入ServletConfig对象),
* 从而对Servlet对象进行初始化。但是这个方法在后续请求中不会在被Servlet容器调用
*/
void init(ServletConfig var1) throws ServletException;
//返回由Servlet容器传给init()方法的ServletConfig对象
ServletConfig getServletConfig();
/**
* 每当请求Servlet时,Servlet容器就会调用这个方法。
*/
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
/**
* 当要销毁Servlet时,Servlet容器就会调用这个方法。
*/
void destroy();
}
ServletConfig接口:
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration getInitParameterNames();
}
GenericServlet抽象类:
GenericServlet实现了Servlet和ServletConfig接口,为Servlet接口中的所有方法提供了默认的实现
HttpServlet抽象类
HttpServlet在实现Servlet接口时,覆写了service方法:
该方法体内的代码会自动判断用户的请求方式:
如为GET请求,则调用doGet方法。
如为Post请求,则调用doPost方法。
因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
package javax.servlet.http;
public abstract class HttpServlet extends GenericServlet implements Serializable {
public HttpServlet() {
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_put_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_delete_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String CRLF = "\r\n";
String responseString = "TRACE " + req.getRequestURI() + " " + req.getProtocol();
String headerName;
for(Enumeration reqHeaderEnum = req.getHeaderNames();
reqHeaderEnum.hasMoreElements();
responseString = responseString + CRLF + headerName + ": " + req.getHeader(headerName)) {
headerName = (String)reqHeaderEnum.nextElement();
}
responseString = responseString + CRLF;
int responseLength = responseString.length();
resp.setContentType("message/http");
resp.setContentLength(responseLength);
ServletOutputStream out = resp.getOutputStream();
out.print(responseString);
out.close();
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
}

HttpServletRequest接口
HttpServletRequest表示Http环境中的Servlet请求:
String getContextPath(); //项目(应用)名(当前应用的根目录)
Cookie[] getCookies(); //返回一个cookie对象数组
String getHeader(String var1); //返回指定HTTP请求头的值
String getMethod(); //返回客户端的请求方式
String getQueryString(); //Get请求提交url地址后的参数字符串
HttpSession getSession(); //返回与这个请求相关的会话对象
String getRequestURI() // app/login.jsp
StringBuffer getRequestURL() // http://localhost:8080/app/login.jsp
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()
乱码解决:
Get:
String name = request.getParameter("name"); //接收数据
name =new String(name.getBytes("ISO8859-1"), "UTF-8")
Post:
request.setCharacterEncoding("UTF-8");

HttpServletResponse接口
void addCookie(Cookie var1); //给这个响应添加一个cookie
void addHeader(String var1, String var2); //给这个请求添加一个响应头
setHeader(String name, String value)
void sendRedirect(String var1) throws IOException; //重定向
void setStatus(int var1); //设置响应行的状态码
PrintWriter getWriter():
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,
随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
ServletOutputStream getOutputStream():
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。
乱码解决:
response.setContentType("text/html;charset=UTF-8");
示例
@WebServlet("/addServlet") //该注解等价于在web.xml中配置的该servlet的<servlet-mapping>元素中的<url-pattern>
public class AddServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); //处理乱码
Map<String, String[]> parameterMap = request.getParameterMap(); //获取参数
User user = new User();
try {
BeanUtils.populate(user, parameterMap); //封装参数
} catch (Exception e) {
e.printStackTrace();
}
ServiceImpl service = new ServiceImpl(); //转发到service处理
service.addUser(user);
//response.setContentType("application/json;charset=utf-8");
//response.getWriter().write("添加成功!");
response.sendRedirect(request.getContextPath() + "/findUserServletByPage"); //重定向
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
private List<String> words = new ArrayList<>();
public void init(FilterConfig config) {
String realPath = config.getServletContext().getRealPath("/WEB-INF/classes/敏感词汇.txt");
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(realPath), Charset.forName("utf-8")));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
words.add(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//创建代理对象
ServletRequest getParameter = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("getParameterMap")) {
//增强该方法
Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);
//处理参数列表中的敏感词汇
. . .
return map;
}
return method.invoke(req, args);
}
});
chain.doFilter(getParameter, resp);
}
public void destroy() {
}
}
Servlet(Server Applet) 详解的更多相关文章
- Tomcat配置(二):tomcat配置文件server.xml详解和部署简介
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Tomcat(二):tomcat配置文件server.xml详解和部署简介
Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务 ...
- zabbix server安装详解
简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以 ...
- 安装Cloudera manager Server步骤详解
安装Cloudera manager Server步骤详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是针对:https://www.cnblogs.com/yin ...
- SQL SERVER分区详解(1-5)
转自: (五)SQL Server分区自动化案例 (四)SQL Server分区管理 (三)索引分区知识详解 (二)SQL Server分区创建过程 (一)SQL Se ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- tomcat配置文件server.xml详解 转载http://blog.csdn.net/yuanxuegui2008/article/details/6056754
元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat 的请求 shutdown 指定向端口发送的命令字符串 service name 指定service 的名字 ...
- Tomcat 配置文件server.xml详解
前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...
- tomcat 配置文件server.xml 详解 Connector Engine Host Context
目录 一 server.xml 1.1 server 配置 1.2 service 配置 1.3 Executor 1.4 Connector 配置 1.5 Engine 其他tocmat 文章 一 ...
- (一)SQL Server分区详解Partition(目录)
一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水 ...
随机推荐
- python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)
SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部 ...
- mysql查询相关
查询事务 SELECT * FROM information_schema.INNODB_TRX\G; 查询正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB ...
- jstl jsp long to date
jsp 页面中使用jstl el 将long转换为时间类型,并格式化输出 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" ...
- Java之有名内部类和匿名内部类
Java内部类 定义在外部类中的类就是内部类:内部类的定义是为了更清楚.详细地描述事物. 有名内部类和匿名内部类 Java语言根据内部类是否有类名将内部类分为有名内部类和匿名内部类(没有类名). 有名 ...
- Http2协议简介
1.概述 和http1兼容.HTTP/2 没有改动 HTTP 的应用语义. HTTP 方法.状态代码.URI 和标头字段等核心概念一如往常. 不过,HTTP/2 修改了数据格式化(分帧)以及在客户端与 ...
- 【操作】Linux快捷键
- sql update语句
如果要更新数据库表中的记录,我们就必须使用UPDATE语句. UPDATE语句的基本语法是: UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; ...
- js-原生js触发器使用
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- NX二次开发-C语言文件读写fwrite和fread函数
NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...
- 四:RF框架appium工具之xpath定位
XPATH定位方法具体的学会,还是在今年1月份,以前运用的都不熟练. 这个定位神器是一定要掌握的,不然有你抓狂的时候. 第一要掌握它的书写格式,这个好上手. 第二要掌握它的具体用法.这个就要多练习了, ...