Struts2基础

1.Struts2 Actions动作 

Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架。 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑。
但action还有另外两个重要的功能。 首先,action在将数据从请求传递到视图(无论是JSP还是其他类型的结果)方面起着重要作用。 第二,action必须协助框架确定哪个结果应该呈现在响应请求的视图中。

2.Struts2 拦截器

拦截器在概念上与servlet过滤器或JDK代理类相同。拦截器允许横切功能,把action以及框架分开实现。你可以使用拦截器实现以下操作:

  • 在调用action之前提供预处理逻辑。

  • 在调用action后提供后处理逻辑。

  • 捕获异常,以便可以执行备用处理。

Struts2框架中提供的许多功能都是使用拦截器实现的,包括异常处理,文件上传,生命周期回调和验证等。事实上,由于Struts2将其大部分功能基于拦截器,因此不太可能为每个action分配7个或8个拦截器。

Struts2框架拦截器

Struts 2框架提供了一个良好的开箱即用的拦截器列表,这些拦截器预先配置好并可以使用。 下面列出了几个重要的拦截器:

序号拦截器和说明
1alias

允许参数在请求之间使用不同的别名。

2checkbox

通过为未检查的复选框添加参数值false,以辅助管理复选框。

3conversionError

将字符串转换为参数类型的错误信息放置到action的错误字段中。

4createSession

自动创建HTTP会话(如果尚不存在)。

5debugging

为开发人员提供一些不同的调试屏幕。

6execAndWait

当action在后台执行时,将用户发送到中间的等待页面。

7exception

映射从action到结果抛出的异常,允许通过重定向自动处理异常。

8fileUpload

便于文件上传。

9

i18n

在用户会话期间跟踪选定的区域。

10logger

通过输出正在执行的action的名称提供简单的日志记录。

11params

设置action上的请求参数。

12prepare

这通常用于执行预处理工作,例如设置数据库连接。

13profile

允许记录action的简单分析信息。

14scope

在会话或应用程序范围内存储和检索action的状态。

15ServletConfig

提供可访问各种基于servlet信息的action。

16timer

以action执行时间的形式提供简单的分析信息。

17token

检查action的有效性,以防止重复提交表单。

18validation

提供action的验证支持。

你可以阅读Struts 2文档,了解上述拦截器的完整信息。接下来我们会告诉你如何在Struts应用程序中使用拦截器。

如何使用拦截器?

 

让我们看看如何在我们的“Hello World”程序中使用一个已经存在的拦截器。我们将首先使用timer拦截器,目的是测量执行action方法所需的时间。同时我们使用params拦截器,目的是将请求参数发送给action。你可以尝试不在你的例子中使用这个拦截器,然后你会发现name属性没有被设置,因为参数无法发送给action。
我们可以保留HelloWorldAction.java,web.xml,HelloWorld.jsp和index.jsp文件,因为它们已在Hellow World示例一章中创建过了,然后让我们参照下面修改struts.xml文件给它添加拦截器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><constant name="struts.devMode" value="true" /><package name="helloworld" extends="struts-default"><action name="hello" class="cn.w3cschool.struts2.HelloWorldAction"method="execute"><interceptor-ref name="params"/><interceptor-ref name="timer" /><result name="success">/HelloWorld.jsp</result></action></package>
</struts>

现在,在给定文本框中输入任意单词,然后单击Say Hello按钮执行定义的action。如果你去查看生成的日志,会看到以下文本

现在,在给定文本框中输入任意单词,然后单击Say Hello按钮执行定义的action。如果你去查看生成的日志,会看到以下文本

这里的最后一行是由timer拦截器生成的,是表示ation总共需要109ms来执行。

创建自定义拦截器

在你的应用程序中使用自定义拦截器是提供跨切割应用程序功能的简洁方式。创建自定义拦截器很容易,需要扩展的是以下Interceptor接口:

public interface Interceptor extends Serializable{void destroy();void init();String intercept(ActionInvocation invocation)throws Exception;
}

