当前位置:文档之家› JAX-RS入门

JAX-RS入门

JAX-RS入门
JAX-RS入门

JAX-RS入门

第一节、基础

简介

JAX-RS是一套用java实现REST服务的规范,提供了一些标注将一个资源类,一个POJOJava 类,封装为Web资源。标注包括:

@Path,标注资源类或方法的相对路径

@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型

@Produces,标注返回的MIME媒体类型

@Consumes,标注可接受请求的MIME媒体类型

@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

目前JAX-RS的实现包括:

Apache CXF,开源的Web服务框架。

Jersey,由Sun提供的JAX-RS的参考实现。

RESTEasy,JBoss的实现。

Restlet,由Jerome Louvel和Dave Pawson开发,是最早的REST框架,先于JAX-RS出现。Apache Wink,一个Apache软件基金会孵化器中的项目,其服务模块实现JAX-RS规范(以上来自:https://www.doczj.com/doc/dd3338296.html,/wiki/JAX-RS)

装备

本文使用的工具有:

Eclipse-jee-helios

Java-1.6.0_26

apache-tomcat-6.0.30

SoapUI-3.6

使用到的外部jar包有(必须的部分,需要加到Web容器中)

neethi-3.0.2.jar

jsr311-api-1.1.1.jar

cxf-bundle-2.6.0.jar

使用到的外部jar包有(可选的部分,当且仅当作为一个独立的application运行时)

jetty-http-7.5.4.v20111024.jar

jetty-io-7.5.4.v20111024.jar

jetty-server-7.5.4.v20111024.jar

jetty-util-7.5.4.v20111024.jar

jetty-continuation-7.5.4.v20111024.jar

wsdl4j-1.6.2.jar

准备

(以下例子来自:Oreilly - RESTful Java with JAX-RS (12-2009) (A TTiCA).pdf)

创建工程

为了后续顺利进行,首先在eclipse上先创建一个Dynamic Web Project,完成以后,一个符

合war结构的工程目录会自动生成,之后可以很简单的导出为war文件,其中需要把以下jar 包放到/WebContent/WEB-INF/lib 里:

neethi-3.0.2.jar

jsr311-api-1.1.1.jar

cxf-bundle-2.6.0.jar

另外,在工程目录下,新建一个lib 文件夹用来存放以下可选的jar包:

jetty-http-7.5.4.v20111024.jar

jetty-io-7.5.4.v20111024.jar

jetty-server-7.5.4.v20111024.jar

jetty-util-7.5.4.v20111024.jar

jetty-continuation-7.5.4.v20111024.jar

wsdl4j-1.6.2.jar

最后一步就是把所有这9个jar都加到工程的build path里去,这样工程就准备好了。

定义服务

这里要实现一个简单的REST服务用于对客户进行管理,包括:

创建客户

查看客户

更新客户

首先给出对应的于这些操作的服务接口:

Java代码

import java.io.InputStream;

import javax.ws.rs.Consumes;

import javax.ws.rs.GET;

import javax.ws.rs.POST;

import javax.ws.rs.PUT;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.Response;

import javax.ws.rs.core.StreamingOutput;

@Path("/customers")

public interface CustomerResource {

@POST

@Consumes("application/xml")

public Response createCustomer(InputStream is);

@GET

@Path("{id}")

@Produces("application/xml")

public StreamingOutput getCustomer(@PathParam("id") int id);

@PUT

@Path("{id}")

@Consumes("application/xml")

public void updateCustomer(@PathParam("id") int id, InputStream is) ;

}

令人惊奇的是,这个接口已经包含了所有实现我们既定目标的关键部分:

@Path: 定义服务路径,接口中定义的整个服务的顶级路径为"/customers ",方法对应的服务路径为接口路径加方法定义的Path值,如果未定义,则用接口路径,例如getCustomer()的服务路径为:" /customers/{id} "。所以此REST对外服务路径都是服务的上下文路径/customers/ 子级目录,

@POST,@GET,@PUT:标注方法所支持HTTP请求的类型(参考上面的说明)

@Produces,@Consumes:标注方法支持或返回的请求MIME类型。

由上可以看到,每个方法被调用的条件如下:

createConsumer():请求HTTP方法为POST;请求MIME类型为application/xml;请求路径为:上下文路径/customers

getCustomer():请求的HTTP方法为GET;请求的MIME类型为application/xml;请求的路径为:上下文路径/customers/{id}

注:{id}为某个存在(或不存在)customer的编号

updateCustomer():请求的HTTP方法为PUT;请求的MIME类型为application/xml;请求的路径:上下文路径/customers/{id}

注:{id}为某个存在(或不存在)customer的编号

一个好的实现方法是将REST服务的定义和实现分开,这样代码的结构简洁、清晰,在后期也可以很方便的进行实现的替换和服务定义的修改。

下面就是添加实现部分:

Java代码

public class CustomerResourceService implements CustomerResource{

private Map customerDB = new ConcurrentHashMap();

private AtomicInteger idCounter = new AtomicInteger();

public Response createCustomer(InputStream is) {

Customer customer = readCustomer(is);

customer.setId(idCounter.incrementAndGet());

customerDB.put(customer.getId(), customer);

System.out.println("Created customer " + customer.getId());

return Response.created(URI.create("/customers/" + customer.getId()))

.build();

}

public StreamingOutput getCustomer(int id) {

final Customer customer = customerDB.get(id);

if (customer == null) {

throw new WebApplicationException(Response.Status.NOT_FOUND);

}

return new StreamingOutput() {

public void write(OutputStream outputStream) throws IOException,

WebApplicationException {

outputCustomer(outputStream, customer);

}

};

}

public void updateCustomer(int id, InputStream is) {

Customer update = readCustomer(is);

Customer current = customerDB.get(id);

if (current == null)

throw new WebApplicationException(Response.Status.NOT_FOUND);

current.setFirstName(update.getFirstName());

current.setLastName(update.getLastName());

current.setStreet(update.getStreet());

current.setState(update.getState());

current.setZip(update.getZip());

current.setCountry(update.getCountry());

}

protected void outputCustomer(OutputStream os, Customer cust)

throws IOException {

PrintStream writer = new PrintStream(os);

writer.println("");

writer.println(" " + cust.getFirstName() + "");

writer.println(" " + cust.getLastName() + "");

writer.println(" " + cust.getStreet() + "");

writer.println(" " + cust.getCity() + "");

writer.println(" " + cust.getState() + "");

writer.println(" " + cust.getZip() + "");

writer.println(" " + cust.getCountry() + "");

writer.println("");

}

protected Customer readCustomer(InputStream is) {

try {

DocumentBuilder builder = DocumentBuilderFactory.newInstance()

.newDocumentBuilder();

Document doc = builder.parse(is);

Element root = doc.getDocumentElement();

Customer cust = new Customer();

if (root.getAttribute("id") != null

&& !root.getAttribute("id").trim().equals("")) {

cust.setId(Integer.valueOf(root.getAttribute("id")));

}

NodeList nodes = root.getChildNodes();

for (int i = 0; i < nodes.getLength(); i++) {

Node item = nodes.item(i);

if(!(item instanceof Element)){

continue;

}

Element element = (Element) nodes.item(i);

if (element.getTagName().equals("first-name")) {

cust.setFirstName(element.getTextContent());

} else if (element.getTagName().equals("last-name")) {

cust.setLastName(element.getTextContent());

} else if (element.getTagName().equals("street")) {

cust.setStreet(element.getTextContent());

} else if (element.getTagName().equals("city")) {

cust.setCity(element.getTextContent());

} else if (element.getTagName().equals("state")) {

cust.setState(element.getTextContent());

} else if (element.getTagName().equals("zip")) {

cust.setZip(element.getTextContent());

} else if (element.getTagName().equals("country")) {

cust.setCountry(element.getTextContent());

}

}

return cust;

} catch (Exception e) {

throw new WebApplicationException(e, Response.Status.BAD_REQUEST);

}

}

}

这些方法的实现都很直接,不细说,不过有一点需要特别注意的是:

最好不要在实现中混杂有服务的定义部分,例如@Path标签,@PathParam标签等等,如果想修改定义,最好是在接口中修改;或者如果想覆盖某个接口方法的某个annotation,则所有该接口方法的annotation定义都需要重写,而不能仅修改变化的。

第二节、运行

上一节,已经成功的定义了一个REST服务,并且提供了具体的实现,不过我们还需要把它运行起来。

在上一节的装备部分,列举了必须的jar(在tomcat中运行)和可选的jar(作为一个独立的应用程序运行)。这一节将分别介绍如何做为一个独立的应用程序运行和如何在tomcat里运行。

Tomcat(或者其他Web容器)中运行

要在tomcat之类的容器里运行,首先需要定义一个Application类:

Java代码

import java.util.HashSet;

import java.util.Set;

import javax.ws.rs.core.Application;

public class CustomerApplication extends Application {

private Set singletons = new HashSet();

private Set> empty = new HashSet>();

public CustomerApplication() {

singletons.add(new CustomerResourceService());

}

@Override

public Set> getClasses() {

return empty;

}

@Override

public Set getSingletons() {

return singletons;

}

}

简单说明:

getClasses():返回所有定义的服务类的类;每次请求都生成新的服务对象

getSingletons():返回所有定义的服务类的实例;每次请求都会重用已经存在对象

因为我们的数据需要被重用,因为getClasses()返回空;getSingletons()返回创建的一个对象实现。

有了这个application类后,就需要一个特定的servlet类去处理具体的调用,其中application 类做为这个servlet类的一个init-param参数指定。

不同的JAX-RS的实现者会有不同的对应的servlet的实现,这里我选择的Apache CXF的实现,它对应的servlet类为:

org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet

所以我们需要在web.xml中如下样声明一个servlet:

Java代码

rest

org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet

javax.ws.rs.Application

com.restfully.shop.services.CustomerApplication

rest

/*

最后的web.xml文件内容如下:

Java代码

xmlns="https://www.doczj.com/doc/dd3338296.html,/xml/ns/javaee"

xmlns:web="https://www.doczj.com/doc/dd3338296.html,/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="https://www.doczj.com/doc/dd3338296.html,/xml/ns/javaee

https://www.doczj.com/doc/dd3338296.html,/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

JaxrsService

index.html

index.htm

index.jsp

default.html

default.htm

default.jsp

Archetype Created Web Application

rest

org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet

javax.ws.rs.Application

com.restfully.shop.services.CustomerApplication

rest

/*

这个REST服务已经实现完成,接下来就可以运行了,在工程上点右键:Run As -> Run on server

如果没有配server,这里需要配一个web server,配置完成后,工程就会自动在这个server 上运行。最后就可以测试了,这里推荐用SoapUI测试。

假设选定是tomcat,tomcat的上下文路径是http://localhost:8080/,并且假设工程名是JaxrsDemo,那么这个REST服务的根路径就是:http://localhost:8080/JaxrsDemo/customers ;它会对应提供一个wadl文件,路径为:http://localhost:8080/JaxrsDemo/customers/?_wadl 。

直接导入http://localhost:8080/JaxrsDemo/customers/?_wadl 到SoapUI中,对应的请求方法和结构就会自动生成,只需要填入测试内容即可。

独立的应用程序

与web容器有几点不同之处:

需要提供自己的上下文路径,即上面的http://localhost:8080/JaxrsDemo部分

需要自己控制启动和停止

如果看看org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet的源码就会发现,其中的关键类是:org.apache.cxf.jaxrs.JAXRSServerFactoryBean。

我们需要得到一个org.apache.cxf.jaxrs.JAXRSServerFactoryBean对象,然后通过它来得到一个org.apache.cxf.endpoint.Server对象,这个org.apache.cxf.endpoint.Server对象就可以理解成是一个tomcat。

参考org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet的实现,如下:

Java代码

JAXRSServerFactoryBean bean = ResourceUtils.createApplication(

new CustomerApplication(), false);

String address = "http://localhost:8008/";

bean.setAddress(address);

Server server = bean.create();

server.start();

try {

Thread.sleep(100000000);

} catch (InterruptedException e) {

e.printStackTrace();

}

server.stop();

其中http://localhost:8008/ 就相当于http://localhost:8080/JaxrsDemo部分,所以这个REST 服务的路径为:http://localhost:8008/customers ,对应的服务定义文件为:http://localhost:8008/customers/?_wadl .

剩下的测试过程同上。

第三节、细节

一、若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation;对于方法,这个annotation是可选的,如果不添加,则继承类的定义。

二、一个方法上只有添加了某个Http Method的annotation,例如@GET,才有资格处理请求。

三、@Path里的值可以是一个复杂的表达式,例如@Path("{id}") ,其中{id}表达式代码了一个模板参数;一个模板参数是一个定义在@Path里的通配符,它以{ 开始,中间是一堆字母和数字的混合串(不能包含/ 字符),以} 结尾。又如:@Path("{firstName}-{lastName}") .

四、@Path也支持正则表达式,例如:@Path("{id: \\d+}") ,其中\\d+ 表示一个数字。格式为:A : B

五、可以自定http method的annotation,具体参考已经有的实现,例如@GET的实现:Java代码

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@HttpMethod(HttpMethod.GET)

public @interface GET {

}

其中HttpMethod的实现为:

Java代码

@Target({ElementType.ANNOTATION_TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface HttpMethod {

/**

* HTTP GET method

*/

public static final String GET="GET";

/**

* HTTP POST method

*/

public static final String POST="POST";

/**

* HTTP PUT method

*/

public static final String PUT="PUT";

/**

* HTTP DELETE method

*/

public static final String DELETE="DELETE";

/**

* HTTP HEAD method

*/

public static final String HEAD="HEAD";

/**

* HTTP OPTIONS method

*/

public static final String OPTIONS="OPTIONS";

/**

* Specifies the name of a HTTP method. E.g. "GET".

*/

String value();

}

