什么是Servlet?
Servlet: Server applet : 服务端的小程序.Servlet就是服务端一个用于接收客户端的请求和向客户端做出响应的程序。
Servlet 是运行在 Web 服务器或应用服务器上的 java 程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,您可以收集来自网页表单的用户数据,呈现来自数据库或者其他源的记录,还可以动态创建网页。
在实际工作中,Servlet的概念,分为狭义和广义的.
狭义的Servlet是一个小程序.
广义的servlet其实是一个Java类,是一个实现了Servlet接口的类.
Servlet的作用?
Servlet 执行以下主要任务:
- 读取客户端信息(传递的信息,请求头信息).(获取客户端数据)
- 处理信息.(处理数据)
- 响应数据.(返回数据: 业务数据,响应头信息).
如何实现Servlet:
Servlet: Java类,是一个实现了Servlet的类.
-
创建一个类
-
实现Servlet接口
package com.sxt.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class ServletDemo01 extends HttpServlet {
private static final long serialVersionUID = -2597540888550505998L;
@Override
public void init() throws ServletException {
System.out.println("====init====");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("====service====");
// 读取谁的?
}
@Override
public void destroy() {
System.out.println("====destroy====");
}
}
-
注册Servlet
-
配置Servlet 提供访问方式
<!-- 注册Servlet -->
<servlet>
<!-- servlet别名 -->
<servlet-name>ergou</servlet-name>
<!-- Servlet类的全路径 -->
<servlet-class>com.sxt.controller.ServletDemo01</servlet-class>
</servlet>
<!-- 配置Servlet 提供访问方式 -->
<servlet-mapping>
<!-- servlet别名 -->
<servlet-name>ergou</servlet-name>
<!-- servlet的访问地址 -->
<url-pattern>/ergou.html</url-pattern>
</servlet-mapping>
Servlet生命周期
在Servlet中,Servlet是单例模式的.每个Servlet类,有且只有一个对象.
init方法,默认会在第一次访问时执行,且只执行一次,一般用于初始化Servlet信息.
detory方法,默认会在服务器停止时执行,且只执行一次,用于销毁Servlet对象.
service方法,默认会在每次有访问请求时执行,每次请求都会执行.用于处理请求.
init----> service ----> detory 这就是Servlet生命周期.
注意:
Servlet是单例的,所以Servlet是非线程安全的.一般在使用Servlet时,不建议定义成员变量.
Servlet执行流程
Servlet的功能
接收客户端信息:HttpServletRequest
form表单信息
package com.sxt.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestServlet extends HttpServlet {
private static final long serialVersionUID = 4858130557364545084L;
/**
* 当是 get请求时 执行
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
// String userName = req.getParameter("userName");
// String password = req.getParameter("password");
// String selectName = req.getParameter("selectName");
// String[] likes = req.getParameterValues("like");
// String sex = req.getParameter("sex");
// String textName = req.getParameter("textName");
//
// System.out.println("userName: "+userName);
// System.out.println("password: "+password);
// System.out.println("selectName: "+selectName);
// System.out.println("likes: "+Arrays.toString(likes));
// System.out.println("sex: "+sex);
// System.out.println("textName: "+textName);
}
/**
* 当是 post请求时 执行
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("doPost");
String userName = req.getParameter("userName");
String password = req.getParameter("password");
String selectName = req.getParameter("selectName");
String[] likes = req.getParameterValues("like");
String sex = req.getParameter("sex");
String textName = req.getParameter("textName");
System.out.println("userName: "+userName);
System.out.println("password: "+password);
System.out.println("selectName: "+selectName);
System.out.println("likes: "+Arrays.toString(likes));
System.out.println("sex: "+sex);
System.out.println("textName: "+textName);
// 获取所有表单数据的 name值
Enumeration<String> parameterNames = req.getParameterNames();
//遍历所有的name值
while(parameterNames.hasMoreElements()) {
System.out.println("name值:"+parameterNames.nextElement());
}
System.out.println("==========================");
//将 所有的请求参数 封装成一个Map 集合
Map<String, String[]> parameterMap = req.getParameterMap();
//获取所有的key
Set<String> names = parameterMap.keySet();
for (String name : names) {
System.out.println(name +":"+Arrays.toString(parameterMap.get(name)));
}
Map<String, Object> paramMap = paramMap(parameterMap);
System.out.println("转化后的:"+paramMap);
}
/**
* 将存储封装一个map
* @return
*/
public Map<String,Object> paramMap(Map<String, String[]> parameterMap){
Map<String,Object> map = new HashMap<String, Object>();
//获取所有的key
Set<String> keys = parameterMap.keySet();
for (String key : keys) {
String[] values = parameterMap.get(key);
Object value = null;
if(values != null &&values.length == 1 && values[0] != "") {
value = values[0];
}else if(values != null && values.length > 1) {
List<String> data = new ArrayList<String>();
for (String v : values) {
data.add(v);
}
value = data;
}
map.put(key,value);
}
return map;
}
}
获取作用域信息
package com.sxt.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AttributeServlet extends HttpServlet {
private static final long serialVersionUID = 4858130557364545084L;
/**
* 当是 get请求时 执行
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
//getAttribute(name值) : 根据name值从 request 作用域中 获取对应值
//getAttributeNames() : 获取作用域中,所有属性名称
//setAttribute(name,value) : 设置request作用域中的属性值
// 设置属性值
req.setAttribute("key1", "value1");
req.setAttribute("key2", "value2");
req.setAttribute("key3", "value3");
System.out.println(""+req.getAttribute("key1"));
Enumeration<String> attributeNames = req.getAttributeNames();
while(attributeNames.hasMoreElements()) {
System.out.println(attributeNames.nextElement());
}
}
/**
* 当是 post请求时 执行
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
获取其他作用域对象
package com.sxt.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ScopeServlet extends HttpServlet {
private static final long serialVersionUID = 4858130557364545084L;
/**
* 当是 get请求时 执行
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
//获取其他作用域
//获取session作用域
HttpSession session = req.getSession();
session.setAttribute("sessionKey", "sessionValue");
// 获取 application 作用域
ServletContext application = req.getServletContext();
application.setAttribute("applicationKey", "applicationValue");
}
/**
* 当是 post请求时 执行
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
获取网络请求信息
package com.sxt.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class HttpInfoServlet extends HttpServlet {
private static final long serialVersionUID = 4858130557364545084L;
/**
* 当是 get请求时 执行
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求的方法 : get post
String method = req.getMethod();
System.out.println(method);
// 获取请求的资源路径
String uri = req.getRequestURI();
System.out.println(uri);
// 获取请求URL地址 http://127.0.0.1:8080/sxt/servlet.do
String url = req.getRequestURL().toString();
System.out.println(url);
// 请求端口
int remotePort = req.getRemotePort(); //客户端端口
System.out.println(remotePort);
int localPort = req.getLocalPort(); //服务器本地端口
System.out.println(localPort);
String remoteHost = req.getRemoteHost(); //客户端IP
String localAddr = req.getLocalAddr(); // 服务器IP
System.out.println("remoteHost:"+remoteHost);
System.out.println("localAddr:"+localAddr);
//设置请求的编码
req.setCharacterEncoding("UTF-8");
//获取请求头信息 : Map : key -- value
String language = req.getHeader("Accept-Language");
System.out.println(language);
}
/**
* 当是 post请求时 执行
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
重定向和内部转发
//resp.sendRedirect("地址"); 重定向
resp.sendRedirect("scope.jsp");
// 内部转发 req.getRequestDispatcher("scope.jsp").forward(req, resp);
req.getRequestDispatcher("scope.jsp").forward(req, resp);
获取文件信息
req.getPart("name") : 根据name值,获取对应part数据
向客户端响应数据:HttpServletResponse
package com.sxt.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseServlet extends HttpServlet{
private static final long serialVersionUID = -2958733507466419241L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取打印流
//resp.getWriter();
// 获取输出流
resp.getOutputStream();
// 设置 cookie
resp.addCookie(new Cookie("name","value"));
//设置编码
resp.setCharacterEncoding("UTF-8");
//设置响应头信息
resp.addHeader("token", "xxxxx");
}
}
MVC模型:
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的
是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别
用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
Model(模型)表示应用程序核心(比如数据库记录列表)(数据模型)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入输出(写入数据库记录)。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制 .
Model: 是应用程序中用于处理应用程序数据逻辑的部分.
数据逻辑部分:数据校验,数据的持久化相关处理.
View(视图) :是应用程序中处理数据的部分.
处理数据:显示数据,输入数据.(界面)
Controller(控制器) :是应用程序中处理用户交互的部分.
交互:交流互动.输入输出.用于接收客户发送的信息,向客户端做出响应.
而在JavaWeb开发中,利用各种技术优点和缺点.一般使用:
Servlet 充当控制层.
JSP 充当视图层
Model 相关Java代码.
MVC模型三层关系
MVC模型的优点
- 降低了程序耦合性
- 提高了代码的复用性
- 提高了程序的可维护性
- 提高了程序的可读性
- 提高了扩展性
- 提高了开发效率
但是,提高了程序结构的复杂性.
随着开发的发展,从MVC模型,演变:
MVP:移动端
MVVM:vue.js
Servlet总结
概念:
Server Applet.在服务器上运行的一个小程序.用于接收客户端的数据且可以向客户端做出响应的小程序.Servlet有狭义和广义之分:
狭义上:Servlet小程序
广义上:在Java中,实现了Servlet接口.注册 配置
生命周期:
init 初始化 执行1次
service 提供服务 执行N次
destory 销毁 执行1次
Servlet是单例,非线程安全 ,不要定义成员变量。