day12-京淘前台搭建

1.搭建前台项目

1.1 创建jt-web项目

1.选择骨架
在这里插入图片描述

2.定义项目名称
在这里插入图片描述

3.添加继承
在这里插入图片描述

4.添加依赖
在这里插入图片描述

5.添加tomcat插件

/jt-manage/pom.xml

<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>

在这里插入图片描述

1.2 编辑配置文件

1.2.1 编辑web.xml

/jt-web/src/main/webapp/WEB-INF/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>

1.2.2 编辑Spring配置文件

/jt-web/src/main/resources/spring/applicationContext.xml
在这里插入图片描述

1.2.3 实现京淘首页跳转

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

1.编辑controller

/jt-web/src/main/java/com/jt/web/controller/IndexController.java
在这里插入图片描述

2.修改Nginx实现反向代理

修改自己计算机上的nginx.conf文件,在配置文件结尾处,再添加一个server

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; 
	}
}

3.修改host文件

找到自己计算机上的host文件,修改其内容,添加相应内容。

# 京淘电商环境
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.页面效果
在这里插入图片描述

2.前台业务实现

2.1 伪静态技术

2.1.1 静态页面特点

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

2.1.2 动态页面特点

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

2.1.3 伪静态技术介绍

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

总结:以.html展现动态页面的技术。

2.2 HttpClient

2.2.1 介绍

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

2.2.2 jar包导入

/jt-parent/pom.xml

<!-- 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>

2.2.3 HttpClient入门案例

/jt-web/src/test/java/com/jt/test/httpclient/TestHttpClient.java

@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);
	}
}

2.3 Spring整合HttpClient

2.3.1 编辑pro文件

/jt-web/src/main/resources/property/httpclient.properties

#从连接池中获取到连接的最长时间
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

2.Spring管理配置文件

/jt-web/src/main/resources/spring/applicationContext.xml

<list>
	<value>classpath:/property/jdbc.properties</value>
	<value>classpath:/property/redis.properties</value>
	<value>classpath:/property/httpclient.properties</value>
</list>

3.编辑Spring配置文件

/jt-web/src/main/resources/spring/applicationContext-httpclient.xml

<!-- 定义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" />

2.3.3 编辑工具类方法

/jt-common/src/main/java/com/jt/common/service/HttpClientService.java

@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,String charset){
    	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();
		}
    	
    	return result;
    }
    
    //重载方法
    public String doGet(String url){
    	
    	return doGet(url,null,null);
    }
    
    public String doGet(String url,Map<String,String> params){
    	
    	return doGet(url, params, null);
    }
}

2.4 实现商品展现

2.4.1 HttpClient调用流程

在这里插入图片描述

2.4.2 编辑前台Controller

/jt-web/src/main/java/com/jt/web/controller/ItemController.java

@Controller
@RequestMapping("/items")
public class ItemController {
	
	@Autowired
	private ItemService itemService;
	
	@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";
	}
}

2.4.3 编辑前台Service

/jt-web/src/main/java/com/jt/web/service/ItemService.java

public interface ItemService {

	Item findItemById(Long itemId);
	ItemDesc findItemDescById(Long itemId);
}

/jt-web/src/main/java/com/jt/web/service/ItemServiceImpl.java

@Service
public class ItemServiceImpl implements ItemService {
	
	@Autowired
	private HttpClientService httpClient;
	private static ObjectMapper objectMapper = new ObjectMapper();
	
	//急需发送http请求
	@Override
	public Item findItemById(Long itemId) {
		String url = "http://manage.jt.com/web/item/"+itemId;
		//ItemJSON串
		String result = httpClient.doGet(url);
		Item item = null;
		try {
			item = objectMapper.readValue(result,Item.class);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return item;
	}

	@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();
		}
		return itemDesc;
	}
}

2.4.4 编辑后台Controller

/jt-manage/src/main/java/com/jt/manage/controller/web/WebItemController.java

@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);
	}
}

2.4.5 编辑后台service

/jt-manage/src/main/java/com/jt/manage/service/ItemService.java

Item finditemById(Long itemId);
ItemDesc findItemDescById(Long itemId);

/jt-manage/src/main/java/com/jt/manage/service/ItemServiceImpl.java

/**
 * 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);
}

猜你喜欢

转载自blog.csdn.net/s15810813994/article/details/83212559
今日推荐