因此,可以如下自定义新的http 请求方法:

Java代码

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@HttpMethod("LOCK")

public @interface LOCK {

}

注:请不要试图重写HttpMethod annotation。

六、Path的优先级规则

首先检查匹配的字符的个数,匹配的个数越多越优先

其次检查内嵌的模板表达式的个数,个数越多越优先

最后是非缺省模板表达式的个数;缺省模板即未定义正则表达式的模板

例如以下顺利:

Java代码

1 /customers/{id}/{name}/address

2 /customers/{id : .+}/address

3 /customers/{id}/address

4 /customers/{id : .+}

如果以上匹配不能解决你的问题,那多半是因为你的设计过于复杂,需要重新审视。

七、允许、保留和需要转意的字符

所以有a-z、A-Z、0-9 都被允许

所有:_-!.~'()* 都被允许

所有:,;:$&+=?/[]@ 都是保留字符(需要转意)

所有其他字符需要用% 进行转意;格式为%HH (%加两个十六进制数)

注:如果Path中uri的表达式包含有需要转意的字符,JAX-RS会自动进行转意;否则会视之为已经进行了URL的encoding。

八、Matrix Param

Matrix Param是一个嵌在URI字符串中的name-value对,例如:

https://www.doczj.com/doc/dd3338296.html,/mercedes/e55;color=black/2006

Matrix Param用于修饰特定的片段,如上修饰e55片段;不同于Query Param,用于修饰整个URI资源。

Matrix Param不出现在@Path的表达式中,例如以上URI对应的@Path的表达式可能是:@Path("/e55/{year}")。

但是可以用@MatrixParam annotation来取得Matrix Param的值,例如:@MatrixParam("color")

九、Subresource Locators

Subresources Locators是指一个指定了@Path annotation,但未指定HttpMethod的annotation,例如@GET,的Java方法。这个方法返回一个含有JAX-RS annotation的REST Service对象,这个对象知道怎么去分发剩余的请求。

例如:

Java代码

@Path("/customers")

public class CustomerDatabaseResource {

@Path("{database}-db")

public CustomerResource getDatabase(@PathParam("database") String db) {

// find the instance based on the db parameter

CustomerResource resource = locateCustomerResource(db);

return resource;

}

protected CustomerResource locateCustomerResource(String db) {

...

}

}

其中CustomerResource可能是:

Java代码

public class CustomerResource {

private Map customerDB =

new ConcurrentHashMap();

private AtomicInteger idCounter = new AtomicInteger();

@POST

@Consumes("application/xml")

public Response createCustomer(InputStream is) {

...

}

@GET

@Path("{id}")

@Produces("application/xml")

public StreamingOutput getCustomer(@PathParam("id") int id) {

...

}

@PUT

@Path("{id}")

@Consumes("application/xml")

public void updateCustomer(@PathParam("id") int id, InputStream is) {

...

}

}

因为CustomerResource 并不打算做一个Service暴露,所以在类上没有添加@Path的annotation。

十、完全动态分发

所谓完全分发,就是实现类可以是任意类,例如上面的CustomerDatabaseResource的getDatabase()方法的实现可以改为:

Java代码

@Path("/customers")

public class CustomerDatabaseResource {

protected CustomerResource europe = new CustomerResource();

protected FirstLastCustomerResource northamerica =

new FirstLastCustomerResource();

@Path("{database}-db")

public Object getDatabase(@PathParam("database") String db) {

if (db.equals("europe")) {

return europe;

}

else if (db.equals("northamerica")) {

return northamerica;

}

else return null;

}

}

