解决detectMultiScale报错问题

代码添加face_cascade = cv2.CascadeClassifier('E:\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml'), 然后把faces = face.detectMultiScale(gary,1.1,3,0,(100,100))替换为faces = face_cascade.detectMultiScale(gary,1.1,3,0,(100,100)),附上代码,至于为什么这么做解决了问题,我也不知道。。。 import cv2 face = cv2.CascadeClassifier(r'E:\\Python37\\Lib\\site-packages\\cv2\data\\haarcascade_frontalface_alt.xml') face_cascade = cv2.CascadeClassifier('E:\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml') capture = cv2.VideoCapture(0) cv2.namedWindow('video online') while True: ret,frame = capture.read() gary = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY) faces = face_cascade.detectMultiScale(gary,1.1,3,0,(100,100)) for(x,y,w,h) in faces: cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #显示图片 cv2.imshow('fangbaolin',frame) if cv2.waitKey(5) & 0xFF == ord('q'): break capture.release() cv2.destroyAllWindow()

解决ssh无法远程连接到NAT模式的虚拟机的问题

我使用的是WMware 15 + Centos7。 我出现的问题是 “NAT模式”:虚拟机可以上外网,但是物理主机不能ssh连接虚拟机,物理主机也无法ping通虚拟机。 网上未找到准确解决办法,困扰很久,其实只要一个小设置就能解决,分享给遇到此问题的小伙伴。 问题如下: 虚拟机为NAT模式: 虚拟机可以连通外网: 虚拟机ip: 物理主机ssh连接虚拟机:提示未能检索客户机IP地址。 物理机无法ping通虚拟机: 解决办法如下: 选中虚拟机-编辑-虚拟网络编辑器: 我这里需要先授权: 设置就在这里:将主机虚拟适配器连接到此网络选项勾选。 确定后再试,网络通了: 网络适配器这里发生了变化:VMnet8 虚拟网卡添加进来了。 总结: 主要原因是虚拟网卡没安装,导致本地物理机在NAT模式下无法连接虚拟机。

mysql的sql语句练习题

