如何在JavaServer Pages中使用Salesforce REST API

摘要:本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com (同时使用HTTP(S)和JSON)管理您的数据的分步过程。

在此示例中,我将Mac OS X 10.9.2与Apache Tomcat 7服务器和Java 1.7一起使用。 Eclipse Java EE版是用于开发和测试的IDE。 本教程中给出的说明也应适用于其他平台的较小修改。

如果要访问本教程中的整个示例代码,则可以在以下位置访问它: github.com/seethaa/force_rest_example

所有代码已更新为可与httpclient 4.3库一起使用。

什么是REST?

REST代表表象小号泰特贸易交接,并且是无状态的客户端-服务器通信协议通过HTTP。

为什么以及何时在Java中为JSP使用REST API

REST API非常适合需要大量交互并使用同步通信来传输数据的浏览器应用程序。 Salesforce REST API为简单的Web服务提供了与Force.com进行交互的编程接口,并支持XML和JSON格式。 Salesforce REST API非常适合移动应用程序或动态网站,以在Web服务器上快速检索或更新记录。 虽然应为BulkAPI保留批量记录检索,但此轻量级的REST API可以用于常见服务器页面,这些页面涉及快速更新和频繁的用户交互,例如更新单个用户记录。

设置您的开发帐户和前提条件