这里返回值是一个Object,已经不再局限于CustomerResource类了。JAX-RS会检查这个实例,以决定怎么分发请求。

第四节、注入

一、Annotations

@javax.ws.rs.PathParam:从URI模板参数中提取数据

@javax.ws.rs.MatrixParam:从URI中提取Matrix参数

@javax.ws.rs.QueryParam:从URI中提取查询参数

@javax.ws.rs.FormParam:提取Post Form参数

@javax.ws.rs.HeaderParam:提取HTTP请求头信息

@javax.ws.rs.CookieParam:提取客户设置的cookie的信息

@javax.ws.rs.core.Context:通用的注入annotation,允许注入各种帮助或者信息对象

通常这些注释用在服务方法上,当JAX-RS收到一个请求会,就会去查找相应的服务方法,然后把方法需要的信息注入。

如果是“每个请求一个对象”的模式,你可以将这些annotation用在变量、set方法或者是构造方法上;如果是单态模式,则不允许将这些annotation用在变量、或者set方法上,因为对像会同时处理多个请求,如果将这些值用在变量或者set方法上,则多个请求会彼此冲突,陷入错误。

二、PathParam

Java代码

public class CustomerResource {

...

@Path("{id}")

@GET

@Produces("application/xml")

public StreamingOutput getCustomer(@PathParam("id") int id) {

...

}

}

此处,取得{id}的值,并试图转换成一个int型的值。

可以同时使用多个PathParam:

Java代码

@Path("/customers")

public class CustomerResource {

...

@Path("{first}-{last}")

@GET

@Produces("application/xml")

public StreamingOutput getCustomer(@PathParam("first") String firstName,

@PathParam("last") String lastName) {

...

}

}

PathParam的范围:总是引用最接近的PathParam的值,例如:

Java代码

@Path("/customers/{id}")

public class CustomerResource {

@Path("/address/{id}")

@Produces("text/plain")

@GET

public String getAddress(@PathParam("id") String addressId) {...}

}

例如HTTP请求为:GET /customers/123/address/456 , 则addressId 的值为456.

注入PathSegment

PathParam除了可以注入Path参数,也可以注入一个javax.ws.rs.core.PathSegment实便;PathSegment是一个特定Path片段的抽象,如下:

Java代码

package javax.ws.rs.core;

public interface PathSegment {

String getPath(); //具体的URI的path片段值,去除了所有的matrix参数

MultivaluedMap getMatrixParameters(); //该path片段拥有的所有的matrix值

}

然后如下使用:

Java代码

@Path("/cars/{make}")

public class CarResource {

@GET

@Path("/{model}/{year}")

@Produces("image/jpeg")

public Jpeg getPicture(@PathParam("make") String make,

@PathParam("model") PathSegment car,

@PathParam("year") String year) {

String carColor = car.getMatrixParameters().getFirst("color");

...

}

}

例如:GET /cars/mercedes/e55;color=black/2006。则make是mercedes;model是e55;year 是2006;color是black。

注入多个PathSegment

如果对对应有Path含有多个path片段,则需要注入多个PathSegments类,例如:

Java代码

@Path("/cars/{make}")

public class CarResource {

@GET

@Path("/{model : .+}/year/{year}")

@Produces("image/jpeg")

public Jpeg getPicture(@PathParam("make") String make,

@PathParam("model") List car,

@PathParam("year") String year) {

}

}

其中请求可能是:GET /cars/mercedes/e55/amg/year/2006。这里model对应的path片段为:/e55/amg。所以car变量中含有两个PathSegment对象。

用代码获取URI的信息

有时候可能想通过程序的方式获取URI中的信息,而不使用PathParam注释。这里我们需要通过接口javax.ws.rs.core.UriInfo接口去获取这些信息,UriInfo接口定义如下:

Java代码

public interface UriInfo {

public String getPath(); //返回匹配的相对uri路径

public String getPath(boolean decode); //返回解码后的相对uri路径

public List getPathSegments(); //返回path片段

public List getPathSegments(boolean decode); //返回解码后的path片段public MultivaluedMap getPathParameters(); //返回PathParam表

public MultivaluedMap getPathParameters(boolean decode); //同上

...

}

要获取UriInfo对象,就需要用到@javax.ws.rs.core.Context注释了。例如:

Java代码

@Path("/cars/{make}")

public class CarResource {

@GET

@Path("/{model}/{year}")

@Produces("image/jpeg")

public Jpeg getPicture(@Context UriInfo info) {

String make = info.getPathParameters().getFirst("make");

PathSegment model = info.getPathSegments().get(1);

String color = model.getMatrixParameters().getFirst("color");

...

}

}

三、MatrixParam

除了上面介绍的使用PathSegment去获取MatrixParam值外,我们也可以直接使用@MatrixParam去获取值,这样来得更直接、简洁,例如:

Java代码

@Path("/{make}")

public class CarResource {

@GET

@Path("/{model}/{year}")

@Produces("image/jpeg")

public Jpeg getPicture(@PathParam("make") String make,

@PathParam("model") String model,

@MatrixParam("color") String color) {

...

}

}

不过如果Path中含有多个同名的MatrixParam,则还是需要使用PathSegment来获取,例如:GET /mercedes/e55;color=black/2006/interior;color=tan

四、@QueryParam

很显然,QueryParam用来获取查询参数,对于GET /customers?start=0&size=10 ,例如:Java代码

@Path("/customers")

public class CustomerResource {

@GET

@Produces("application/xml")

public String getCustomers(@QueryParam("start") int start,

@QueryParam("size") int size) {

...

}

}

这里start为0,size为10.

同上面的PathParam,也可以用UriInfo去获取QueryParam,例如:

Java代码

@Path("/customers")

public class CustomerResource {

@GET

@Produces("application/xml")

public String getCustomers(@Context UriInfo info) {

String start = info.getQueryParameters().getFirst("start");

String size = info.getQueryParameters().getFirst("size");

...

}

}

五、@FormParam

很自然,FormParam用于提取POST请求中的Form参数,其中Content-Type被假设为application/x-www-formurlencoded。例如有以下Form请求

Html代码

First name:

Last name:

可以如下取值:

Java代码

@Path("/customers")

public class CustomerResource {

@POST

public void createCustomer(@FormParam("firstname") String first,

@FormParam("lastname") String last) {

...

}

}

六、HeaderParam

很直接,用来提取HTTP Header值的。例如:

Java代码

@Path("/myservice")

public class MyService {

@GET

@Produces("text/html")

public String get(@HeaderParam("Referer") String referer) {

...

}

}

如果想提取所有的header值,那就需要用到javax.ws.rs.core.HttpHeaders接口了:

Java代码

public interface HttpHeaders {

public List getRequestHeader(String name);

public MultivaluedMap getRequestHeaders();

...

}

例如方法同上面的PathSegment,也是用context去获取,例如:

Java代码

@Path("/myservice")

public class MyService {

@GET

@Produces("text/html")

public String get(@Context HttpHeaders headers) {

String referer = headers.getRequestHeader("Referer").get(0);

for (String header : headers.getRequestHeaders().keySet())

{

System.out.println("This header was set: " + header);

}

...

}

}

七、@CookieParam

提取cookie信息,例如:

Java代码

@Path("/myservice")

public class MyService {

@GET

@Produces("text/html")

public String get(@CookieParam("customerId") int custId) {

...

}

}

这里注入了的是一个cookie的值,如果想取得更多的信息,而不公公是基本值,则可以直接注入javax.ws.rs.core.Cookie对象,例如:

Java代码

@Path("/myservice")

public class MyService {

@GET

@Produces("text/html")

public String get(@CookieParam("customerId") Cookie custId) {

...

}

}

Cookie类具有一些其他的方法可以用来获取更多信息,例如:

Java代码

package javax.ws.rs.core;

public class Cookie

{

public String getName() {...}

public String getValue() {...}

public int getVersion() {...}

public String getDomain() {...}

public String getPath() {...}

...

}

也可以用javax.ws.rs.core.HttpHeaders获取所有的cookie:Java代码

public interface HttpHeaders {

...

public Map getCookies();

}

Java代码

@Path("/myservice")

public class MyService {

@GET

@Produces("text/html")

public String get(@Context HttpHeaders headers) {

for (String name : headers.getCookies().keySet())

{

Cookie cookie = headers.getCookies().get(name);

System.out.println("Cookie: " +

name + "=" + cookie.getValue());

}

...

}

}

ps基本工具介绍【初学者必看】

