蚊子的httpclient笔记 - 伪静态技术

搭建前台项目

创建jt-web项目

选择骨架

1.选择骨架
在这里插入图片描述
2.定义项目名称
在这里插入图片描述

添加继承和依赖

  1. 添加继承
    在这里插入图片描述
  2. 添加依赖
    在这里插入图片描述

添加tomcat插件

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8092</port>
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>

在这里插入图片描述

配置文件编辑

编辑web.xml

<!--以监听器的方式启动Spring容器  -->
	<!--<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext*.xml</param-value>
	</context-param> -->
	<!--Spring的ApplicationContext载入 -->
	<!--<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener> -->

	<!--编码过滤器,以UTF8编码 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!--配置SpringMVC -->
	<servlet>
		<servlet-name>springmvc-web</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--指定SpringMVC配置文件 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/applicationContext*.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc-web</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
	<!--防止springMVC框架返回json时和html冲突报 406 错误 -->
	<servlet-mapping>
		<servlet-name>springmvc-web</servlet-name>
		<url-pattern>/service/*</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

编辑Spring配置文件

  1. 修改切入点表达式
    在这里插入图片描述

实现京淘首页跳转

需求:当用户访问www.jt.com/index.html时.自动访问京淘首页

  1. 编辑Controller
    在这里插入图片描述
  2. 修改Nginx实现反向代理
server {
		listen		80;
		server_name  www.jt.com;

		location / {
			proxy_pass http://localhost:8092;
			proxy_connect_timeout       3;  
			proxy_read_timeout          3;  
			proxy_send_timeout          3; 
		}
	}
  1. 修改hosts文件
# 京淘电商环境
127.0.0.1       image.jt.com
127.0.0.1       manage.jt.com
127.0.0.1       www.jt.com
127.0.0.1       sso.jt.com
127.0.0.1       cart.jt.com
127.0.0.1       order.jt.com
127.0.0.1       solr.jt.com
192.168.126.148 www.easymall.com

4.页面效果
在这里插入图片描述

前台业务实现

伪静态技术

静态页面特点

  1. 浏览器解析静态页面速度更快.
  2. 对于搜索引擎静态页面更加友好.容易被搜索引擎收录
  3. 交互性差.扩展性弱.

动态页面特点

  1. 交互性强.扩展性好
  2. 浏览器加载速度慢
  3. 搜索引擎不会收录动态页面数据.

伪静态技术

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结:以.html形式展现动态页面的技术.

HttpClient

介绍

HttpClient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了HttpClient。现在HttpClient最新版本为HttpClient 4.5 (GA) (2015-09-11)
总结:在java代码中发起Http请求,之后解析返回值结果即可.
特点:Http请求协议中参数类型:String 结果:html/json

Jar包导入

<!--httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>${httpclient.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.1</version>
		</dependency>

HttpClient入门案例

@Test
	Public void doGet() throws ClientProtocolException, IOException{
		//1.实例化HttpClient对象
		CloseableHttpClient client
		= HttpClients.createDefault(); 
		
		//定义url
		String url = "https://item.jd.com/10528983700.html";
		
		//定义请求类型
		HttpGet get = new HttpGet(url);
		String method =
		get.getRequestLine().getMethod();
		System.out.println("获取请求类型:"+method);
		String http = get.getRequestLine().getProtocolVersion().toString();
		System.out.println("获取请求协议:"+http);
		//发起http请求
		CloseableHttpResponse response = client.execute(get);
		
		//判断状态信息是否正确 200
		if(response.getStatusLine().getStatusCode() == 200){
			String result = EntityUtils.toString(response.getEntity());
			System.out.println(result);
		}
	}

Spring整合HttpClient

编辑pro文件

#从连接池中获取到连接的最长时间
http.request.connectionRequestTimeout=500
#5000
http.request.connectTimeout=5000
#数据传输的最长时间
http.request.socketTimeout=30000
#提交请求前测试连接是否可用
http.request.staleConnectionCheckEnabled=true

#设置连接总数
http.pool.maxTotal=200
#设置每个地址的并发数
http.pool.defaultMaxPerRoute=100
  1. spring管理配置文件
<list>
	<value>classpath:/property/jdbc.properties</value>
	<value>classpath:/property/redis.properties</value>
	<value>classpath:/property/httpclient.properties</value>
</list>

编辑Spring配置文件

<!--定义httpclient连接池 -->
<bean id="httpClientConnectionManager"  class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager" destroy-method="close">
	<!--设置连接总数 -->
	<property name="maxTotal" value="${http.pool.maxTotal}"></property>
	<!--设置每个地址的并发数 -->
	<property name="defaultMaxPerRoute" value="${http.pool.defaultMaxPerRoute}"></property>
</bean>

<!--定义HttpClient工厂,这里使用HttpClientBuilder构建-->
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
	<property name="connectionManager" ref="httpClientConnectionManager"></property>
</bean>

<!--得到httpClient的实例 -->
<bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build"/>

<!--定期清理无效的连接 -->
<bean class="com.jt.common.util.IdleConnectionEvictor" destroy-method="shutdown">
	<constructor-arg index="0" ref="httpClientConnectionManager"/>
	<!--间隔一分钟清理一次 -->
	<constructor-arg index="1" value="60000"/>
</bean>

<!--定义requestConfig的工厂 -->
<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
	<!--从连接池中获取到连接的最长时间 -->
	<property name="connectionRequestTimeout" value="${http.request.connectionRequestTimeout}"/>
	<!--创建连接的最长时间 -->
	<property name="connectTimeout" value="${http.request.connectTimeout}"/>
	<!--数据传输的最长时间 -->
	<property name="socketTimeout" value="${http.request.socketTimeout}"/>
	<!--提交请求前测试连接是否可用 -->
	<property name="staleConnectionCheckEnabled" value="${http.request.staleConnectionCheckEnabled}"/>
</bean>	

<!--得到requestConfig实例 -->
<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build"/>

编辑工具类方法

@Service
Public class HttpClientService {

Private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientService.class);

@Autowired(required=false)
Private CloseableHttpClient httpClient;

@Autowired(required=false)
Private RequestConfig requestConfig;


/**
     * url:addUser?id=1&name=tom
     * httpClient get请求方式
     * 参数: 1.String url 2.Map<String,String>,3.字符编码
     * /*	//addUser?id=1&name=tom
		String paramUrl = url + "?";
		for (Map.Entry<String,String> entry : params.entrySet()) {
			String key = entry.getKey();
			String value = entry.getValue();
			paramUrl = paramUrl + key + "=" + value + "&";
			}
		
		paramUrl = paramUrl.substring(0, paramUrl.length()-1);*/