您将需要以下内容:

  1. 转到https://developer.salesforce.com/signup并注册您的免费DE帐户。 就本示例而言,即使您已经有一个帐户,我也建议注册一个Developer Edition。 这样可以确保您在启用了最新功能的情况下获得干净的环境。
  2. Java应用程序服务器。 我在Mac OS X和Eclipse上使用Apache Tomcat 7作为IDE创建了我的数据库。 http://developer.salesforce.com/page/Force.com_IDE上还有一个免费的Eclipse插件,但本教程使用了原始的Eclipse设置。
  3. 使用http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html在Tomcat服务器上配置SSL。 如果您在Eclipse中进行开发,请确保在Eclipse环境中的server.xml文件中添加连接器部分,例如:
    <Connector SSLEnabled="true" clientAuth="false" keystoreFile="/Users/seetha/.keystore" keystorePass="password" maxThreads="200" port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS"/>
  4. 将所需的jar文件添加到WebContent / WEBINF / lib。 您将需要commons-codec-1.6.jarhttpclient4.3.3.jarhttpcore-4.3.2.jarcommons-logging-1.1.3.jarjava-json.jar 。 对于Eclipse,我还必须确保所有jar都已添加到构建路径(右键单击Project→Build Path→配置构建路径→选择Libraries选项卡→单击Add Jars→从WEBINF / lib文件夹中选择Jar文件。

创建一个连接的应用程序

  1. 返回Force.com DE,通过控制台创建一个新的Connected App。 单击设置→构建→创建→应用程序。 向下滚动到“已连接的应用程序”部分,然后单击“新建”按钮。
    • 确保回调URL为http:// localhost:8080 / <your_app_context_path> / oauth / _callback

      (您可以通过返回Eclipse找到应用程序上下文路径:右键单击Project→Properties→Web Project Settings→Context root)

    • 选中“启用OAuth设置”复选框
    • 本教程所需的OAuth范围(请参见图1)是“访问和管理数据(api)”和“通过Web提供对数据的访问”(web),但是应根据您的要求更改这些范围。
    • 图1:创建新的连接的应用程序

      图1:创建新的连接的应用程序

  2. 复制ClientID和Client Secret(参见图2),因为这两个都将在下一步中使用。
    图2:具有用户密钥和机密的连接的应用程序示例

    图2:具有用户密钥和机密的连接的应用程序示例

    认证方式

    需要将三个文件导入到您的JSP项目中,如下所示:

    index.html

    <!DOCTYPE html PUBLIC "­//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http­equiv="Content­Type" content="text/html; charset=UTF­8">
    <title>REST/OAuth Example</title>
    </head>
    <body>
    	<script type="text/javascript"  language="javascript">
    	if (location.protocol != "https:") {
    		document.write("OAuth  will not work correctly from plain http. "+ "Please use an https URL.");
    	} else {
    		document.write("<a href=\"oauth\">Run Connected App demo via REST/OAuth.</a>");
    	}
    	</script>
    </body>
    </html>

    OAuthConnectedApp.java

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.http.Consts; 
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    
    @WebServlet(name  = "oauth", urlPatterns = { "/oauth/*", "/oauth" }, initParams = {
    // clientId is 'Consumer Key' in the Remote Access UI
    //**Update with your own Client ID
    @WebInitParam(name  = "clientId", value = "3MVG9JZ_r.QzrS7jzujCYrebr8kajDEcjXQLXnV9nGU6PaxOjuOi_n8EcUf0Ix9qqk1lYCa4_Jaq7mpqxi2YT"),
    // clientSecret is 'Consumer Secret' in the Remote Access UI
    //**Update with your own Client Secret
    @WebInitParam(name  = "clientSecret", value = "2307033558641049067"),
    // This must be identical to 'Callback URL' in the Remote Access UI
    //**Update with your own URI
    @WebInitParam(name  = "redirectUri", value = "http://localhost:8080/force_rest_example/oauth/_callback"),
    @WebInitParam(name  = "environment", value = "https://login.salesforce.com"), })
    
    /**
    * Servlet parameters
    * @author  seetha
    *
    */
    public class OAuthConnectedApp  extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	private static final String ACCESS_TOKEN = "ACCESS_TOKEN";
    	private static final String INSTANCE_URL = "INSTANCE_URL";
    
    	private String clientId = null;
    	private String clientSecret = null;
    	private String redirectUri = null;
    	private String environment = null;
    	private String authUrl = null;
    	private String tokenUrl = null;
    	
    	public void init() throws ServletException {
    		
    		clientId = this.getInitParameter("clientId");
    		clientSecret = this.getInitParameter("clientSecret");
    		redirectUri = this.getInitParameter("redirectUri");
    		environment = this.getInitParameter("environment");
    
    		try {
    
    			authUrl = environment
    			+ "/services/oauth2/authorize?response_type=code&client_id="
    			+ clientId + "&redirect_uri="
    			+ URLEncoder.encode(redirectUri, "UTF­8");
    		}
    		catch (UnsupportedEncodingException e) {
    			throw new ServletException(e);
    		}
    
    		tokenUrl = environment + "/services/oauth2/token";
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse  response) throws ServletException, IOException {
    	
    		String accessToken = (String) request.getSession().getAttribute(ACCESS_TOKEN);
    
    		//System.out.println("calling doget");
    		if (accessToken == null) {
    			String instanceUrl = null;
    
    			if (request.getRequestURI().endsWith("oauth")) {
    				// we need to send the user to authorize
    				response.sendRedirect(authUrl);
    				return;
    			}
    			else {
    				System.out.println("Auth successful ­ got callback");
    				String code = request.getParameter("code");
    
    				// Create an instance of HttpClient.
    				CloseableHttpClient  httpclient = HttpClients.createDefault();
    
    				try{
    					// Create an instance of HttpPost.
    					HttpPost httpost = new HttpPost(tokenUrl);
    
    					// Adding all form parameters in a List of type NameValuePair
    					List<NameValuePair>  nvps = new ArrayList<NameValuePair>();
    					nvps.add(new BasicNameValuePair("code", code));
    					nvps.add(new BasicNameValuePair("grant_type","authorization_code"));
    					nvps.add(new BasicNameValuePair("client_id", clientId));
    					nvps.add(new BasicNameValuePair("client_secret", clientSecret));
    					nvps.add(new BasicNameValuePair("redirect_uri", redirectUri));
    
    					httpost.setEntity(new  UrlEncodedFormEntity(nvps, Consts.UTF_8));
    					
    					// Execute the request.
    					CloseableHttpResponse closeableresponse=httpclient.execute(httpost);
    					System.out.println("Response Statusline:"+closeableresponse.getStatusLine());
    
    					try {
    						// Do the needful with entity.
    						HttpEntity entity = closeableresponse.getEntity();
    						InputStream rstream = entity.getContent();
    						JSONObject authResponse = new JSONObject(new JSONTokener(rstream));
    
    						accessToken = authResponse.getString("access_token");
    						instanceUrl = authResponse.getString("instance_url");
    
    					} catch (JSONException e) {
    						// TODO Auto­generated catch block e.printStackTrace();
    						e.printStackTrace();
    					} finally {
    						// Closing the response
    						closeableresponse.close();
    					}
    				} finally {
    					httpclient.close();
    				}
    
    			}
    
    			// Set a session attribute so that other servlets can get the access token
    			request.getSession().setAttribute(ACCESS_TOKEN, accessToken);
    
    			// We also get the instance URL from the OAuth response, so set it in the session too
    			request.getSession().setAttribute(INSTANCE_URL, instanceUrl);
    		}
    
    		response.sendRedirect(request.getContextPath() + "/ConnectedAppREST");
    	}
    	
    }

    ConnectedAppREST.java

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.net.URISyntaxException;
    import java.util.Iterator;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpDelete;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    
    @WebServlet(urlPatterns = { "/ConnectedAppREST"  })
    /**
    * Demo for Connect App/REST API
    * @author  seetha
    *
    */
    public class ConnectedAppREST  extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    	private static final String ACCESS_TOKEN = "ACCESS_TOKEN";
    	private static final String INSTANCE_URL = "INSTANCE_URL";
    	
    	private void showAccounts(String  instanceUrl, String accessToken,
    		PrintWriter writer) throws ServletException, IOException {
    		
    		CloseableHttpClient  httpclient = HttpClients.createDefault();
    
    		HttpGet httpGet = new HttpGet();
    
    		//add key and value
    		httpGet.addHeader("Authorization", "OAuth " + accessToken);
    
    		try {
    		
    			URIBuilder builder = new URIBuilder(instanceUrl+ "/services/data/v30.0/query");
    			builder.setParameter("q", "SELECT Name, Id from Account LIMIT 100");
    
    			httpGet.setURI(builder.build());
    
    			CloseableHttpResponse  closeableresponse = httpclient.execute(httpGet);
    			System.out.println("Response Status line :" + closeableresponse.getStatusLine());
    			
    			if (closeableresponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    				// Now lets use the standard java json classes to work with the results
    				try {
    					// Do the needful with entity.
    					HttpEntity entity = closeableresponse.getEntity();
    					InputStream rstream = entity.getContent();
    					JSONObject authResponse = new JSONObject(new JSONTokener(rstream));
    
    					System.out.println("Query response: " + authResponse.toString(2));
    
    					writer.write(authResponse.getInt("totalSize") + " record(s) returned\n\n");
    
    					JSONArray results = authResponse.getJSONArray("records");
    					
    					for (int i = 0; i < results.length(); i++) {
    					writer.write(results.getJSONObject(i).getString("Id")
    						+ ", "
    						+ results.getJSONObject(i).getString("Name")
    						+ "\n");
    					}
    					
    					writer.write("\n");
    				}
    				catch (JSONException e) {
    					e.printStackTrace();
    					throw new ServletException(e);
    				}
    			}
    			
    		} catch (URISyntaxException  e1) {
    			// TODO Auto­generated catch block
    			e1.printStackTrace();
    		} finally {
    			httpclient.close();
    		}
    	}
    	
    	private String createAccount(String  name, String instanceUrl,
    		String accessToken, PrintWriter writer) throws ServletException, IOException {
    		
    		String accountId = null;
    		CloseableHttpClient  httpclient = HttpClients.createDefault();
    		JSONObject account = new JSONObject();
    		
    		try {
    			account.put("Name",  name);
    		}
    		catch (JSONException e) {
    			e.printStackTrace();
    			throw new ServletException(e);
    		}
    		
    		HttpPost httpost = new HttpPost(instanceUrl+  "/services/data/v30.0/sobjects/Account/");
    
    		httpost.addHeader("Authorization", "OAuth " + accessToken);
    
    		StringEntity messageEntity = new StringEntity( account.toString(), ContentType.create("application/json"));
    
    		httpost.setEntity(messageEntity);
    
    		// Execute the request.
    		CloseableHttpResponse  closeableresponse = httpclient.execute(httpost);
    		System.out.println("Response Status line :" + closeableresponse.getStatusLine());
    		
    		try {
    		
    			writer.write("HTTP status " + closeableresponse.getStatusLine().getStatusCode() + " creating account\n\n");
    
    			if (closeableresponse.getStatusLine().getStatusCode()  == HttpStatus.SC_CREATED) {
    			
    				try {
    				
    					// Do the needful with entity.
    					HttpEntity entity = closeableresponse.getEntity();
    					InputStream rstream = entity.getContent();
    					JSONObject authResponse = new JSONObject(new JSONTokener(rstream));
    					
    					System.out.println("Create response: " + authResponse.toString(2));
    
    					if (authResponse.getBoolean("success")) {
    						accountId = authResponse.getString("id");
    						writer.write("New record id " + accountId + "\n\n");
    					}
    					
    				} catch (JSONException e) {
    					e.printStackTrace();
    					// throw new ServletException(e);
    				}
    			}
    		}
    		finally {
    			httpclient.close();
    		}
    
    		return accountId;
    	}
    	
    	private void showAccount(String  accountId, String instanceUrl,
    		String accessToken, PrintWriter writer) throws ServletException, IOException {
    
    		CloseableHttpClient  httpclient = HttpClients.createDefault();
    		HttpGet httpGet = new HttpGet();
    	
    		//add key and value
    		httpGet.addHeader("Authorization", "OAuth " + accessToken);
    		
    		try {
    		
    			URIBuilder builder = new URIBuilder(instanceUrl + "/services/data/v30.0/sobjects/Account/" + accountId);
    
    			httpGet.setURI(builder.build());
    
    			//httpclient.execute(httpGet);
    
    			CloseableHttpResponse  closeableresponse = httpclient.execute(httpGet);
    			System.out.println("Response Status line :" + closeableresponse.getStatusLine());
    			
    			if (closeableresponse.getStatusLine().getStatusCode()  == HttpStatus.SC_OK) {
    
    				try {
    				
    					// Do the needful with entity.
    					HttpEntity entity = closeableresponse.getEntity();
    					InputStream rstream = entity.getContent();
    					JSONObject authResponse = new JSONObject(new JSONTokener(rstream));
    					
    					System.out.println("Query response: " + authResponse.toString(2));
    					writer.write("Account  content\n\n");
    					
    					Iterator iterator = authResponse.keys();
    
    					while (iterator.hasNext()) {
    						String key = (String) iterator.next();
    
    						Object obj = authResponse.get(key);
    						String value = null;
    				
    						if (obj instanceof String) {
    							value = (String) obj;
    						}
    
    						writer.write(key + ":" + (value != null ? value : "") + "\n");
    					}
    
    					writer.write("\n");
    					
    				} catch (JSONException e) {
    					e.printStackTrace();
    					throw new ServletException(e);
    				}
    			}
    			
    		}
    		catch (URISyntaxException  e1) {
    			// TODO Auto­generated catch block
    			e1.printStackTrace();
    		} finally {
    			httpclient.close();
    		}
    	}
    	
    	private void updateAccount(String  accountId, String newName, String city, String instanceUrl, String accessToken, PrintWriter writer) throws ServletException, IOException {
    		
    		CloseableHttpClient  httpclient = HttpClients.createDefault();
    
    		JSONObject update = new JSONObject();
    		
    		try {
    			update.put("Name", newName);
    			update.put("BillingCity", city);
    		}
    		catch (JSONException e) {
    			e.printStackTrace();
    			throw new ServletException(e);
    		}
    		
    		HttpPost httpost = new HttpPost(instanceUrl + "/services/data/v30.0/sobjects/Account/" +accountId+"?_HttpMethod=PATCH");
    		httpost.addHeader("Authorization", "OAuth " + accessToken);
    		StringEntity messageEntity = new StringEntity( update.toString(), ContentType.create("application/json"));
    
    		httpost.setEntity(messageEntity);
    		
    		// Execute the request.
    		CloseableHttpResponse  closeableresponse = httpclient.execute(httpost); System.out.println("Response Status line :" + closeableresponse.getStatusLine());
    		
    		try {
    			writer.write("HTTP status " + closeableresponse.getStatusLine().getStatusCode() + " updating account " + accountId + "\n\n");
    		} finally {
    			httpclient.close();
    		}
    	}
    	
    	private void deleteAccount(String  accountId, String instanceUrl, String accessToken, PrintWriter writer) throws IOException {
    
    		CloseableHttpClient  httpclient = HttpClients.createDefault();
    
    		HttpDelete delete = new HttpDelete(instanceUrl + "/services/data/v30.0/sobjects/Account/" + accountId);
    
    		delete.setHeader("Authorization", "OAuth " + accessToken);
    
    		// Execute the request.
    		CloseableHttpResponse  closeableresponse = httpclient.execute(delete);
    		System.out.println("Response Status line :" + closeableresponse.getStatusLine());
    		
    		try {
    			writer.write("HTTP status " + closeableresponse.getStatusLine().getStatusCode() + " deleting account " + accountId + "\n\n");
    		} finally {
    			delete.releaseConnection();
    		}
    	}
    	
    	/**
    	* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
    	*      response)
    	*/
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse  response) throws ServletException, IOException {
    	
    		PrintWriter writer = response.getWriter();
    
    		String accessToken = (String) request.getSession().getAttribute( ACCESS_TOKEN);
    
    		String instanceUrl = (String) request.getSession().getAttribute( INSTANCE_URL);
    
    		if (accessToken == null) {
    			writer.write("Error ­ no access token");
    			return;
    		}
    		
    		writer.write("We have an access token: " + accessToken + "\n" + "Using instance " + instanceUrl + "\n\n");
    
    		showAccounts(instanceUrl, accessToken, writer);
    
    		String accountId = createAccount("My New Org", instanceUrl, accessToken, writer);
    
    		if (accountId == null) {
    			System.out.println("Account ID null");
    		}
    
    		showAccount(accountId,  instanceUrl, accessToken, writer);
    		showAccounts(instanceUrl, accessToken, writer);
    		
    		updateAccount(accountId, "My New Org, Inc", "San Francisco", instanceUrl, accessToken, writer);
    
    		showAccount(accountId,  instanceUrl, accessToken, writer);
    
    		deleteAccount(accountId, instanceUrl, accessToken, writer);
    
    		showAccounts(instanceUrl, accessToken, writer);
    		
    	}
    	
    }
  3. 更改OAuthConnectedApp.java以基于Connected App配置替换Client ID,Client Secret和Callback URI字段。
  4. 在Eclipse(请参见图3)中或从外部启动Tomcat服务器,并导航到https:// localhost:8443 / <your_app_context_path> /
    图3:在Eclipse中运行Tomcat服务器

    图3:在Eclipse中运行Tomcat服务器


    图4:检索对象屏幕

    图4:检索对象屏幕

  5. 除非通过HTTPS,否则单击上面的链接(请参见图4)将不起作用,并且必须将SSL配置为Tomcat的端点。

    如果所有配置都正确完成,您应该会看到一个salesforce.com登录屏幕(请参见图5)。 继续并使用salesforce.com凭据登录以授权Web应用程序访问资源。

    图5:OAuth的Salesforce.com登录屏幕

    图5:OAuth的Salesforce.com登录屏幕

  6. 登录将允许ConnectedAppREST演示执行创建,显示,更新和删除记录的方法(请参见图6)。
    图6:Connected App REST演示的输出

    图6:Connected App REST演示的输出