广军影视2015-11-15 初学者必看 工具介绍 1、移动工具:可以对PS里的图层进行移动。 2、 矩形选框工具:可以对图像选择一个矩形的选择范围 单列选框工具:可以在图像或图层中绘制出1个像素高的横线或竖线区域,主要用于修复图像中丢失的像素。 椭圆选框工具:可以对图片选择一个椭圆或正圆的选择范围。【椭圆变正圆:按着shift 画圆为正圆;按shift+alt是从中心点出发往外画正圆】 3、【取消选区:ctrl+d 或菜单栏【选择】--取消选择】 套索工具:可以用来选区不规则形状的图像【在图像适当的位置单机并按住鼠标左键,拖曳鼠标绘制出需要的选区,松开鼠标左键,选区会自动封闭】 有羽化50所以看到的效果为圆选区) 属性栏红框:为选择方式选项【相加、相减、交叉】。 黄框:用于设定边缘的羽化程度。 白框:用于清除选区边缘的锯齿。 多边形套索工具:可以用来选取不规则的多边形图像(属性与套锁工具相同)【没有圆弧的图像沟边可以用这个工具,但不能勾出弧度】

【使用套索工具选区时,按enter键封闭选区。按ESC键取消选区,按delete键,删除上一个单击建立的选区点。】 磁性套索工具:可以用来选取不规则的并与背景反差大的图像【不须按鼠标而直接移动鼠标,在工具头处会出现自动跟踪的线,这条线总是走向颜色与颜色边界处,边界越明显磁力越强,将首尾相接后可完成选择】 属性:“宽度”选项用于设定套索检测检测范围,磁性套索工具将在这个范围内选取反差最大的边缘。“对比度”选项用于设定选取边缘的灵敏度,数值越大,则要求边缘与背景的反差越大。“频率”选项用于设定选区点的速率,数值越大,标记速率越快,标记点越多。 频率57 频率71 对比度10%

计量经济学的基础工具

第2章计量经济学的基础工具 在第1章中定义了计量经济学的主要工具是数学,包括优化理论和统计分析。这些工具的基础知识是计量经济学的基础知识。尽管这些知识在所有的专业书籍中都可以找到,但是考虑到知识的连贯性和应用的便利,这里将以一章来介绍这些基本知识,以备那些需要的读者参考。关于矩阵部分,主要参考了Sydsaeter,Strom和Berch(2001)的文献,关于概率统计及其推断部分,主要参考了古亚拉提(2000)的文献,古扎拉蒂(2004),Sydsaeter,Strom和Berch(2001)以及王文中(2003)的文献。

第2章 计量经济学的基础工具 ·21· 2.1 矩阵 2.1.1 矩阵的定义 11 12 121 2221 2 n n m m mn a a a a a a a a a ?? ? ? = ? ? ??? L L L L L L L A 称为m n ?阶矩阵,其中a ij 称为位于矩阵的第i 行和第j 列的元素。简记()ij m n a ?=A 。当m n =时,称矩阵为n 阶方阵,A 称为A 的n 阶行列式。如果 0,1,≠?=?=? ij i j a i j 则称该方阵为n 阶单位矩阵,记为I 。有I =1。I 是对角矩阵的特殊形式。一般 的对角矩阵记为 1122diag{,,,}nn a a a =L A 并有 1122=L nn a a a A 矩阵()ij m n a ?=A 的名称是由其元素的变化决定的。比如,所有元素都为0的矩阵叫零矩阵,所有位于主对角线下面的元素均为0,则称A 为上三角矩阵,反之则叫下三角矩阵。定义 11 21112 22212?? ? ? = ? ? ??? L L L L L L L m m n n mn a a a a a a a a a B 为矩阵()ij m n a ?=A 的转置,记为'A 。当m n =时,如果'=A A ,A 称为对称矩阵;如果'=-A A ,A 称为反对称矩阵;如果2=A A ,则A 是幂等矩阵;如果2=A I ,则A 是对合矩阵;若'=A A I ,则A 是正交阵且1=±A ;如果0=A 或0≠A ,则A 称为奇异的或非奇异的。一个高阶矩阵,根据实际需要,可分成若干小块。比如()ij m n a ?=A 可分成四块: 11122122?? = ??? A A A A A

办公软件教程(含wordexcelppt)-从零基础学起

办公软件教程-从零基础学起 Office XP主要包括:字处理软件Word、Excel、PowerPoint等应用程序。它们具有统一的界面、相似的常用工具栏及大同小异的操作方法,只是各自的侧重点有所不同。 Word是文字处理软件。它集成文字处理、表格处理和图形处理于一体,汇集了对各种对象的处理工具,使图片、图表、表格、艺术字等的处理得心应手。 Excel是以表格化数据处理为基础的集成化处理软件。它不但能实现电子表格数据处理,也具有数据库管理、统计图表自动生成等功能。 PowerPoint是创作电子演示文稿的软件。利用它可以方便地制作出集文字、图形、图像、声音、视频和动画于一体的多媒体演示文稿。 一、Word特点

1.对文档提供了多种查看方法; 如:普通视图、页面视图、大纲视图、Web版式视图、文档结构图、全屏显示、Web页预览、打印预览等。 2.具有专业级的表格处理功能; 3.使用方便的多栏彩色图文混排、艺术字处理; 4.具有功能很强的数学公式编辑器; 5.具有多种类型文件的转换功能。 二、窗口介绍 菜单栏、常用工具栏、格式工具栏、正文编辑区、状态栏、标尺、滚动条等。 注:工具栏的显示与隐藏(视图→工具栏→各种工具栏。) 三、页面设置:“文件”→“页面设置”。 1.纸张的大小(常用的纸张:A3、8K、B4、A4、16K、B5。) 2.设置页边距:调整正文到纸张边界[2] []大2小。 四、文档编辑 1.建立文档(Ctrl + N) (1)录入文字,录入时不要排版,每()1一段敲一次回车,每段前空两个汉字位置。(2)特殊符号录入:“插入”→“符号”或用动态键盘。 (3)显示/隐藏文档中的非打印符号。 2.保存文档 (1)保存(Ctrl + S) (2)另存为 3.打开和关闭文件(打开:Ctrl + O) 4.文档选择基本方法 (1)拖动选择

最新服务器基础知识(初学者必看)

服务器基础知识【初学者必看】 1. 什么是服务器 就像他的名字一样,服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服务器就是Internet网络上的资源仓库,正是因为有着种类繁多数量庞大内容丰富的服务器的存在,才使得Internet如此的绚丽多彩。 2. 服务器的种类和功能 (1) WWW服务器(WWW Server) WWW服务器也称为Web服务器(Web Server)或HTTP服务器(HTTP Server),它是Internet上最常见也是使用最频繁的服务器之一,WWW服务器能够为用户提供网页浏览、论坛访问等等服务。比如:我们在使用浏览器访问https://www.doczj.com/doc/dd3338296.html,的时候,实际上就是在访问Discuz!的WWW服务器,从该WWW服务器获取需要的论坛资料和网页。 (2) FTP服务器(FTP Server) FTP服务器是专门为用户提供各种文件(File)的服务器,FTP服务器上往往存储大量的文件,例如:软件、MP3、电影、程序等等。用户只要使用FTP客户端软件登录到FTP服务器上就可以从FTP服务器下载所需文件和资源到自己的电脑上,同时,

你也可以把自己电话上的文件上传到FTP上供其他用户下载,以实现文件资源的共享。 (3) 邮件服务器(Mail Server) e-mail是Internet上应用最频繁的服务之一,而Internet上每天数亿百亿计的电子邮件的收发都是通过邮件服务器实现的。邮件服务器就像邮局一样,可以为用户提供电子邮件的接收存储和发送服务。 除了以上介绍的3种主要服务器之外,还有很多其他类型的网络服务器,例如:数据库服务器(DatabaseServer)、代理服务器(Proxy Server)、域名服务器(Domain Name Server)等等…… 3. 服务器的操作系统 目前服务器中使用的操作系统主要有两类:Windows和Unix。 (1) Windows Windows是美国微软公司(Microsoft)开发的操作系统,在服务器领域,主要有Windows2000Server/Advanced Server/Data Center与Windows2003 Standard Edition/EnterpriseEdition操作系统,Windows的优点是操作简 单,由于Windows使用图形界面进行操作,因而对各种服务器软件功能配置简

计算机常用工具软件学习

