1.1 项目架构图
2.1 创建项目
2.2 选择打包方式
2.3 添加继承/依赖/插件
编辑POM.xml文件,添加继承依赖和插件
<parent> <groupId>com.jt</groupId> <artifactId>jt</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>jt-web</artifactId> <packaging>war</packaging> <dependencies><dependency><groupId>com.jt</groupId><artifactId>jt-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies> <build><plugins><!--跳过测试类打包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skip>true</skip></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
2.4 导入静态资源文件
说明:在课前资料中找到京淘前台的src文件进行导入
注意事项:覆盖redis.properties文件.
2.5 关于数据源错误说明
报错信息:
报错说明:
由于springboot依赖jar包之后,有自动配置的特点.
解决方案:
//启动时不加载数据源的配置@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)public class SpringBootRun { public static void main(String[] args) { SpringApplication.run(SpringBootRun.class,args);}}
2.6 配置nginx
#配置前台管理服务器server {listen 80;server_name www.jt.com; location / { #实现http请求的转发proxy_pass http://localhost:8092; }}
2.7 关于http强制转化为https的问题
说明:该错误是由谷歌浏览器内部问题导致的.需要禁止实现转换.
解决方案:
chrome://net-internals/#hsts
3.1 搜索引擎工作原理
概念:倒排索引
根据关键字检索文章的位置.
3.2 静态页面特点
3.3 动态特点
用户的交互性强.
3.4 伪静态说明
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结: 以html结尾展现的动态页面
3.5 伪静态测试
请求路径: http://www.jt.com/index.html
上述操作实际找的webapp中的index.html静态页面.如果能够让springMVC拦截.html结尾的请求,就可以实现伪静态的方式.
3.6 编辑配置类
@Configuration //web.xmlpublic class MvcConfigurer implements WebMvcConfigurer{ //开启匹配后缀型配置 后缀任意.@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(true);}}
3.7 页面访问效果
页面中带html的页面也能被springMVC动态拦截.
3.8 关于伪静态的总结
4.1 业务说明
当用户点击前台商品信息时,应该查询jt-mange业务服务器,动态返回商品数据.
4.2 页面分析
分析结果:利用el表达式,从域(request域)中动态获取数据信息,在后台准备数据将数据填充到request域中即可.
5.1 HttpClient介绍
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 .6(2015-09-11)
5.2 导入jar包
<!--添加httpClient jar包 --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>5.3 入门案例/*** 1.实例化httpClient对象* 2.定义请求的路径 String* 3.定义请求的对象 get/post/put/delete* 4.发起请求 获取响应对象* 5.判断返回值的状态 200/504/404/500/400 请求参数类型不匹配/406 返回值类型异常* 6.如果返回值正确, 动态获取响应数据.* @throws IOException* @throws ClientProtocolException*/@Testpublic void doGet() throws ClientProtocolException, IOException {HttpClient httpClient = HttpClients.createDefault();String url = "http://www.baidu.com";HttpGet get = new HttpGet(url);HttpResponse response = httpClient.execute(get);if(200 == response.getStatusLine().getStatusCode()) {System.out.println("请求正确!!!!!!");HttpEntity entity = response.getEntity();//将entity中携带的信息转化为字符串String result = EntityUtils.toString(entity,"utf-8");System.out.println(result);}else {System.out.println("请求异常!!!!!");} }
6.1 编辑配置类
@Configuration@PropertySource(value="classpath:/properties/httpClient.properties")public class HttpClientConfig {@Value("${http.maxTotal}")private Integer maxTotal; //最大连接数 @Value("${http.defaultMaxPerRoute}")private Integer defaultMaxPerRoute; //最大并发链接数 @Value("${http.connectTimeout}")private Integer connectTimeout; //创建链接的最大时间 @Value("${http.connectionRequestTimeout}")private Integer connectionRequestTimeout; //链接获取超时时间 @Value("${http.socketTimeout}")private Integer socketTimeout; //数据传输最长时间 @Value("${http.staleConnectionCheckEnabled}")private boolean staleConnectionCheckEnabled; //提交时检查链接是否可用 //定义httpClient链接池@Bean(name="httpClientConnectionManager")public PoolingHttpClientConnectionManager getPoolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager();manager.setMaxTotal(maxTotal); //设定最大链接数manager.setDefaultMaxPerRoute(defaultMaxPerRoute); //设定并发链接数return manager;} //定义HttpClient/*** 实例化连接池,设置连接池管理器。* 这里需要以参数形式注入上面实例化的连接池管理器 @Qualifier 指定bean标签进行注入*/@Bean(name = "httpClientBuilder")public HttpClientBuilder getHttpClientBuilder(@Qualifier("httpClientConnectionManager")PoolingHttpClientConnectionManager httpClientConnectionManager){ //HttpClientBuilder中的构造方法被protected修饰,所以这里不能直接使用new来实例化一个HttpClientBuilder,可以使用HttpClientBuilder提供的静态方法create()来获取HttpClientBuilder对象HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();httpClientBuilder.setConnectionManager(httpClientConnectionManager);return httpClientBuilder;} /*** 注入连接池,用于获取httpClient* @param httpClientBuilder* @return** 1.定义池对象* 2.创建builder对象 关联池* 3.利用builder实例化对象*/@Beanpublic CloseableHttpClient getCloseableHttpClient(@Qualifier("httpClientBuilder") HttpClientBuilder httpClientBuilder){ return httpClientBuilder.build();} /*** Builder是RequestConfig的一个内部类 * 通过RequestConfig的custom方法来获取到一个Builder对象 * 设置builder的连接信息* @return*/@Bean(name = "builder")public RequestConfig.Builder getBuilder(){RequestConfig.Builder builder = RequestConfig.custom();return builder.setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).setStaleConnectionCheckEnabled(staleConnectionCheckEnabled);} /*** 使用builder构建一个RequestConfig对象* @param builder* @return*/@Beanpublic RequestConfig getRequestConfig(@Qualifier("builder") RequestConfig.Builder builder){return builder.build();}}
6.2 关闭超时连接
@Component //交给spring容器管理public class HttpClientClose extends Thread{@Autowiredprivate PoolingHttpClientConnectionManager manage;private volatile boolean shutdown; //开关 volatitle表示多线程可变数据,一个线程修改,其他线程立即修改 public HttpClientClose() {///System.out.println("执行构造方法,实例化对象");//线程开启启动this.start();} //以异步的形式关闭httpClient对象@Overridepublic void run() {try {//如果服务没有关闭,执行线程while(!shutdown) {synchronized (this) {wait(5000); //等待5秒//System.out.println("线程开始执行,关闭超时链接");//关闭超时的链接PoolStats stats = manage.getTotalStats();int av = stats.getAvailable(); //获取可用的线程数量int pend = stats.getPending(); //获取阻塞的线程数量int lea = stats.getLeased(); //获取当前正在使用的链接数量int max = stats.getMax();//System.out.println("max/"+max+": av/"+av+": pend/"+pend+": lea/"+lea);manage.closeExpiredConnections();}}} catch (Exception e) {e.printStackTrace();throw new RuntimeException();} super.run();} //关闭清理无效连接的线程@PreDestroy //容器关闭时执行该方法.public void shutdown() {shutdown = true;synchronized (this) {//System.out.println("关闭全部链接!!");notifyAll(); //全部从等待中唤醒.执行关闭操作;}}}
7.1 编辑HttpClientService
//简化httpClient调用工具API@Servicepublic class HttpClientService { @Autowiredprivate HttpClient httpClient;@Autowiredprivate RequestConfig requestConfig; /*** 参数:* 1.url 访问地址* 2.Map<String,String> params* 3.字符集编码* 问题:* 1.字符集非空判断,如果为空 设定默认值utf-8* 2.判断用户是否有参数* 有 url?name=value&name2=value2* 无 url** @return*/public String doGet(String url,Map<String,String> params,String charset) { //1.判断用户是否传递参数if(StringUtils.isEmpty(charset)) {//如果为null则设定默认值charset = "UTF-8";} //2.判断用户是否传参if(params != null) {url +="?"; //url?name1=valu1&name2=value2&for (Map.Entry<String,String> entry : params.entrySet()) { String name = entry.getKey();String value = entry.getValue();url += name+"="+value+"&";}//截取字符串中多余的&url = url.substring(0, url.length()-1);} //3.定义请求对象HttpGet httpGet = new HttpGet(url);httpGet.setConfig(requestConfig); //4.发起http请求String result = null;try {HttpResponse response = httpClient.execute(httpGet); if(response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();result = EntityUtils.toString(entity, charset);}} catch (IOException e) { e.printStackTrace();throw new RuntimeException(e);} 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);}}
7.2 编辑测试类
@Autowiredprivate HttpClientService httpClient; @Testpublic void testGet() { String url = "https://www.baidu.com";String result = httpClient.doGet(url);System.out.println(result);}
8.1 远程调用过程图解
8.2 编辑jt-manage后台Controller
url地址:http://manage.jt.com/web/item业务/findItemById/562379
@RestController@RequestMapping("/web/item")public class WebItemController { @Autowiredprivate ItemService itemService;/*** http://manage.jt.com/web/item业务/findItemById?id=101&name=xxx* http://manage.jt.com/web/item业务/findItemById/101/xxxx*/ @RequestMapping("/findItemById/{itemId}")public Item findItemById(@PathVariable Long itemId) { return itemService.findItemById(itemId);}}
8.3 编辑商品后台ItemService
@Overridepublic Item findItemById(Long itemId) { return itemMapper.selectById(itemId);}
8.4 后台查询页面效果

- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论