public String doGet
    (String url,Map<String,String> params,Stringcharset){
	String result = null;
	
	//1.判断字符集编码是否为null
	if(StringUtils.isEmpty(charset)){
		charset = "UTF-8";
	}
	
	try {
		//2.判断是否有参数
	if(params != null){
		URIBuilder builder = new URIBuilder(url);
		
		for (Map.Entry<String,String>entry : params.entrySet()) {
			
			builder.addParameter(entry.getKey(), entry.getValue());
				}
		//利用工具类实现url拼接
		url = builder.build().toString();
	}
		
	//发起http请求
	HttpGet httpGet = new HttpGet(url);
		httpGet.setConfig(requestConfig);
		CloseableHttpResponse httpResponse = 
				httpClient.execute(httpGet);
		
		if(httpResponse.getStatusLine()
				.getStatusCode() == 200){
			//获取返回值结果
			result = EntityUtils.
					toString(httpResponse.getEntity(),charset);
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	returnresult;
    }

//重载方法
public String doGet(String url){
	return doGet(url,null,null);
    }

public String doGet(String url,Map<String,String>params){
	return doGet(url, params, null);
    }
}

实现商品展现

HttpClient调用流程

在这里插入图片描述

编辑前台Controller

@RequestMapping("/{itemId}")
	public String findItemById(@PathVariable Long itemId, Model model){
		Item item = itemService.findItemById(itemId);
		model.addAttribute("item", item);
		
		ItemDesc itemDesc = itemService.findItemDescById(itemId);
		model.addAttribute("itemDesc", itemDesc);
		//跳转到商品展现页面
		return"item";
	}

编辑前台Service

@Override
	Public ItemDesc findItemDescById(Long itemId) {
		String url = "http://manage.jt.com/web/item/desc/"+itemId;
		//JSON串
		String result = httpClient.doGet(url);
		ItemDesc itemDesc = null;
		try {
			itemDesc = objectMapper.readValue(result,ItemDesc.class);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		r
		return itemDesc;
	}

编辑后台Controller

@Controller
@RequestMapping("/web")
Public class WebItemController {
	
	@Autowired
	Private ItemService itemService;
	
	@RequestMapping("/item/{itemId}")
	@ResponseBody
	public Item findItemById(@PathVariable Long itemId){
		
		return itemService.finditemById(itemId);
	}
	
	@RequestMapping("/item/desc/{itemId}")
	@ResponseBody
	Public ItemDesc findItemDescById(@PathVariable Long itemId){
		
		Return itemService.findItemDescById(itemId);
	}
}

编辑后台Service

/**
	 * 1.手写sql手动返回po.item
	 * 2.编辑vo.Mapper操作item表
	 * 3.直接返回manage.中的pojo对象json返回
	 * 4.不用common中po在web层添加pojo对象
	 */
	@Override
	public Item finditemById(Long itemId) {
		return itemMapper.selectByPrimaryKey(itemId);
	}

	//之前写过
	@Override
	Public ItemDesc findItemDescById(Long itemId) {
		Return itemDescMapper.selectByPrimaryKey(itemId);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值