计算机常用工具软件学习一个好的软件,除了给我们带来效率更重要的是为我们带来了快乐。下面我给大家介绍几款实用软件。 一、文件处理软件 软件名称:WinRAR 4.01 简体中文版 support 主要功能: 压缩文件 使用方法: 1.安装与卸载 winRAR的一般下载文件名为wzbeta32.exe,下载后运行该文件,按照系统的提示,选择安装路径、设置界面风格等,一般来说,一路“Enter”即可,winRAR就以默认方式安装到你的电脑上了。如果你觉得winRAR用起来不方便、不习惯,想卸掉它,你可以通过“开始=>程序=>WinRAR=>Uninstall WinRAR”或者通过控制面板的“添加/删除程序”来卸

载它。 2.启动 winRAR安装完成后,会在桌面、开始菜单和文件右键快捷菜单等处设置多种快捷启动方式,并与压缩包建立关联,压缩包的图标也将自动替换成winRAR的图标,以后双击压缩包就可方便地调用WinRAR为你打开压缩包,帮你工作了。 3.新建压缩包 启动winRAR后,让我们先来试试新建立一个压缩包。在标准界面窗口下,鼠标单击程序界面按钮工具条中的“New”,在弹出“New Archive”对话框中设置新建压缩包的名称、压缩的格式(注意,新建立的是空压缩包)等,选择“Add Dialog”复选框(如图4),单击OK,然后就可以在“Add from”列表框中选择需进行压缩打包的文件和文件夹,按“Add”按钮将其添加压缩到刚才建立的空压缩包中了。如果要压缩当前目录下列出的全部文件,点击“Add with wildcards”按钮;如果要保留压缩对象的目录结构,选择使用“Folders”项中的“Save extra folder info”复选框;如果要压缩文件夹及其下的子文件夹,选择“Include subfolders”复选框;要压缩文件夹中隐藏的文件,选择Attributes项中的“Include system and hidden files”复选框。在资源管理器窗口中,使用鼠标右键单击需进行压缩的文件夹,在弹出的菜单中选择“Add to RAR”命令,程序会弹出“Add”对话框,通过这种方式,也可以新建一个压缩包。 4.压缩包的解压 在查看压缩包中的文件时,我们可以在压缩包文件列表窗口中选择需进行解压的文件,点击界面中的“Extract”按钮,进行部分或全部文件的解压。大部分时候,我们不需要打开压缩包的文件,只需要使用鼠标右键单击需要解压的压缩包,然后在弹出的右键菜单中选择“Extract to…”选项,WinRAR将自动启动并让你制定解压后文件的存放文件夹,在弹出的右键菜单中一般还有一项“Extract to+压缩包当前目录/压缩包文件名”的选项,如果选择这一项的话,你就什么都不用费心了,WinRAR将在压缩包当前目录中建立一个新的文件夹,并将压缩包中的文件解压到这个新的文件夹中。 5.文件直接压缩成E-mail附件 为了适应网络对于压缩文档的需求,WinRAR在你选择一些文件或文件夹并单击鼠标右键时会增加一个选项“RAR and E-Mail…”(如图6),选中这个选项,它会自动压缩该文件,并打开默认的电子邮件程序新建一封信件,然后把该压缩包作为一个附件插入,这是以前版本的WinRAR所没有提供的功能。如果想将文件压缩后用电子邮件进行传送,保证你非常喜欢这个功能,因为它简直太方便了。 6.分卷压缩 虽然现在使用软盘的机会很少了,不过WinRAR的分卷压缩功能却一点没有减弱。在建立新的压缩包时,我们在创建压缩包所在盘时选择软盘盘符a:,然后在“Multiple Disk Spanning”下拉文本框中设置分卷压缩方式。其中“Automatic”项自动检测软盘可用空间,并进行分卷压缩文件的创建,一般选择此项。“Automatic +wipe first disk prompt”项自动检测软盘的可用空间,并进行分卷压缩文件的创建。在进行压缩时,提示用户是否删除软盘中已有的数据。在压缩过程中,当一张软盘满了时,WinRAR会提示插入下一张软盘。 二、汉化与翻译软件 软件名称:谷歌金山词霸合作版 2008 V1.186

PS基础知识入门学习

PS基础知识入门学习 熟悉界面 打开素材中的手提袋图片,可以看到Photoshop的六大界面: 1.需要处理的图像窗口; 2.菜单栏:可以选择其中的命令以对图形进行操作; 3.左边是工具箱:其中是各种绘制图形的工具和辅助工具; 4.工具选项栏:选择绘图工具后可以在这里选择各项参数; 5.右边是各种工作面板:在其中可以对图像进行各种操作; 6.最下面是状态栏:显示了当前对图像进行操作时的各种信息。 绘图与修图技能 1. 工具的使用方法 1)工具箱是工具大体可以分为:选取工具、绘图工具、路径工具、文字工具以及其他的一 些辅助工具。不同工具的使用方法都相似,这里我们使用制作青苹果这个例子来掌握它们的使用方法,效果图如下: 2)新建一个大小600×450像素、名为“青苹果”的图像文件。

3)建立一个图层,建立圆形选区。 4)设置渐变工具。在渐变编辑器中将左端色标设置为(R16,G69,B13),再增加新色标: (R89,G128,B42)位置17%,依次增加其他新色标:(R171,G214,B76)位置36%,(R131,G185,B49)位置55%,(R82,G118,B28)位置74%,(R108,G154,B38)位置100%

5)在工具选项栏中选择径向渐变按钮,在选区中从左上方进行填充。 中选中“动态形状”、“喷枪”和“其他动态”,把“其他动态”设置如下图:

7)工具栏中设置前景色为深棕色后用画笔工具画出苹果柄。 8)用减淡工具绘制苹果的高光。在工具选项栏中选择一种画笔,设置范围为“高光”,曝光 度为“16%”,在苹果上绘制出高光部分,取消选择。 9)最后绘制出投影部分。图层选项设置如下:

(仅供参考)服务器硬件入门基础知识

服务器硬件入门基础知识 开篇一:服务器主板 服务器主板概述 对于服务器而言,稳定性才是首要,服务器必须承担长年累月高负荷的工作要求,而且不能像台式机一样随意的重起,为了提高起可靠性普遍的做法都是部件的冗余技术,而这一切的支持都落在主板的肩上。下面我就来看看有关服务器主板的一些特性: 1、首先,服务器的可扩展性决定着它们的专用板型为较大的ATX,EATX或WATX。 2、中高端服务器主板一般都支持多个处理器,所采用的CPU也是专用的CPU。 3、主板的芯片组也是采用专用的服务器/工作站芯片组,比方Intel E7520、ServerWorks GC-HE等等,不过像入门级的服务器主板,一般都采用高端的台式机芯片组(比如Intel875P芯片组) 4、服务器通常要扩展板卡(比如如网卡,SCSI卡等),因此我们通常都会发现服务器主板上会有较多的PCI、PCI-X、PCI—E插槽。 5、服务器主板同时承载了管理功能。一般都会在服务器主板上集成了各种传感器,用于检测服务器上的各种硬件设备,同时配合相应管理软件,可以远程检测服务器,从而使网络管理员对服务器系统进行及时有效的管理。

6、在内存支持方面。由于服务器要适应长时间,大流量的高速数据处理任务,因此其能支持高达十几GB甚至几十GB的内存容量,而且大多支持ECC内存以提高可靠性(ECC内存是一种具有自动纠错功能的内存,由于其优越的性能使造价也相当高)。 7、存储设备接口方面。中高端服务器主板多采用SCSI接口、SATA接口而非IDE接口,并且支持RAID方式以提高数据处理能力和数据安全性。 8、在显示设备方面。服务器与工作站有很大不同,服务器对显示设备要求不高,一般多采用整合显卡的芯片组,例如在许多服务器芯片组中都整合有ATI的RAGE XL显示芯片,要求稍高点的就采用普通的AGP显卡。而如果是图形工作站,那一般都是选用高端的3DLabs、ATI等显卡公司的专业显卡。 9、在网络接口方面。服务器/工作站主板也与台式机主板不同,服务器主板大多配备双网卡,甚至是双千兆网卡以满足局域网与Internet的不同需求。 10、最后是服务器的价格方面。一般台式机主板顶天也不过1、2千,而服务器主板的价格则从1千多元的入门级产品到几万元甚至十几万元的高档产品都有! 推荐品牌:泰安、超微、Intel 开篇二:服务器CPU 服务器CPU概述 服务器是网络中的重要设备,要接受少至几十人、多至成千上万人的访问,因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。所以说CPU是计算机的“大脑”,是衡量服务器

AI CC 基础工具使用详细教程

