===============================================================================
项目背景:SpringMvc+tomcat部署
期望改变:把项目静态化,并且把这部分静态化的html使用nginx
问题:我们知道,如果你在nginx的root目录放置html文件,可以直接使用http://xxx/productList/a.html
但是一般我们使用springMvc会这么构造url http://xxx/productList/a 而不会有.html
解决:
这里页面静态化就不多说了,主要讲nginx
//主要是下面规则
location ~ ^/productList/[\w|-]+$ {
rewrite ^/productList/([\w|-]+)$ /productList/$1.html last;
}
面 上面的规则就是使用rewrite转发到html
讲解下正则:之前学习正则非常头疼,老是记不住,于是就走了个极端,把正则规则每日背诵下,现在发现 写正则和读正则变得非常容易
真是熟能生巧
正则里面长会出来$1 $2 $3这样的东西 它的意思其实很简单
^/productList/([\w|-]+)$这条正则的意思 匹配/productList/abd-ddd 这样的url
然而注意到括号里吗([\w|-]+) 记住 从你的正则从左往右数,遇到一个正则 可以用$加数字代替
于是上面的意思也就是^/productList/$1$
看下面的例子:^/p(ro)duct(List)/([\w|-]+)$ ^/p$1duct$2/$3$
或者这么理解 $1=po $2=List $3=[\w|-]+
那么就可以$1 $2 .... $10000 只要你括号够多
那有时我们需要括号但是又不想查出来匹配成$1 $2这样的那怎么办 那就使用(?:)匹配但不作为筛选结果使用
^/p(?:ro)duct(List)/([\w|-]+)$ ^/p(?:ro)duct$1/$2$
对于我们不常接触正则 又想使用 但是每次见面有很害怕的人来说,花点时间背诵正则来的实惠
把html静态化的一种方案拿出来供大家参考 不过需要自己引入httpclient包
public class HtmlGenerator {
/** 根据模版及参数产生静态页面 */
public static boolean createUTF8HtmlPage(String url,String htmlFileName){
String statusCode="";
String returnResponse;
//创建一个HttpClient实例充当模拟浏览器
HttpClient httpClient = HttpClientBuilder.create().build();
//创建GET方法的实例
HttpGet get = new HttpGet(url);
//设置Get方法提交参数时使用的字符集,以支持中文参数的正常传递
get.addHeader("Content-type", "text/html;charset=UTF-8");
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(12000).setConnectTimeout(12000).build();//设置请求和传输超时时间
get.setConfig(requestConfig);
HttpResponse response;
try{
response = httpClient.execute(get);
HttpEntity entity = response.getEntity();
returnResponse = EntityUtils.toString(entity);
statusCode = response.getStatusLine().getStatusCode()+"";
if(!"200".equals(statusCode)){//非正常200
System.out.println("数据长度:" + returnResponse.length() + "返回状态码:" + response.getStatusLine());
}else{
//将解析结果写入指定的静态HTML文件中,实现静态HTML生成
FileHelper.fastWriteFileUTF8(htmlFileName,returnResponse);
}
EntityUtils.consume(entity);
} catch (ClientProtocolException e) {
statusCode="ClientProtocolException";
e.printStackTrace();
} catch (IOException e) {
statusCode="IOException";
e.printStackTrace();
}catch (Exception e) {
statusCode="Exception";
e.printStackTrace();
} finally {
get.releaseConnection();
get.abort();
}
return "200".equals(statusCode);
}