正如name所指出的,init()方法提供了一种初始化拦截器的方法,而destroy()方法为拦截器清理提供了一个工具。与action不同,拦截器在请求之间重复使用,需要线程安全,特别是intercept()方法。
ActionInvocation对象可访问运行时的环境。它允许访问action本身以及方法来调用action,并确定action是否已被调用。
如果你不需要初始化或清理代码,可以扩展AbstractInterceptor类,以实现init()和destroy()的默认的无操作指令。

 

创建拦截器类

我们接下来在Java Resources>src文件夹中创建以下MyInterceptor.java文件:

package cn.w3cschool.struts2;import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class MyInterceptor extends AbstractInterceptor {public String intercept(ActionInvocation invocation)throws Exception{/* let us do some pre-processing */String output = "Pre-Processing"; System.out.println(output);/* let us call action or next interceptor */String result = invocation.invoke();/* let us do some post-processing */output = "Post-Processing"; System.out.println(output);return result;}
}

你可以发现,实际中action将通过拦截器使用invocation.invoke()调用执行,所以你可以根据你的需求做一些预处理和一些后处理。
框架本身通过第一次调用ActionInvocation对象的invoke()来启动进程。每次调用invoke()时,ActionInvocation都会查询其状态,并执行下一个拦截器。当所有配置的拦截器都被调用时,invoke()将使得action本身被执行。以下图表通过请求流显示了所说的概念:

 

ActionInvocation

配置文件

现在我们需要注册新的拦截器,然后调用它,因为我们在前面的例子中调用的是默认拦截器。要注册一个新的拦截器,把<interceptors> ... </ interceptors>标签直接放置在<package>标签下的struts.xml文件中即可。对于默认拦截器,你可以跳过此步骤,就像我们前面的示例中所做的那样。但现在让我们使用以下方法注册新的:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.devMode" value="true" /><package name="helloworld" extends="struts-default"><interceptors><interceptor name="myinterceptor"class="cn.w3cschool.struts2.MyInterceptor" /></interceptors><action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute"><interceptor-ref name="params"/><interceptor-ref name="myinterceptor" /><result name="success">/HelloWorld.jsp</result></action></package>
</struts>

 

需要注意的是,你可以在<package>标签内注册多个拦截器,同时可以在<action>标签内调用多个拦截器,也可以用不同的action调用同一个拦截器。

web.xml文件需要在WebContent下的WEB-INF文件夹下创建,如下所示:

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>Struts 2</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter>

 

拦截器堆栈

<interceptor-stack name="basicStack"><interceptor-ref name="exception"/><interceptor-ref name="servlet-config"/><interceptor-ref name="prepare"/><interceptor-ref name="checkbox"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/>
</interceptor-stack>

 

 

你可以想象,为每个action配置的多个拦截器将很快变得极其难以管理。为此,拦截器使用拦截器堆栈进行管理。这里是直接从struts-default.xml文件展示的一个例子:

 

 面的堆栈称为basicStack,可以如下所述在你的配置中使用,此配置节点放置在<package ... />节点下。<interceptor-ref ... />标签引用的是在当前拦截器堆栈之前配置的拦截器或拦截器堆栈。因此非常重要的是在配置初始拦截器和拦截器堆栈时,确保name在所有拦截器和拦截器堆栈配置中是唯一的。
我们已经学习了如何将拦截器应用到action中,而拦截器堆栈的应用也是类似的。事实上,使用的标签也是一样的:

 

 
<action name="hello" class="com.tutorialspoint.struts2.MyAction"><interceptor-ref name="basicStack"/><result>view.jsp</result>
</action

上述的“basicStack”注册将完整注册hello action的所使用的六个拦截器。要注意的是,拦截器按照它们被配置的顺序执行。例如,在上面的例子中,exception将首先执行,第二个将是servlet-config等。 

3.Struts2 结果类型