AI CC 基础工具使用详细教程 我们可以发现AI CC 的工具栏用一条条直线将划分为几个区域,每个区域的工具所具备的功能都很相近,以下就以一个一个区其域进行每个工具功能的叙述: A. 选择工具 1选择工具(V ):选择、移动、缩放图像 功能: ●复制图形: 选择所要复制的图形--按住Alt--拖动所要复制图形到空白位置--即可复制图形 ●精确调整距离:双击选择工具--弹出选择对话框--定制精确距离--复制、预览效 果。 与PS 区别之处: ● Ctrl+Z :可无限次撤销操作●Ctrl+Shift+Z :取消撤销操作 快捷键:(使用任何快捷键时要处于无任何输入法状态下,否则快捷键无效)●Ctrl+D :复制并继续执行上一步动作(复制出相同距离的图形) ●Ctrl+R :标尺 按Ctrl+D 后:

●Ctrl+U:智能参考线 ●按住Shift,操作其他动作(移动、旋转):可以原来10倍的速度改变 ●Shift+Ctrl+Alt+K:键盘快捷键 ●Ctrl+T:调出字符面板 ●Shift+Ctrl+F9:调出路径面板 ●Ctrl+K:首选项面板 2直接选择工具(A):专用于选择锚点 ●同时选择多个锚点 法一:按住Shift,点击选择 法二:直接用鼠标框选 3编组选择工具:针对多个对象 ●与鼠标右键“编组”稍稍有区别,可以结合使用 4魔棒工具(Y):根据颜色不同进行选择,框选出颜色完全一致的所有对象 ●选择对象: 法一:加/减选对象:按住Shift进行选择 法二:(该方法前提是所选对象应有颜色)用魔棒工具点击索要选择对象, 就可以快速选择出与所点击对象颜色完全一致的所有图形 5套索工具:单独选择锚点或者选择一部分的锚点 ●与PS的区别:在AI中无选取这个概念,放开鼠标后,框选区域的线条 自动消失 B.形状工具 1矩形工具 a.圆角矩形: ●AI与PS的区别: AI有分页面区域和草稿区域,也就是说在AI中不是画布的区域(画布外的黑色区域)也可以进行作图,但是保存时并不将草稿区域的内容保存,而在 PS中只可以在画布区域进行作图 ●为什么叫圆角半径? 改变半径就可以改变弧度 ●改变圆角大小 选择圆角矩形工具绘制出所要大小----切记不要放开鼠标----点击上下方 向键:改变圆角大小;点击左方向键:变为直角;点击右方向键:变为

Office办公软件学习零基础

O f f i c e办公软件学习零 基础 文档编制序号:[KK8UY-LL9IO69-TTO6M3-MTOL89-

O f f i c e X P办公自动化软件Office XP主要包括:字处理软件Word、Excel、PowerPoint等应用程序。它们具有统一的界面、相似的常用工具栏及大同小异的操作方法,只是各自的侧重点有所不同。 Word是文字处理软件。它集成文字处理、表格处理和图形处理于一体,汇集了对各种对象的处理工具,使图片、图表、表格、艺术字等的处理得心应手。 Excel是以表格化数据处理为基础的集成化处理软件。它不但能实现电子表格数据处理,也具有数据库管理、统计图表自动生成等功能。PowerPoint是创作电子演示文稿的软件。利用它可以方便地制作出集文字、图形、图像、声音、视频和动画于一体的多媒体演示文稿。 一、Word特点 1.对文档提供了多种查看方法; 如:普通视图、页面视图、大纲视图、Web版式视图、文档结构图、全屏显示、Web页预览、打印预览等。

2.具有专业级的表格处理功能; 3.使用方便的多栏彩色图文混排、艺术字处理; 4.具有功能很强的数学公式编辑器; 5.具有多种类型文件的转换功能。 二、窗口介绍 菜单栏、常用工具栏、格式工具栏、正文编辑区、状态栏、标尺、滚动条等。 注:工具栏的显示与隐藏(视图→工具栏→各种工具栏。) 三、页面设置:“文件”→“页面设置”。 1.纸张的大小(常用的纸张:A3、8K、B4、A4、16K、B5。) 2.设置页边距:调整正文到纸张边界[2] []大2小。 四、文档编辑 1.建立文档(Ctrl + N) (1)录入文字,录入时不要排版,每()1一段敲一次回车,每段前空两个汉字位置。

第二课 学用基本绘图工具

课题:第二课学用基本绘图工具 第一课时:制作一幅简单画面 教学目标: 1、知识与技能 (1)掌握新建一幅适当大小的空白图像的基本操作。 (2)学会制作一幅新的画面。 2、过程与方法 本节课运用多媒体教学软件,教师通过示范演示,学生实践的形 式,通过演示法、任务驱动法完成本节课的教学。 3、情感态度与价值观 1)培养学生的动手能力。 2)培养学生的审美情趣及对知识的探究精神。 作。 教学重点 (1)让学生学会如何新建一幅空白图像。 (2)在学会建立空白图像的基础上制作一幅新画面。 教学难点 掌握制作图片工具的应用。 教学课时:1课时(理论+上机) 教学工具:多媒体教室、凌波多媒体广播教学系统,Photoshop6.0。 教学方法:讲解法、演示法、任务驱动法练习法。 教学过程: 导入: 通过对上节课的学习我们学会Photoshop的一些基本操作, photoshop为我们提供了多种绘图工具,利用这些工具可以方便的制作和修饰图像,今天我们将进一步学习一些制作、加工图像的基本操。 讲授新课 一、新建一幅适当大小的空白图像 1.在windows环境下,执行“开始—程序—adobe photoshop ”命令, 单击工具箱中的前景色色标,弹出“拾色器”对话框,拖动“选择前景色”方框右侧色谱条上的三角滑标,方框中出现所需的颜色时单击,然后单击按钮。

2.选定背景色单击工具箱中的背景色色标,弹出“拾色器”对话框, 选定一种背景颜色,如浅绿色,在单击按钮。 3.新建一幅空白图像 执行“文件——新建”命令,出现“新建”对话框,按照下面左图所示设定有关参数,然后单击按钮,窗口中会显示出以背景色为底色、宽8厘米、高3厘米的画面。 4.给图像背景添加渐变效果单击工具箱中的渐变按钮,选定这种工具,再在选项栏中单击渐变方式选择框中的向下按钮,打开一个列表框,双击其中的“前景色到背景色渐变”图标然后在画面中自上而下拖动鼠标指针,画面的底色就会出现自上而下的由前景色到背景色的渐变效果

语文学科是基础工具学科

语文学科是基础工具学科。它的目的是培养学生爱祖国语言文字,正确地理解和运用祖国语言,陶冶思想情操,发展思维,养成良好的语文学习习惯。学习语言,即指导学生理解语言文字,积累语言材料,掌握语言规律,发展语言能力。它是语文学科的特殊使命,具有重要的意义。学生学习好语文课是学习好其它课程的重要基础;教师上好语文课是提高教育教学质量的可靠保证。因此,如何上好语文课,是值得我们每一个语文教师探讨的话题。那么,如何才能上好语文课,我认为应该从以下几个方面做起: 一、教师应博览群书,扩大知识面 语文课程其知识含量大,涉及面广,包含着许多方方面面的知识,这就要求我们语文教师必须具备博览群书的优秀品质。只有博览群书,才能对这些相关的知识有所储备,有所理解,才能合理、正确解释和解答语文课中会出现的一些相关的问题,才至于出现知识性错误。 也只有博览群书,才能使我们的教师不断地丰富、充实和发展自己,我们才会有上好语文课的能力,具备上好语文课的气势,我们才会把上语文课当成是一种享受,而不是一种包袱。 也只有我们语文教师通过博览群书,让学生感受到我们无所不通,无所不晓,我们在学生心目中的地位才是崇高的和神圣的,学生从我们的身上看到了学好语文的希望,我们才有资格指导和教育学生,学生才会对我们所教的学科感兴趣,才有信心学好语文课。 二、如何欣赏语文教材 人们都说"热爱是最好的老师",一个语文教师,如果自己都不热爱自己所教学的语文课,不欣赏自己所教学的语文课中的教学内容,我们就无论如何也上不好语文课的。因此,我们要培养自己的欣赏的品质。学会欣赏语文课程体系,欣赏语文课程中的每一篇文选,欣赏语文课中的每一个知识点,欣赏上语文课中的每一个环节,欣赏学生学习语文课中的一些细节,欣赏学生学习语文课后的收获,欣赏学生的作品等。只有我们用欣赏的眼光看待语文课的一切过程和素材以及活动,我们的心理才会是愉悦的,我们的精神才会饱满,我们才愿意以十二分的热情投入到语文教学工作中去。 也只有我们教师首先能够欣赏语文课,我们才能对学生产生潜移默化的影响,让学生也用欣赏的眼光,欣赏的心态对待语文课,让学生在学习语文课的时候,充满乐趣,而不是枯燥无味,从而学好语文这门基础学科。 三、如何驾驭语文教材 语文教师要通过博览群书,深钻教材,对自己所教学的语文课程的全部内容,知识点,以及教学基本方法全面把握,既了解其基础情况,又了解未来发展的走向,努力提高自己的驾驭教材的能力,做到教学起来得心应手,游刃有余。 教师只有拥有驾驭教材的本领,要有"一览众山小"的宏大气势,这样,教师在教学语文课的过程中才能信心百倍,气势恢宏。教师用这种恢宏的气势才能更好地影响学生,促使学生学习好语文课,从而提高语文课的教学质量。 四、如何利用课程资源 课程资源是指形成课程的要素来源以及实施课程的必要而直接的条件。课程改革呼

