Servlet 是一种运行在服务器端(一般指的是 Web 服务器)的 Java 应用程序,可以生成动态的Web页面,它是属于客户与服务器响应的中间层。因此,可以说,JSP就是Servlet。两者可以实现同样的页面效果,不过,编写 JSP 和编写 Servlet 相比,前者成本低得多
初次运行,系统会实例化 Servlet
Servlet 采用的是多线程机制,每一次请求,系统就分配一个线程来运行 doGet 函数。但是这样也会带来安全问题,一般说来,不要在 Servlet 内定义成员变量,除非这些成员变量是所有的用户共用的
JSP ——>Java(Servlet)——>JSP
Servlet就是sun公司开发动态web的一门技术
Sun在这些API提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需完成两个小步骤:
把实现了Servlet接口的Java程序叫做:Servlet
Java类必须符合一定的规范:
package com.pudding.servlet;
public class HelloServlet extends HttpServlet {
//由于get和post只是请求实现的不同方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet()方法");
PrintWriter writer = resp.getWriter(); //响应流
writer.println("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//doGet():接受并处理所有get提交方式的请求
//doPost():接受并处理所有post提交方式的请求
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.pudding.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
使用Servlet的条件
要想使用Servlet,必须配置:
WebContent
src
请求——>被web.xml里面的servlet-mapping中的"url-pattern"所拦截,"url-pattern"根据自己的"servlet-name"去匹配——>servlet里面的servlet-name
然后寻找到servlet-class,最后将请求交于该servlet-class的文件
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="WelcomeServlet">WelcomeServlet</a><br>
<form action="WelcomeServlet" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>
WelcomeServlet.java
package servlet;
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 WelcomeServlet extends HttpServlet{
@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...");
//所有的请求都会落到doGet()或者doPost()方法里面
/*
* 如果是get请求就跳到doGet()方法里面
* 如果是post请求就跳到doPost()方法里面
* 一般写项目的时候不管是get还是post我们处理方式应该是一样的
* 所以我们的一般写法如下:
* 不管是get还是post都放到一个里面去处理(get或post)
* */
this.doGet(req, resp);
}
}
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Servlet25Project</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>servlet.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/WelcomeServlet</url-pattern>
</servlet-mapping>
</web-app>
注意事项:必须将jar包放在web目录下面的WEB-INF下面的lib目录下
重写servlet中service方法:处理请求和响应
直接新建Servlet即可!(继承、重写、web.xml 可以借助Eclipse自动生成)
servlet执行流程:
Servlet3.0不需要在web.xml中配置,但需要在Servlet类的定义处之上编写注解(也就是url-pattern的参数值)
请求地址与@WebServlet中的值进行匹配,如果匹配成功,则说明请求的就是该注解所对应的类
项目根目录:WebContent、src(代表所有的构建路径)都是根目录
构建目录:
新建abc一个文件夹,但此时abc文件夹不是一个构建目录
将abc变为构建目录
或者直接新建java的源文件会自动添加到构建路径
项目一般默认一个构建路径src
举例理解:
src构建路径中有一个Servlet.java文件
WebContent目录中直接有一个文件index.jsp:
并且请求<a href="abc">...</a>,则寻找范围:即会在src根目录中寻找,
也会在WebContent根目录中寻找
如果:index.jsp中请求:
<a href="a/abc">...</a>,寻找范围:
先在src或webcontent中找a目录,
然后再在a目录中找abc
重点:/到底代表什么东西
web.xml中的/表示:代表项目根路径
http://localhost:8080/Servlet25Project/WelcomeServlet2
拼接之后为:http://localhost:8080/Servlet25Project/WelcomeServlet2/a/WelcomeServlet2成为请求路径
jsp中的/:代表的是服务器根路径
表示http://localhost:8080/
init()
该方法会在Servlet被加载并实例化的以后 执行
init():默认第一次访问Servlet时会被执行(只执行这一次)
可以修改为tomcat启动时自动执行
Servlet2.5版本:
1:表示web.xml文件里面启动时第一个执行的servlet
Servlet3.0版本:在注解里面加loadOnStartup=1
destroy销毁的时候
service()——>doGet()、doPost()
调用几次,则执行几次
当客户端向 Web 服务器提出第一次 Servlet 请求时,Web 服务器会实例化一个 Servlet,并且调用 init()方法
如果 Web 服务器中已经存在了一个 Servlet 实例,将直接使用此实例;然后调用 service()方法,service()方法将根据客户端的请求方式来决定调用对应的 doXXX()方法
destroy()
该方法被系统回收时执行
关闭tomcat服务时,执行一次
由两个软件包组成:对应于HTTP协议的软件包,对应于除了HTTP协议以外的其他软件包
即Servlet API 可以适用于任何通信协议
我们学习的Servlet‘是位于javax.servlet.http包中的类和接口,是基于HTTP协议
web.xml文件有两种类型的参数设置:
设置全局参数,该参数所有的Servlet都可以访问
设置局部参数,只有相应的Servlet才能访问
设置全局参数,该参数所有的 Servlet 都可以访问
<context-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</context-param>
设置局部参数,该参数只有相应的 Servlet 才能访问
<servlet>
<servlet-name>Servlet 名称</servlet-name>
<servlet-class>Servlet 类路径</servlet-class>
<init-param>
<param-name>参数名</param-name>
<param-value>参数值</param-value>
</init-param>
</servlet>
获取参数的方法:
获取全局参数的方法是:
ServletContext application = this.getServletContext();
application.getInitParameter("参数名称");
获取局部参数的方法是:
this.getInitParameter("参数名称");
Servlet3.0方式 给当前Servlet设置初始值:
@WebServlet(…, initParams={@WebInitParam(name=“servletparaname30”,value=“servletparavalue30”)})
注意,此注解只是隶属于一个具体的Servlet,因此无法为整个web容器设置初始化参数(如果要通过3.0方式设置web容器的初始化参数,仍然需要web.xml中设置)
在doget()方法里面写:
response.setContentType("text/html;charset=gb2312");//设置编码,使得可以打印输出中文字符
PrintWriter out = response.getWriter();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//将 request 参数当成 request 对象使用
//将 response 参数当成 response 对象使用
}
HttpSession session = request.getSession();
//将session当成session对象来使用
ServletContext application = this.get ServletContext();
//将 application 当成 application 对象来使用
需求:
使用servlet+dbutil实现员工数据的查询操作。
步骤:
情况一: 为了解决中文乱码问题,我们经常看到一段代码:request.setCharacterEncoding(“gb2312”); response.setContentType(“text/html;charset=gb2312”); 这是 Servlet 用来设置编码用的,如果 Servlet 的处理方法最前面没有加入这一段代码, 就很可能会出现乱码问题。如果是一个大工程的话,会有很多很多的 Servlet,于是很多人发现在这么多代码中重复设置编码,非常麻烦。而且,一旦需求变了,需要换成另外的编码,对程序员来说将是一件很繁琐的事情
情况二:很多的门户网站都会有登录页面,这是为了业务需求,同时也是为了使用户控制更加的安全。如果客户没有登录就访问网站的某一页面,在很多情况下会引发安全问题。应该如何避免这种情况?传统情况下,可以使用 session 检查来完成,但是在很多页面上都添加 session检查代码,也会比较繁琐
情况三:许多的网站都存在着各种不同的权限,比如,只有管理员才可以对网站的某些数据进行维护和修改,一般的普通用户是无法完成该功能的。登录过后,网页如何区分普通用户与管理员?如果是每一个页面写一个判断用户类型的代码,似乎也非常繁琐
实现一个Filter接口
重写方法:init()、destroy() 他们原理、执行时机和Servlet一样
配置过滤器,类似servlet(配置xml)
通过doFilter()处理拦截,并且通过chain.doFilter(request, response); //进行放行请求和响应
filter映射
<url-pattern>/MyServlet</url-pattern> 只拦截访问MyServlet的请求
<url-pattern>/*</url-pattern>拦截一切请求,每一次访问都会被拦截
dispatcher请求方式:
过滤器中doFilter方法参数:ServletRequest
在Servlet中方法参数:HttpServletRequest
可以配置多个过滤器,过滤器的先后顺序是由<filter-mapping》的位置决定的
四个范围对象:PageContext、request、session、application
主要监听对象:request、session、application
监听以下对象分别对应的类
package listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//实现监听器接口
public class ContextSessionRequestListener implements ServletRequestListener, HttpSessionListener, ServletContextListener{
//监听application(ServletContext)
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听ServletContext,创建ServletContext对象" +sce);
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听ServletContext,销毁ServletContext对象.."+sce);
}
//监听session
public void sessionCreated(HttpSessionEvent se) {
System.out.println("监听HttpSession,创建HttpSession对象..."+se);
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("监听HttpSession,销毁HttpSession对象.."+se);
}
//监听request
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听ServletRequest,创建ServletRequest对象..."+sre);
}
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听ServletRequest,销毁ServletRequest对象.."+sre);
}
}
每个监听器各自提供了两个方法:监听开始、监听结束的方法
ServletContext在Servlet容器启动时自动创建
每个监听器各自提供了三个方法:增加属性、替换属性、删除属性的方法
本地实现 Elasticsearch、kibana 管理工具、IK 分词器 的安装部署以及初步使用(以及填坑策略)
创建一个新的 Office 插件项目:在 Visual Studio 中,选择"文件" -> “新建项目”,然后在模板中选择"Office/SharePoint",选择适当的 Office 插件项目模板,如 Word 插件、Excel 插件或 PowerPoint 插件。设计用户界面:在解决方案资源管理器中,打开你的插件项目,并在其中打开相应的 Office 文件(如 Word 文件、Excel 文件或 PowerPoint 文件)。你可以在 Office 应用中测试插件的功能,并在开发过程中进行调试。
在应用场景方面,便携式IV功率测试仪广泛应用于光伏电站的日常运维、光伏组件生产过程中的质量控制以及光伏项目的前期评估等环节。在光伏电站运维中,定期对光伏组件进行IV测试,可以及时发现性能下降或损坏的组件,为电站的运维提供有力支持。首先,从工作原理来看,光伏电站便携式IV功率测试仪通过模拟太阳光照射光伏组件,并测量组件在不同电压下的电流输出,从而绘制出IV曲线。此外,测试仪还可以计算光伏组件的功率输出、转换效率等参数,为用户提供全面的性能评估。
文章浏览阅读3.6k次。os: ubuntu 16.04postgresql: 9.6.8ip 规划192.168.56.102 node2 postgresqlhelp create indexpostgres=# \h create indexCommand: CREATE INDEXDescription: define a new indexSyntax:CREATE [ UNIQUE ..._load_categories_hash postgres
文章浏览阅读4.8k次。使用face++,先获取key和secret下方是人脸识别,还添加了画出人脸轮廓的正方形下方是人脸识别,还添加了画出人脸轮廓的正方形 import requests#网络访问控件 from json import JSONDecoder#互联网数据交换标准格式 import cv2 as cv#图像处理控件 http_url =&amp;amp;quot;https://a..._face++人脸识别 html5
文章浏览阅读322次。很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了import java.io.IOException;import java.security.MessageDigest;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;im..._java desencrypt.encrypt(pass)
文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp
文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534
文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请
文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试
文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite
文章浏览阅读4.1k次,点赞8次,收藏23次。通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找。也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元素。_读取表元是什么意思