如前面所述,<results>标签在Struts2 MVC框架中扮演视图的角色。Action负责执行业务逻辑,下一步就是使用<results>标签显示视图。
通常有一些导航规则附加的结果。例如,如果action是进行验证用户,则有三种可能的结果:(a)成功登录(b)登录失败:用户名或密码不正确(c)帐户锁定。
在这种情况下,action将配置三个可能的结果字符串和三个不同的视图来渲染结果,这在我们前面的例子中已经看到过了。
但是,Struts2不绑定使用JSP作为视图技术。毕竟,MVC范例的目的是保持图层分离和高度可配置。例如,对于Web2.0客户端,你可能希望返回XML或JSON作为输出。在这种情况下,你可以为XML或JSON创建一个新的结果类型并实现这一点。
Struts提供了许多预定义的结果类型,我们已经看到的是默认的结果类型dispatcher,它用于分发到JSP页面。Struts允许你使用其他标记语言为视图技术呈现结果,较常选用的包括VelocityFreemakerXSLTTiles。 

dispatcher结果类型 

dispatcher结果类型是默认的类型,如果未指定其他结果类型,则使用此类型。它用于转发到服务器上的servlet,JSP,HTML等页面。它使用RequestDispatcher.forward()方法。
我们在前面的示例中看到了“简写”版本,里面我们用一个JSP路径作为结果标签的主体。

<result name="success">/HelloWorld.jsp
</result>

我们还可以使用<result ...>元素中的<param name="location">标签来指定JSP文件,如下所示:

<result name="success" type="dispatcher"><param name="location">/HelloWorld.jsp</param >
</result>

FreeMaker结果类型

在这个例子中,我们将介绍如何使用FreeMaker作为视图技术。Freemaker是一个流行的模板引擎,使用预定义的模板生成输出。让我们创建一个包含以下内容的名为hello.fm的Freemaker模板文件:

Hello World ${name}

上面的文件是一个模板,其中name是一个参数,将使用定义的action从外部传递。你可以在CLASSPATH中保留此文件。接下来,让我们参考下面修改struts.xml以指定结果:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.devMode" value="true" /><package name="helloworld" extends="struts-default"><action name="hello" class="cn.w3cschool.struts2.HelloWorldAction"method="execute"><result name="success" type="freemarker"><param name="location">/hello.fm</param></result></action></package></struts>

redirect结果类型 

redirect结果类型调用标准的response.sendRedirect()方法,使得浏览器向给定的位置创建一个新请求。
我们可以在<result...>元素的主体中或作为<param name="location">的元素中给定位置。redirect也支持parse参数,以下是使用XML配置的示例:

<action name="hello" class="com.tutorialspoint.struts2.HelloWorldAction"method="execute"><result name="success" type="redirect"><param name="location">/NewWorld.jsp</param ></result>
</action>

所以只需修改你的struts.xml文件来定义上面提到的redirect结果类型,并创建一个新的文件NewWorld.jpg,那么当你的hello action返回“success”时就会产生redirect结果。你可以检查Struts 2的Redirect Action示例,以便更详细地了解。

Struts2 值栈/OGNL

值栈是一组对象,按照提供的顺序存储以下这些对象:

序号对象和说明
1Temporary对象

实际中存在各种在页面执行期间创建的temporary对象。例如,JSP标签循环集合的当前迭代值。

2Model对象

如果在struts应用程序中使用Model对象,则当前Model对象放在值堆栈上的action之前。

3Action对象

这是指正在执行的当前action对象。

4命名对象

这些对象包括#application,#session,#request,#attr和#parameters以及所引用的相应的servlet作用域。

值栈可以通过为JSP,Velocity或Freemarker提供的标签进行访问。我们将在单独的章节中学习到用于获取和设置struts2 值栈的各种标签。你可以在action中获取值栈对象,如下所示:

ActionContext.getContext().getValueStack()

一旦你有一个值栈对象,你可以使用以下方法来操纵该对象:

序号值栈方法和说明
1Object findValue(String expr)

通过在默认搜索顺序中对值栈评估所给定的表达式来查找值。

2CompoundRoot getRoot()