15种学习与发展工具

学习与发展工具介绍 对于学习方式,以下将列举13种:1.聘请外部讲师做内训;2.内部讲师执行内训;3.外派员工学习;4.内部标杆学习;5.企业学习内刊;6.发起专题自学与创新活动;7.师徒制/导师制;8.外部标杆学习;9.组织视频学习;10.组织读书和知识竞赛活动;11.组织问题分析会;12.在线学习(E-learning);13.微学习、碎片学习;14.轮岗制;15.行动学习。 1.聘请外部讲师做内训 这是最常见的培训方式之一,已经为企业普遍采用。这种培训方式的通用形式是,选择一位来自外界的培训师,将需要培训的人员集中在一个特定的空间内,由那位培训师运用一定的专业培训设备和技巧对他们进行为期半天至三天不等的专门主题的培训。 这一培训方式的优点是: 1)将人员集中在一个特定空间里学习,避免了各种可能的干扰,学习效果相对较好; 2)培训师有专业培训经验,了解成人学习的特点,善于使用专业的培训技术和技巧,容易调动学习者的学习兴趣; 3)培训师可能具有企业内部培训师或管理人员所不具备的丰富的经验和知识,可以为学习者带来新的知识和技能; 4)由于这类培训师是“外来的和尚”,他们容易在学习者的心目中造成权威感,这将有利于学习者接受培训师的观点。 这一培训方式的弱点是: 1)成本较高。培训师的课酬、培训师及其助教的交通食宿费、培训场地和器材费、学习者脱产培训的直接工资成本、差旅费等,按照一个两天的培训进行计算,培训的直接成本在10.7万元左右【培训师课酬约40000元/2天;按30位学员计算,15位为当地学员,15位为出差参加培训学员,工资成本约21000元(人均月工资7000元);差旅补助费用为3000元,交通费为30000元(单程交通费1000元),住宿费用为6000元,场地使用费为5000元,其他费用为2000元】;除此之外,由于外部培训师不了解企业内部情况,他们在实施培训前往往需要进行需求调研,而任何调研活动都会导致企业资金和时间成本的增加; 2)培训师所授予的知识和技能可能并不适应企业的实际需要; 3)培训师在培训中所传达的某些信息可能导致学习者对本公司形成不

S软件学习基础教程

S软件学习基础教程文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

ADS软件学习 目录 基于Advaced Design System(简称ADS)软件资料的学习进行如下总结:对ADS软件用途、模块简介、各模块的功能进行描述,本文主要针对在原理图模块中进行电子电路的仿真过程的描述。 一、ADS软件简介 为谁服务 先进设计系统(Advanced Design System),简称ADS,是安捷伦科技有限公司(Agilent)为适应竞争形势,为了高效的进行产品研发生产,而设计开发的一款EDA软件。软件迅速成为工业设计领域EDA软件的佼佼者,因其强大的功能、丰富的模板支持和高效准确的仿真能力(尤其在射频微波领域),而得到了广大IC设计工作者的支持。ADS是高频设计的工业领袖。它支持系统和射频设计师开发所有类型的射频设计,从简单到最复杂,从射频∕微波模块到用于通信和航空航天∕国防的MMIC。

提出问题 通过从频域和时域电路仿真到电磁场仿真的全套仿真技术,ADS让设计师全面表征和优化设计。单一的集成设计环境提供系统和电路仿真器,以及电路图捕获、布局和验证能力——因此不需要在设计中停下来更换设计工具。 ADS是强大的电子设计自动化。它为蜂窝和便携电话、寻呼机、,以及雷达和卫星通信系统这类产品的设计师提供完全的设计集成。 ADS电子设计自动化功能十分强大,包含时域电路仿真(SPICE-like Simulation)、频域电路仿真 (Harmonic Balance、Linear Analysis)、三维电磁仿真 (EM Simulation)、通信系统仿真(Communication System Simulation)、数字信号处理仿真设计(DSP);ADS支持射频和工程师开发所有类型的RF设计,从简单到复杂,从离散的射频/微波模块到用于通信和航天/国防的集成MMIC,是当今国内各大学和研究所使用最多的微波/射频电路和通信系统软件。 此外Agilent公司和多家半导体厂商合作建立ADS Design Kit 及 Model File 供设计人员使用。使用者可以利用Design Kit 及软件仿真功能进行通信系统的设计、规划与评估,及MMIC/、模拟与数字电路设计。除上述仿真设计功能外,ADS软件也提供辅助设计功能,如Design Guide是以范例及指令方式示范电路或系统的设计流程,而Simulation Wizard是以步骤式界面进行电路设计与分析。ADS还能提供与其他EDA软件,如SPICE、Mentor Graphics的ModelSim、Cadence的NC-Verilog、Mathworks的Matlab 等做协仿真(Co-Simulation),加上丰富的元件应用模型Library及测量/验证仪器间的连接功能,将能增加电路与系统设计的方便性、速度与精确性。 二、ADS软件主要模块及功能 ?主窗口(Main Window) ADS软件主窗口是用来创建和管理Workspaces 和libraries 的工程项目管理系统。含有文件目录(File View)、项目目录(Fold View)、元器库目录(library View)。便于查看所需项目文件。 ?原理图窗口(Schematic window 原理图窗口是用来进行电路原理图的设计仿真。ADS提供各自基本元件模型,可以根

服务器基础知识(初学者必看)

精心整理服务器基础知识【初学者必看】 1. 什么是服务器? ?? 就像他的名字一样,服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服 2. ?? WWW服务器也称为Web服务器(Web Server)或HTTP服务器(HTTP Server),它是Internet上最常见也是使用最频繁的服务器之一,WWW服务器能够为用户提供网页浏览、论坛访问等等服务。比如:我们在使用浏览器访问?

? (2) FTP服务器(FTP Server)? 以从 (3)

?? e-mail是Internet上应用最频繁的服务之一,而Internet上每天数亿百亿计的电子邮件的收发都是通过邮件服务器实现的。邮件服务器就像邮局一样,可以为用户提供电子邮件的接收存储和发送服务。? ?? ……? 3. ? ?? Windows是美国微软公司(Microsoft)开发的操作系统,在服务器领域,主要有Windows2000Server/Advanced?Server/Data Center与Windows2003 Standard Edition/EnterpriseEdition操作系统,Windows的优点是操作简?

单,由于Windows使用图形界面进行操作,因而对各种服务器软件功能配置简便。但它的缺点也不可忽视,例如:Windows操? 作系统成本较高;安全性相对较低;能承受的访问量较低等等。? Linux, Linux 企业(包括电信企业和Google、百度、新浪、搜狐等等)的服务器都运行在Unix/Linux系统之上。?

4. Apache与IIS? ?Apache与IIS都属于WWW服务器,是世界上使用最多的两种WWW服务器。? ?IIS操议 协议 但IIS 的性能和安全性相对较差,并且IIS只能在Windows中使用,无法在UNIX中运行。? (2) Apache?

学习国画入门需准备的工具

学习国画入门需准备的工具 材料:1.锡管装得比较容易买到,就是市面上的盒装国画颜料,但是颗粒比较粗。 2.散装颜料块两种:1,小片的泡在水里化了就可以用(多备寸方小碟装颜料)2。小碗装的固体,用湿毛笔舔就可以用。这两种颗粒细,颜色正,但没有朱砂色。需要单买朱砂墨。 3.纸分生宣(没上矾),熟宣(上矾的)。画工笔用熟宣,不洇。推荐:蝉衣(是最薄的熟宣,透明度最好,正面有云母颗粒);清水书画;单冰雪;冰雪。 4.笔钩线用鼠獾毛的,较硬,弹性好。其他得像衣纹,小红毛,草帽吹等都可以。染笔用小白云,大白云都可以,要羊毫不要兼毫。 5. 胶矾到美术用品店买国画用的,顺便可以问问怎么调。先勾线,将线稿附在正稿之下,用勾线的笔勾,一定要用研的墨,这样渲染的时候不会洇开。 6.勾完裱纸,纸面用水喷湿,平铺在版上,四边用水溶胶带或者涂了胶水的牛皮纸带粘在版上,这样纸干了后平整,不起褶。不要刷太多的水,有点皱干了就好了,也不要烤,要阴干,防止纸面崩裂。纸干后用清水刷一遍,若有吸水的地方用胶矾水染上。 7.(染要准备两支笔,一枝湿,蘸色或墨,叫色笔,另一支要时时用水涮干净,用专门的清水不要拿来调墨,不能用画过的笔,水分不能多,叫染笔。色笔要有锋,用兼毫。染笔要干净用羊毫。染时先用色笔填色,然后用染笔将边缘晕染开)淡墨分染就是分黑白关系,然后开始用颜色罩染,一定要先染植物颜色再染矿物颜色。上色一开始要打底色,根据颜色而定,比如叶子一般用花清和墨色打底。红花用胭脂打底。开始几遍染色要淡才能匀。一般染30遍比较匀,听说何家英要染上百遍。每遍颜色要淡得跟水一样。中间15遍的时候用胶矾水固定(你觉得新画上的颜色会把纸上的颜色融化,就要固定,或者宣纸起毛也要固定)临摹宋代的花鸟,唐代人物,例如:簪花仕女图,烈女仁志图,挥扇仕女图,虢国夫人游春图,高逸图,韩熙载夜宴图……以上是工笔大法,下面是写意大法小写意:笔用兼毫,中长锋为主,墨用松烟墨,纸用生宣,砚台要能发墨为上,最好是方形的,临摹时按勾皴点染的顺序或勾皴染点。临宋画为上。如:范宽溪山行旅图,郭熙早春图,恩,那个,我想想,范宽雪霁寒林图,还有元代的黄公望富春山居图,还有明沈周庐山高。 爱好是第一动力,也是成功的关键,最好从基础学起,先入门,现在谈再多也没多大意思,如在云里雾中,多与这方面的朋友交流,找名家,你没基础,不会教你的,真的有没有这个天赋还很难说,学这个很难,其码应该能吃苦,耐得住寂寞,肯用功,贵在坚持,必须练好书法,连毛笔都不会用根本谈不上画中国画了,年轻不算晚,只要肯用功,有一定的天赋,有的人一学就很上手,也能画出好的作品来,理解能力,感觉好,悟性好,记住爱好是第一动力,有人只是一腔热情,过一段时间温度就下来了,这样肯定不行的如果是真爱好的话,你会成功的,这里有好多例子,成功是要付出的,,所谓技法不是一句话说的完的,艺无止境,等入门了,就体会到了他真正的内涵,!!

ps基本工具介绍初学者必看

p s基本工具介绍初学者 必看 集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]

