搭建前台项目
创建jt-web项目
选择骨架
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配置文件
- 修改切入点表达式
实现京淘首页跳转
需求:当用户访问www.jt.com/index.html时.自动访问京淘首页
- 编辑Controller
- 修改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;
}
}
- 修改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.页面效果
前台业务实现
伪静态技术
静态页面特点
- 浏览器解析静态页面速度更快.
- 对于搜索引擎静态页面更加友好.容易被搜索引擎收录
- 交互性差.扩展性弱.
动态页面特点
- 交互性强.扩展性好
- 浏览器加载速度慢
- 搜索引擎不会收录动态页面数据.
伪静态技术
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以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
- 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);
}