获取将对象推入值栈的CompoundRoot。

3Object peek()

获取值栈顶部的对象而不改变值栈。

4Object pop()

获取值栈顶部的对象,并将其从值栈中删除。

5void push(Object o)

将对象放在值栈的顶部。

6void set(String key,Object o)

使用给定的key在值栈上设置一个对象,使其可通过findValue(key,...)检索。

7void setDefaultType(Class defaultType)

设置在获取值时要转换的默认类型。

8void setValue(String expr,Object value)

尝试使用由默认搜索顺序给定的表达式在值栈的bean上设置属性。

9int size()

获取值栈中的对象数。

OGNL

 

OGNL(Object-Graph Navigation Language,对象图导航语言)是一种强大的表达式语言,用于引用和操作值栈上的数据,还可用于数据传输和类型转换。
OGNL非常类似于JSP表达式语言。OGNL基于上下文中存有根对象或默认对象的理念,使用标记符号(即#号)来引用默认或根对象的属性。
如前面所述,OGNL是基于上下文的,而Struts构建了一个ActionContext映射以供OGNL使用。 ActionContext映射包含以下内容:

 

  • 应用程序 - 应用程序作用域变量

  • 会话 - 会话作用域变量

  • 根/值栈 - 所有的action变量都存储在这里

  • 请求 - 请求作用域变量

  • 参数 - 请求参数

  • 属性 - 存储在页面,请求,会话和应用程序作用域中的属性

 

有必要了解的是,Action对象在值栈中总是可用的,因此如果你的Action对象有x和y属性,你可以随时使用。
ActionContext中的对象使用#号引用,但是,值栈中的对象可以直接引用,例如,如果employee是action类的属性,则可以按如下方式引用:

 <s:property value="name"/>
替代<s:property value="#name"/>

果你在会话中有一个名为“login”的属性,你可以按如下方式检索:

  <s:property value="#session.login"/>

OGNL还支持处理集合 - 即Map,List和Set。例如,要显示颜色的下拉列表,你可以执行以下操作:

  <s:select name="color" list="{'red','yellow','green'}" />

 

OGNL表达式很智能地将“红色”,“黄色”,“绿色”解释为颜色,并基于此构建了列表。
在下一章我们学习各种的标签时,OGNL表达式将会广泛的用到。因此,不要用孤立的方式去了解OGNL,让我们结合Form标签/Control标签/Data标签和Ajax标签部分中的一些示例来了解它。

值栈/ OGNL示例

创建Action:

让我们参考下面用于访问值栈的action类,然后在ie.JSP视图页面设置使用OGNL进行访问的几个key。

package cn.w3cschool.struts2;import java.util.*; import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class HelloWorldAction extends ActionSupport{private String name;public String execute() throws Exception {ValueStack stack = ActionContext.getContext().getValueStack();Map<String, Object> context = new HashMap<String, Object>();context.put("key1", new String("This is key1")); context.put("key2", new String("This is key2"));stack.push(context);System.out.println("Size of the valueStack: " + stack.size());return "success";}  public String getName() {return name;}public void setName(String name) {this.name = name;}
}

实际上,Struts 2在执行时会将action添加到值栈的顶部。所以,通常放置东西在值栈的方法是添加getters/setters的值到Action类,然后使用<s:property>标签访问值。我们前面已展示了ActionContext和值栈在struts中的工作原理。

创建视图

在你的eclipse项目的WebContent文件夹中创建下面的jsp文件HelloWorld.jsp,如果action返回为success将显示视图:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>Entered value : <s:property value="name"/><br/>Value of key 1 : <s:property value="key1" /><br/>Value of key 2 : <s:property value="key2" /> <br/>
</body>
</html>

我们还需要在WebContent文件夹中创建index.jsp文件,其内容如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body><h1>Hello World From Struts2</h1><form action="hello"><label for="name">Please enter your name</label><br/><input type="text" name="name"/><input type="submit" value="Say Hello"/></form>
</body>
</html>

配置文件

以下是struts.xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.devMode" value="true" /><package name="helloworld" extends="struts-default"><action name="hello" class="cn.w3cschool.struts2.HelloWorldAction" method="execute"><result name="success">/HelloWorld.jsp</result></action></package>
</struts>

以下是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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>Struts 2</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

 

转载于:https://www.cnblogs.com/lukelook/p/11125374.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebService简单示例

记录一下&#xff0c;以备后用&#xff1a;代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Services;usingSystem.Web.Services.Protocols;namespaceNiunan.ZZ.JKDA.Web.webservice{ ///<summary>///GGService 的…

php server 性能,PHP中:$_SERVER[‘REQUEST_TIME’]和 time()有什么区别,那个性能快!...

简单的说time()与$_SERVER["REQUEST_TIME"]都是获得时间的&#xff0c;但time返回当前的 Unix 时间戳而$_SERVER["REQUEST_TIME"]得到请求开始时的时间戳&#xff0c;稍有区别。1. time() 获取当前的系统时间戳inttime( void ) :返回自从 Unix 纪元(格林威…

Delphi捕捉DLL执行所抛出的异常。

先来说一下我如何写我的Dll文件的。 先看代码&#xff1a; 代码 librarypub_form;usesSysUtils, Classes, Windows, Forms, Parameter_Object, frm_LoginU in..\公用库单元\frm_LoginU.pas{frm_Login}, pub_Event in..\公用库单元\pub_Event.pas, Dll_LIB_ConstU in..\公…

docker版本Mysql安装

docker部署mysql 1. 下载 [rootlocalhost my.Shells]# ./dockerStart.sh start or stop start Redirecting to /bin/systemctl start docker.service [rootlocalhost my.Shells]# docker pull mysql Using default tag: latest Trying to pull repository docker.io/library/…

matlab 左上角,matlab – 访问’uitable`的左上角

在uitable中,我想访问行标签上方的单元格以及列标签的左侧.我想在该领域加上一些文字.可以这样做吗&#xff1f;最佳答案 简短的回答是肯定的,但这有点痛苦.您可以添加文本uicontrol并正确定位.一个功能的例子&#xff1a;% Dummy figure and tablef figure;d gallery(intege…

planning algorithms chapter 2

planning algorithms chapter 2 :Discrete Planning 离散可行规划导论 问题定义 在离散规划中&#xff0c;状态是“可数”的&#xff0c;有限的。 离散可行规划: 非空状态空间 X对于每个状态 x&#xff0c;存在一个有限的动作空间 U(x)对于每个状态和动作空间&#xff0c;存在状…

mda.helper.php,dedecms后台更新缓慢甚至卡死怎么办

问题描述&#xff1a;如果我们在使用织梦程序(2018-01-09)&#xff0c;有可能会遇到后台更新网站、更新文档HTML、添加文档卡死的问题。该如何解决呢&#xff1f;(学习视频分享&#xff1a;编程视频)解决方法&#xff1a;如果你正在用的是最新版的织梦程序(2018-01-09)&#xf…

P2896 [USACO08FEB]一起吃饭Eating Together 解题报告

题目传送门 题目不是很难&#xff0c;看了一会就想到了&#xff0c;但因为一些细节WA了好几遍qwq 但代码却一点一点压短了&#xff08;看了别人的精简写法&#xff09; 题目分析 把一个序列改成不上升或不下降子序列&#xff0c;求最少修改次数。 一般情况有求 LIS 和 LDS 的 O…

MySQL第五天

复制表结构 1 #从src_table复制到dst_table2 CREATETABLEdst_table LIKEsrc_table;3 4 #另外一种方法5 CREATETABLEdst_table SELECT*FROMsrc_table WHERE0;6 7 #第一种方法比第二种方法简单实用效率高8 9 10 #复制表中数据11 #完全复制src_table12 CREATETABLEdet_table SELEC…

九种跨域方式实现原理

前言 前后端数据交互经常会碰到请求跨域&#xff0c;什么是跨域&#xff0c;以及有哪几种跨域方式&#xff0c;这是本文要探讨的内容。 本文完整的源代码请猛戳github 博客 一、什么是跨域&#xff1f; 1.什么是同源策略及其限制内容&#xff1f; 同源策略是一种约定&#xff0…

WinForm控件之【LinkLabel】

基本介绍 超链接标签控件&#xff0c;随处可见应用极为广泛&#xff0c;一般用作触发指定链接跳转指定页面等操作。 常设置属性、事件 ActiveLinkColor&#xff1a;用户单击超链接时超链接显示的颜色&#xff1b; LinkColor&#xff1a;超链接默认状态时显示的颜色&#xff1b;…

Oracle分析函数六——数据分布函数及报表函数

Oracle分析函数——数据分布函数及报表函数 CUME_DIST 功能描述&#xff1a;计算一行在组中的相对位置&#xff0c;CUME_DIST总是返回大于0、小于或等于1的数&#xff0c;该数表示该行在N行中的位置。例如&#xff0c;在一个3行的组中&#xff0c;返回的累计分布值为1/3、2/3、…

Acess 数据库 查询数据表结构等问题小记

今天一次性解决三个小问题&#xff1a; 问题1&#xff1a;本机打开Access数据库老是提示&#xff1a;“Windows 正在配置 Microsoft Office Professional Edition 2003&#xff0c;请稍候” 解决办法&#xff1a; 手动更改注册表步骤操作&#xff1a; 1. 单击“开始”&#xff…

集合计数 (容斥原理)

心路: { 想了个思路打出来硬干掉了样例&#xff0c;然后发现是错的....当时直接崩了...烦躁滴很...其实这个思路和题解大方向上是一样的&#xff0c;想到了用至少含k个的方案数减去含k1个的加上k2的。。。 然后再想怎么求至少含k个的方案数想到了让集合含这k个数然后随机组就行…

codeforces-1176 (div3)

打div3翻车了 A.第一个操作是除二&#xff0c;第二个操作视为两下操作之后除三&#xff0c;第三个操作视为三下操作之后除五&#xff0c;直接计算贡献 #include <map> #include <set> #include <ctime> #include <cmath> #include <queue> #incl…

微软CRM 2011 Beta 新功能之二:不同组织不同基本语言

微软CRM 4.0就开始提供对多语言的支持&#xff0c;在安装微软CRM 4.0时需要选择不同语言的安装程序&#xff0c;安装完成后该部署服务器上默认组织以及任何新建组织的基本语言跟安装程序的语言一致。虽然我们可以在服务器上安装多个语言包&#xff0c;使用户可以选择要使用的语…

php教育项目,六星教育:如何在PHP项目实战中取胜,获得腾讯等大厂的offer

原标题&#xff1a;六星教育&#xff1a;如何在PHP项目实战中取胜&#xff0c;获得腾讯等大厂的offer我们在进行PHP学习的时候&#xff0c;总会强调实战的重要性。事实也是如此&#xff0c;如果光知道理论知识&#xff0c;而缺乏实际项目的参与与运作&#xff0c;就会变得纸上谈…

u盘运行linux系统卡住了,从U盘运行Linux操作系统的三种方法

从U盘运行Linux操作系统的三种方法你或许听说过在U盘上运行live Linux操作系统&#xff0c;但你知不知道可以永久的保存运行时的数据&#xff0c;或者直接将Linux安装到U盘&#xff1f;本文将介绍把Linux装进口袋(U盘)的三种方法&#xff0c;挑一种你最喜欢的方法吧&#xff01…

linux分区从1开始,Linux 学习笔记 1 使用最小的系统,从分区安装系统开始

我们常用的linux系统在安装过程中大多都省略了对系统进行分区的操作&#xff0c;以至于后期&#xff0c;不了解什么是分区以及分区当中最基本的一些概念&#xff0c;我们不说最细的知识&#xff0c;只求了解这个过程&#xff0c;那直接步入正题&#xff0c;开始第一节的学习。开…