广军影视2015-11-15 初学者必看 工具介绍 1、移动工具:可以对PS里的图层进行移动。 2、 矩形选框工具:可以对图像选择一个矩形的选择范围 单列选框工具:可以在图像或图层中绘制出1个像素高的横线或竖线区域,主要用于修复图像中丢失的像素。 椭圆选框工具:可以对图片选择一个椭圆或正圆的选择范围。【椭圆变正圆:按着shift画圆为正圆;按shift+alt是从中心点出发往外画正圆】 3、【取消选区:ctrl+d 或菜单栏【选择】--取消选择】 套索工具:可以用来选区不规则形状的图像【在图像适当的位置单机并按住鼠标左键,拖曳鼠标绘制出需要的选区,松开鼠标左键,选区会自动封闭】有羽化50所以看到的效果为圆选区) 属性栏红框:为选择方式选项【相加、相减、交叉】。 黄框:用于设定边缘的羽化程度。 白框:用于清除选区边缘的锯齿。 多边形套索工具:可以用来选取不规则的多边形图像(属性与套锁工具相同)【没有圆弧的图像沟边可以用这个工具,但不能勾出弧度】 【使用套索工具选区时,按enter键封闭选区。按ESC键取消选区,按delete 键,删除上一个单击建立的选区点。】

磁性套索工具:可以用来选取不规则的并与背景反差大的图像【不须按鼠标而直接移动鼠标,在工具头处会出现自动跟踪的线,这条线总是走向颜色与颜色边界处,边界越明显磁力越强,将首尾相接后可完成选择】 属性:“宽度”选项用于设定套索检测检测范围,磁性套索工具将在这个范围内选取反差最大的边缘。“对比度”选项用于设定选取边缘的灵敏度,数值越大,则要求边缘与背景的反差越大。“频率”选项用于设定选区点的速率,数值越大,标记速率越快,标记点越多。 频率57 频率71 对比度10% 对比度50% 4、

管理者的基本工具课案

1、5H1W分析法 Why What Where When Who How 原因对象地点时间人员方法 Why—何故 1)、为什么这项工作(或动作)是必不可少的? 2)、为什么这项工作要以这种方式进行? 3)、为什么完成这项工作需要这些投入? What—何事 1)、这是一项什么性质的工作? 2)、这项工作的目标是什么? 3)、这项工作的结果是什么? Where—何处 1)、这项工作是在哪里进行的? 2)、这项工作对工作环境有什么特殊要求? 3)、这项工作应当在何处、何种工作环境中进行? When—何时 1)、这项工作的开始时间、结束时间和持续时间? 2)、这项工作为什么持续这么久时间? Who—何人 应该由谁来从事这项工作? How—何法 1)、这项工作是怎么进行的? 2)、完成这项工作还有没有更好的方法? 在工作中应用5W1H法,不仅可以简化工作,对问题进行综合分析研究,而且还可以产生更新的创造性设想或决策。 高效团队建设中的“5W1H分析法” Where—我们在哪里 1)、通过分析团队所处环境来评估团队的综合能力,找出团队目前的综合能力对要达到的团队目的之间的差距。 2)、明确团队如何发挥优势、回避威胁、提高迎接挑战的能力。 When—我们什么时候采取行动 1)、合适的实际采取合适的行动时团队成功的关键,团队任务的启动。 2)、团队遇到困难或障碍时,团队应把握时机来进行分析与解决。 3)、团队面对内、外部冲突时应在什么时机进行舒缓或消除。 4)、在何时与何地取得相应的资源支持,都必须因势利导。 Who—我们是谁 1)、团队成员自我的深入认识。 2)、获得在团队成员之间形成共同的信念和一致的对团队目的的看法,以建立起团队运行的游戏规则。 Who—我们怎样行动 1)、怎样行动涉及到团队运行问题, 2)、团队内部各个成员之间也应有明确的岗位职责描述和说明,以建立团队成员的工作标准。 Why—我们为什么

服务器系统基础知识

服务器系统基础知识 1 什么是服务器? 服务器是计算机的一种,它是在网络操作系统的控制下为网络环境里的客户机提供(如PC) 共享资源(包括查询、存储、计算等)的高性能计算机,它的高性能主要体现在高速度的CPU 运算能力、长时间的可靠运行、强大的I/O 外部数据吞吐能力等方面。服务器主要为客户机提供Web 应用、数据库、文件、打印服务。简单的说,服务器就是在网络中为其他客户机提供服务的计算机. 2 服务器包括哪些子系统? CPU、内存、磁盘、扩展插槽、显示卡和网卡、电源、风扇。 3 服务器按处理器架构分哪几类? 巨型机与大型机(专用处理器)、小型机(IA-64,RISC处理器)、PC服务器(CISC处理器) 4 PC服务器按外形结构分类? A 塔式服务器(通用式服务器):具有较大的机箱尺寸,因此其内部扩展能力较强,可以安装的扩展板卡以及硬盘的数量都比较多 B 机架式服务器(机柜优化服务器):机箱尺寸比较小巧,在机柜中可以同时放置多台服务器,从而获得更高的处理能力。 C 刀片式服务器:超高密度服务器为动态的,空间紧缺的,向外扩展的环境而优化的快速部署。 5 服务器按CPU个数分类:? 4路及4路以上服务器(企业级服务器)、2路服务器(部门级服务器)、1路服务器(入门级服务器) 6 什么是内存? 内存是界于CPU 和外部存储之间,是CPU 对外部存储中程序与数据进行高速运算时存放程序指令、数据和中间结果的临时场所,它的物理实质就是一组具备数据输入输出和数据存储功能的高速集成电路。 7 服务器内存技术有哪些? ?Parity (校验) ?ECC ?ChipKill和高级ECC技术 ?双通道技术 ?内存交错技术 ?Registered内存 在线备用内存技术 内存镜像

文本预览