表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) --学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – --课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) --教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score) --学生编号,课程编号,分数 测试数据 --建表 --学生表 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`) ); --课程表 CREATE TABLE `Course`( `c_id` VARCHAR(20), `c_name` VARCHAR(20) NOT NULL DEFAULT '', `t_id` VARCHAR(20) NOT NULL, PRIMARY KEY(`c_id`) ); --教师表 CREATE TABLE `Teacher`(

那些你应该考虑卸载的 VSCode 扩展

这篇文章可能会得罪一部分 VSCode 扩展的作者,但是我实在是看不惯网上很多的文章还在推荐一些已经过时的扩展,我觉得作为 VSCode 的老粉,我有必要写一篇文章科普一下。 在 VSCode 扩展市场目前其实存在着不少下载量特别高但是不应该再被使用的扩展,显然官方是不可能直接给你标出来哪些扩展已经被废弃了,哪些有严重 bug,纯靠扩展作者自觉。很多人新人由于没有深入去了解过,看了一些文章的介绍或者看了扩展市场的简介觉得有用就安装了,其实 VSCode 扩展安装多了会导致不少问题的: 启动慢,很多扩展是启动 VSCode 的时候就开始加载的,所以不一定是 VSCode 自身变慢了,可能是你扩展装多了,你可以通过命令 Developer: Startup Performance 查看各个扩展的在 VSCode 启动时的加载时间。扩展之间打架,比如安装了多个会修改代码颜色的扩展,TODO highlight 和 Todo Tree 之间功能重复,例如:IntelliSense for CSS class names in HTML 和 HTML CSS SupportCPU 占用过高,很多被弃坑的 VSCode 扩展你去看它们 github issues 页面都可以看到一堆 issues 抱怨这个问题,例如 import-cost 本文将主要从两个角度介绍一些不推荐使用的 VSCode 扩展: 功能已经被 VSCode 内置维护不积极的扩展 本文只是给出一些你应该考虑卸载的理由,不是劝说你就应该卸载它们,有些扩展虽然有些问题,但是还是有部分功能没有被内置或者暂时没有更好的替代品,但是我觉得这些事情你应该要清楚。 功能已经被 VSCode 内置 Path Intellisense Last updated: 2016/4/17 Issues open/close: 72/60 Download: 2.7M 我经常看到一些使用 VSCode 没几天的人喷没有路径补全,我觉得很莫名其妙。可以看到这个扩展已经快 4 年没维护了,这也是一个应该放弃使用它的理由。其实如果一个工具本身功能完善,没什么 bug,没有依赖别的项目的话,长期不更新倒没什么。但实际上很多项目都会依赖别的项目,尤其是使用 JS 开发的 VSCode 扩展,经常可以看到各种 npm 包报安全漏洞,最近一次影响比较大的应该是 acorn。

谭浩强C++课后习题39——基类指针数组

谭浩强C++课后习题39——基类指针数组 题目描述:编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle(圆形),Square(正方形),Rectangle(矩形),Trapezoid(梯形),Triangle(三角形)。用虚函数分别计算几种图形面积,并求他们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。 抽象基类:抽象基类题目类比 指针数组:是指存储指针的数组,每一个元素都是一个指针。 基类指针数组:每一个元素都是一个基类指针,用基类指针指向派生类对象可以调用派生类中重写的虚函数,从而实现多态性。 #include<iostream> using namespace std; //形状,抽象基类 class Shape { public: virtual double area()const = 0; }; //圆类,继承形状类 class Circle:public Shape { private: double radius; public: Circle(double r) :radius(r) {} virtual double area()const { return radius * radius * 3.14; } }; //正方形类,继承形状类 class Square :public Shape { private: double length; public: Square(double l) :length(l) {} virtual double area()const { return length * length; } }; //长方形类,继承形状类 class Rectangle :public Shape { private: double length; double heigth; public: Rectangle(double l, double h) :length(l), heigth(h) {} virtual double area()const { return length * heigth; } }; //梯形类,继承形状类 class Trapezoid :public Shape { double top; double bottom; double height; public: Trapezoid(double t, double b, double h) :top(t), bottom(b), height(h) {} virtual double area()const { return (top + bottom) * height * 0.

Java基础知识点

ps: 黑马Java EE 第57期 知识点 文章目录 1.Java基础1-1 Java基础- 数组07_Java中的内存划分08_一个数组的内存图09_两个数组的内存图10_两个引用指向同一个数组的16_数组元素反转 1-2 -面向对象和封装01_public void与public static void区别07_一个对象的内存图08_两个对象使用同一个方法的内存10_使用对象类型作为方法的参11_使用对象类型作为方法的返16_this关键字的作用17_构造方法 1-3-Java语言高级01-常用API_1匿名对象 第5节 String类字符串常量池StringEquals拼接StringGet切割substring (begin end)类型转换StringConvertSplit 第6节 static静态static修饰成员方法1_3_6_14_静态static的内存图静态代码块 java Maven基础 1.Java基础 1-1 Java基础- 数组 07_Java中的内存划分 08_一个数组的内存图 09_两个数组的内存图 10_两个引用指向同一个数组的 16_数组元素反转 package cn.itcast.day05.demo03; /* 数组元素的反转: 本来的样子:[1, 2, 3, 4] 之后的样子:[4, 3, 2, 1] 要求不能使用新数组,就用原来的唯一一个数组。 */ public class Demo07ArrayReverse { public static void main(String[] args) { int[] array = { 10, 20, 30, 40, 50 }; // 遍历打印数组本来的样子 for (int i = 0; i < array.

Flutter出现Android toolchain - develop for Android devices

说明是Android的SDK协议没有添加许可证 找到自己android—sdk的路径,比如:G:\studioAnZhuang\AndroidStudioSDK\tools\bin 关键是**\tools\bin** 在此目录打开 cmd 命令行 输入以下命令: sdkmanager --licenses 然后一路同意 就可以了 最后在命令行下输入flutter doctor 查看结果。

微信小程序中按钮绑定点击事件(bindtap)实现页面跳转(redirectTo、navigataTo),并且进行数据传递( url: '../logs/logs?id=1')

定义两个页面: 绑定点击事件后代码: 实现跳转有两种方法: 1、navigateTo //实现登录跳转 login:function(){ wx.navigateTo({ url: '../logs/logs', //跳转页面路径 }) } 2、redirectTo //实现登录跳转 login:function(){ wx.redirectTo({ url: '../logs/logs', //跳转页面路径 }) } 这两种方式有什么区别???这先不急着解释。 下面由我一一道来。 1、首先先把index.js和logs.js文件里的内容清空。因为我是在这两个文件中定义这两个页面的, 里面的代码是初始化就有的。如果你是新建的文件,就不用管这一步。 2、在这两个文件中分别都添加Page字段,代码会自动补全。 3、在每一个函数中添加输出console.log(),如图: 4、测试: (1)、navigateTo 测试 点击编译: 点击“登录”按钮 (2)、redirectTo测试 点击编译: 点击“登录”按钮 5、对于这一两个的区别: redirectTo是把旧页面直接替换成新的页面相当于把旧页面给卸载了,不能返回到旧页面; 而navigataTo是把旧页面给隐藏,再运行新页面,还能返回。(留意:左上角) 页面之间数据传递: 添加输入框: 要进行数据传递,那么就要先获取数据,获取输入框的数据。 1、输入框绑定bindinput 2、该 index.js 中定义一个函数,把获取到的数据输出看看。 nameinput:function(name){ console.log(name) } 3、在输入框中填写数据,看输出什么 4、点击①中的小三角形 5、这时看到了刚输入的数据,那要怎样才能直接输出呢?参数调用 nameinput:function(name){ console.log(name.detail.value) } 6、再编译: 获取完数据后,怎样进行传递呢? 直接在跳转页面路径上加 **?**后面接上要传递的数据,比如 name = 张三, 但是,我还有没有定义过一个变量,这时先要定义一个变量。 并把获取到输入框的数据赋值给他 nameinput:function(name){ this.setData({userName:name.detail.value}) } 在跳转路径那添加数据 //实现登录跳转 login:function(){ wx.

Qt之tcp实现获取服务器端数据并实时显示在客户端

任务:在客户端发送消息到服务器端,然后获取服务器端数据并解析返回客户端以列表形式显示。 1.首先连接服务器,比如connecToHost(.......); 2.点击添加按钮,使用信号槽发送消息,比如socket.write()函数等等 3.接收到服务器的消息后,再发送信号,由对应的槽函数去处理。(不重要:)别在按钮事件中处理消息,那不可能实现,因为消息发送和消息接收不可能同时,因为网络会延时,可能等到按钮事件执行完,还没有收到消息,更别说去按钮事件中在发送指令后就能立刻处理返回的消息了。 4.要等到消息接收完成后,更新页面中的列表。那么问题来了:需要在消息接收完毕后再去更新页面。有两种解决方法:1.在消息处理函数中更新页面 2.设置标志位,然后再设置一个计时器去判断是否已经接收到数据。然后在计时器中更新页面。 另外,在网络通信中千万要注意:1.检查是否失联,2.解决消息接收错误。 我因为未设置消息接收错误,导致出现的bug想了两天找遍代码都未能解决。

电力系统四象限功率计算程序问题分析

问题: 1、有功功率和无功功率在四象限的正负表示问题。 问题分析: 问题1: 有功无功在四象限的正负表示问题,通过对采样点的波形分析,确定是采样采集到的波形就有问题。当继保仪加电流电压同相位时,对采样点数据的分析波形图如下: 由图可知,采样点采集到的电流电压相位相差180度,与继保仪加的相角明显不同。 由此排查程序,原程序由于采样点波形与实际UI相位差相差180度,从而导致三表法计算得出的有功正负相反(三表法计算公式经查证无误)。为了使功率正负显示正确,从而在三表法算出的值前面加了负号,但是计算相位角时未做出相应处理。最终导致我们程序采集到的相位差与实际不符,功率正负表示正确。代码如下: 将电流的进线和出现对调,并且去掉三表法算出的值前面加的负号,将程序编译后进行测试。加电压为50V,电流为1A,测试四象限有功无功的值及正负,对数据统计并进行分析如下: 由数据可知,无功超前有功90度,有功无功波形正确,对应四个象限的正负表示正确。 结论:此问题是由电流进出线接线错误导致的相角、功率计算错误。

ubuntu进入initramfs,系统黑屏

转载:https://blog.csdn.net/liu502617169/article/details/89945946?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2 解决方法 1.如果在initramfs模式输入reboot重启,或者长按开机键强制关机重启,然后选择ubuntu(高级选项)中的修复模式(recovery mode). 2.系统会告诉你哪个磁盘坏了(见图中标示) 3.然后根据系统提示出错的盘符输入指令修复 fsck -t ext4 /dev/sda5 4.然后一路输入y 5.修复完成后输入reboot重启即可 ———————————————— 原文链接:https://blog.csdn.net/liu502617169/article/details/89945946

find_element_by_xpath()的6种方法

find_element_by_xpath()的6种方法 Xpath (XML Path Language),是W3C定义的用来在XML文档中选择节点的语言 一:从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于css_selector中的>号 /html/body/div/p 二. 根据元素属性选择: 查找具体的元素,必须在前面输入标准开头//,表示从当前节点寻找所有的后代元素 //div/* div下面的所有的元素 //div//p 先在整个文档里查找div,再在div里查找p节点(只要在内部,不限定是否紧跟) ;等价于 css_selector里的(‘div p’) //div/p p是div的直接子节点; 等价于 css_selector里的(‘div > p’) //[@style] 查找所有包含style的所有元素,所有的属性要加@; 等价于 css_selector里的(’[style]’) //p[@spec=‘len’] 必须要加引号;等价于 css_selector里的(“p[spec=‘len’]”) //p[@id=‘kw’] xpath中对于id,class与其他元素一视同仁,没有其他的方法 三. 选择第几个节点 //div/p[2] 选择div下的第二个p节点 ;等价于css_selector里的div>p:nth-of-type(2) 符合p类型的第二个节点 //div/*[2] 选择div下第二个元素 //div/p[position()=2] position()=2 指定第二个位置; 等价于上面的 //div/p[2] position()>=2 位置大于等于2 position()<2 位置小于2 position()!=2 位置不等于2 //div/p[last()] 选择div下的倒数第一个p节点; last()倒数第一个 //div/p[last()-1] 选择div下的倒数第二个p节点; //div/p[position()=last()] 倒数第一个 //div/p[position()=last()-1] 倒数第二个 //div/p[position()>=last()-2] 倒数第一个,第二个,第三个 四. 组合选择 //p | //button 选择所有的p和button,等价于css_selector里的 p, button

常见自动化测试工具分类总结

一 Appium【 AppUI自动化测试】 官网:http://appium.io Appium 是一个移动端自动化测试开源工具,支持iOS 和Android 平台,支持Python、Java 等语言,即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台,Appium 是一个C/S 架构,核心是一个 Web 服务器,它提供了一套 REST 的接口。当收到客户端的连接后,就会监听到命令,然后在移动设备上执行这些命令,最后将执行结果放在 HTTP 响应中返还给客户端。 二 Selenium【WebUI自动化测试 】 官网:https://www.seleniumhq.org/download/ Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。其升级版本为Webdriver。 三 Jmeter【接口测试,性能测试】 官网:https://jmeter.apache.org JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现; JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。 四 Postman【接口测试】 官网:https://www.getpostman.com Postman 提供功能强大的 Web API 和 HTTP 请求的调试,它能够发送任何类型的HTTP 请求 (GET, POST, PUT, DELETE…),并且能附带任何数量的参数和 Headers。不仅如此,它还提供测试数据和环境配置数据的导入导出,付费的 Post Cloud 用户还能够创建自己的 Team Library 用来团队协作式的测试,并能够将自己的测试收藏夹和用例数据分享给团队。 五 Soapui【 接口测试】 官网:https://www.soapui.org SoapUI提供了所有所需的工具来测试和完善的测试。总览标签给你一个项目的所有内容和全面的看法。只需一次点击,您可以添加任何数量的断言为验证传入的消息TestStep。使用功能强大的HTTP监视器记录,分析甚至修改客户机 - 服务器通信,因为它发生。和SoapUI临带来了更专业和先进的功能,保持遥遥领先其他测试工具。轻松创建和运行数据驱动测试。该数据源TestStep读取测试数据从任何外部来源 - Excel中,XML,JDBC,文件,等等 - 到标准SoapUI属性。 六 Monkey【稳定性测试】 软件附带在sdk中,适用于android和ios,通过adb shell,生成用户或系统的伪随机事件, 压力测试结果:崩溃crash,无响应anr, 基本命令:adb shell monkey 1000。 七 Robot【WebUI自动化测试,接口测试】 官网:http://robotframework.

嵌入式Linux学习笔记6——Ubuntu网络设置wired消失问题的解决方法

某天打开Ubuntu时,发现系统不能够连接网络。进入网络设置,发现以前的wired选项没有了,无法进行网络设置: 以下步骤可以解决上述问题: ①在Ubuntu终端输入【sudo su】,再输入密码进入root超级用户模式,然后输入【gedit /etc/NetworkManager/NetworkManager.conf】进入文本编辑页面 ②将【false】改为【true】,然后点击右上方【保存】,退出文本编辑。 ③输入【service network-manager restart】重启网络 ④输入【touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf】,然后输入【service network-manager restart】重启网络 ⑤网络重新连接成功,设置中也出现了wired选项,能够在终端ping通百度,浏览器也能够上网。

Kali linux利用(ms17-010)漏洞入侵Windows server 2003

NMAP MSF实现对目标系统渗透(Windows server 2003控制) Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。此次采用kali Linux系统集成的metasploit进行测试验证MS17-010(永恒之蓝,著名比特币勒索漏洞)。实验环境均采用虚拟机。 前提准备: Kali linux: 192.168.1.113 Windows server2003:192.168.1.102 1,方式一先使用nmap探测网络中存活主机(设备) 方式二 root@wangzhike:~# netdiscover -i eth0 -r 192.168.1.0/24 目标系统:192.168.1.102 windows server 2003 2,探测网络中的系统类型(nmap) root@wangzhike:~# nmap -O 192.168.1.0/24 3.端口扫描 root@wangzhike:~# nmap -p 1-1000 192.168.1.102 root@wangzhike:~# nmap -p 1-1000 192.168.1.102 Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-16 12:46 CST Nmap scan report for 192.168.1.102 Host is up (0.000071s latency). Not shown: 997 closed ports PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds MAC Address: 00:0C:29:82:C6:C2 (VMware) 端口介绍:

office更新,应用程序无法正常启动,请单击“确定”关闭应用程序

错误:打开office的时候显示office更新,应用程序无法正常启动,请单击“确定”关闭应用程序 上次打开office也遇到了这个问题,今天上课要打开PPT,又遇到了这个问题,下面总结一下是怎么解决的。 1.控制面板-程序-程序和功能-左侧“查看已安装的更新”。 2、将图片的东西卸载掉。 3、重启电脑就可以了。 早起上网课~~~好困呀

vs2017安装出现问题及其解决办法

1 安装时出现如下: 问题:此程序需要管理员权限才能执行安装操作.请以管理员身份重新运行 解决办法:删除vs_installerx.opc 2 重新运行vs_Enterprise.exe 问题:自动退出 解决办法:C:\program Files(86)\Microsoft Visual Studio里面找到Installer.exe然后右键在属性里面点击兼容性选择window7。 解决,不管是安装还是修改都没问题了

springboot SseEmitter 消息推送

这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据. SpringBoot已经集成了这个 ,所以不用再引其他依赖 废话不多说 直接贴代码 服务端 package com.cuit.sseemitterdemo.sseemitterdemo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class SseEmitterServer { private static final Logger logger = LoggerFactory.getLogger(SseEmitterServer.class); /** * 当前连接数 */ private static AtomicInteger count = new AtomicInteger(0); /** * 使用map对象,便于根据userId来获取对应的SseEmitter,或者放redis里面 */ private static Map<String, SseEmitter> sseEmitterMap = new ConcurrentHashMap<>(); /** * 创建用户连接并返回 SseEmitter * * @param userId 用户ID * @return SseEmitter */ public static SseEmitter connect(String userId) { // 设置超时时间,0表示不过期。默认30秒,超过时间未完成会抛出异常:AsyncRequestTimeoutException SseEmitter sseEmitter = new SseEmitter(0L); // 注册回调 sseEmitter.

Struts2 请求响应流程及创建步骤

最近在对Struts2框架的项目进行源代码业务逻辑漏洞分析,趁机把之前学的struts2、自己对struts的简单理解整理一下。有不对的地方还请各位看官大神多指教。 对于新项目开发,不建议使用Struts2框架,其含有太多的漏洞,如Struts2-045远程命令执行、S2-057远程命令执行等高危漏洞。 一、简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互,Struts2在Struts1融合webwork。 ONGL表达式:就是对象图形化导航语言,在前端页面中,访问action的属性、方法;类似于对JSP的封装,使得编程更加方便。 工作流程: (1)客户端浏览器发送HTTP请求到Web应用 (2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。 (3)再经过如StiMesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器 (4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理 (5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象 (6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result (7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应 (8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端。 二、创建过程 (一)创建Dynamic Web Project,记得选择“Generate web.xml deployment descriptor” (二)拷贝相关struts2的jar包,加入项目中 (三)web.xml中配置struts2,即配置filter和filter-mapping <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> (四)创建struts2.xml文件(非注解,传统方式) struts2.xml文件头配置如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> 根据下文实际情况,配置Action、interceptor等。 (五)创建Action,继承ActionSupport,如果涉及参数传递,建议通过实现ModelDriven<T>,封装对象实现。 创建用户操作Action:UserAction public class UserAction extends ActionSupport implements ModelDriven<User> { public User user = new User(); public String login() throws Exception { // 封装User // 调用UserService中的判断用户是否存在的方法 UserService userService = new UserService(); boolean isSuccess = userService.