*提示和警告

  1. 确保您拥有一个Developer Edition(DE)帐户,因为Professional,Enterprise,Developer等之间存在细微差别。Developer版本是免费的,并且不会过期(除非一年后未使用)。
  2. OAuthConnectedApp.java中的回调URL必须与添加到连接的应用程序的URL相同。
  3. 如果收到HTTP 403错误,则表示正在访问您请求的资源“被禁止”。 检查您用来访问的用户名/帐户是否具有适当的权限。
  4. 确保index.html直接在WebContent目录下。

资源资源

有关全面的设置或资源,请访问: http : //developer.salesforce.com/en/mobile/resources

参考文献

  1. Force.com REST API开发人员指南 (PDF)
  2. 使用Force.com REST API

翻译自: https://www.javacodegeeks.com/2014/06/how-to-use-salesforce-rest-api-with-your-javaserver-pages.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaServer Pages (JSP) 技术提供了一种简单快速的方法来创建显示动态生成内容的 Web 页面。由业界处于领先地位的 Sun 公司制定了相关的 JSP 技术规范,该规范定义了如何在服务器和 JSP 页面间进行交互,还描述了页面的格式和语法。 JSP 技术的工作原理? JSP 页面使用 XML 标签和 scriptlets(一种使用 Java 语言编写的脚本代码),封装了生成页面内容的逻辑。它将各种格式的标签(HTML 或者 XML)直接传递回响应页面。通过这种方式,JSP 页面实现了页面逻辑与其设计和显示的分离。 JSP 技术是 Java 系列技术的一部分。JSP 页面被编译成 servlets,并可能调用 JavaBeans 组件(beans) 或 Enterprise JavaBeans 组件(企业 beans),以便在服务器端处理。因此,JSP 技术在构建可升级的基于 web 的应用程序时扮演了重要角色。 JSP 页面并不局限于任何特定的平台或 web 服务器上。JSP 规范在业界有着广泛的适应性。 什么是 servlet? 相对于浏览器上运行的 applets 而言,servlet 是在服务器上运行的,用 Java 语言编写的程序。详细信息可访问 http://java.sun.com/products/servlet. 我已经采用了servlets,为何还需要 JSP 技术呢? 既然 JSP 页面也要被编译成 servlets,那么理论上,您可以直接写 servlets 来支持您的基于 web 的应用程序。然而,JSP 技术通过将页面内容和显示逻辑分开,简化了创建网页的过程。在许多应用程序,需将模板内容和动态生成的数据一块发送到客户端。基于此考虑,使用 JSP 页面技术将比全部用 servlets 来写要方便得多。 JSP 规范与 Java 2 Platform, Enterprise Edition 的关系如何? JSP 2.0 规范是 Java 2 Platform, Enterprise Edition 1.4 的重要组成部分。 在构建基于 web 前端显示的分布式企业应用程序方面,JSP 和 EJB 技术的结合显示出强大的力量。 有哪些 web 服务器支持 JSP 技术? 有许多 JSP 技术实现可用于不同的 web 服务器。要获取最新已被官方支持的 web 服务器信息 ,请访问 http://java.sun.com/products/jsp/industry.html。 Sun 公司是否提供对 JSP 规范的参考实现? J2EE SDK 是 JavaTM 2 Platform, Enterprise Edition 的参考实现。Sun 在 J2EE SDK 改装并集成了 Tomcat JSPJava Servlet 实现。在应用程序部署和发布之前,可将J2EE SDK作为开发环境。Tomcat 是免费和开放源代码的 Java Servlet 和 JSP 技术的实现,它由 Apache Software Foundation 的 Jakarta 项目组开发。可从 http://jakarta.apache.org 下载。Tomcat 的商业应用需要有 Apache Software Foundation(ASF)的许可,并且可在 Apache 的网站上获取二进制和源代码的版本。JSP 技术的实现是 J2EE SDK 的一部分。 JSP 技术与其他产品技术相比有什么不同? JSP 技术是行业协作的结果,它的设计是开放的,符合行业标准的,并支持绝大多数的服务器、浏览器和相关工具。由于使用可重用的组件和标签取代了对页面本身脚本语言的严重依赖,JSP 技术大大加快了开发的速度。所有 JSP 的实现均支持以 Java 编程语言为基础的脚本语言,它有与生俱来的可适应性,支持复杂的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值