Solo  当前访客:4 登录 注册

喧哗博客-http://blog.xuahua.com

繁华过后的沉寂--技术经验分享
浏览次数: 94,611    文章总数: 91    评论总数: 3

java基础篇-字符串首字母大写 有更新!

1,需求

  字符串首字母大写

2,代码

 

public static String toUpFirstChar(String str) {
		if (StringUtils.isNotEmpty(str)) {
			return str.substring(0, 1).toUpperCase() + str.substring(1);
		}
		return null;
}

tomcat7+自带的jdbc连接池 有更新!

原文 :/articles/2016/03/09/1457487972614.html

官方文档资料:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

一,优点

Tomcat jdbc pool的优点:

(1)    tomcat jdbc pool 近乎兼容 dbcp ,性能更高

(2)    异步方式获取连接

(3)    tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架

(4)    使用 javax.sql.PooledConnection 接口获取连接

(5)    支持高并发应用环境

(6)    超简单,核心文件只有8个,比 c3p0 还

(7)    更好的空闲连接处理机制

(8)    支持 JMX

(9)    支持 XA Connection

Tomcat jdbc pool的使用仅需2个jar包,分别为tomcat-jdbc.jar和tomcat-juli.jar,这两个jar包都可以在tomcat7中找到,tomcat-jdbc.jar在tomcat的lib目录下,tomcat-juli.jar在bin目录下。

二,配置代码

<Resource name="jdbc/bdbvip" auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="user"
password="pwd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.0.105:3306/abc?sendStringParametersAsUnicode=false"/>

 

java基础篇-字符串编码转化 有更新!

原文 http://blog.xuahua.com/articles/2016/03/09/1457510183958.html

	/**
	 * GBK格式转换成utf-8编码
	 * @param str
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String gbToUtf8(String str)
			throws UnsupportedEncodingException {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < str.length(); i++) {
			String s = str.substring(i, i + 1);
			if (s.charAt(0) > 0x80) {
				byte[] bytes = s.getBytes("Unicode");
				String binaryStr = "";
				for (int j = 2; j < bytes.length; j += 2) {
					// the first byte
					String hexStr = getHexString(bytes[j + 1]);
					String binStr = getBinaryString(Integer.valueOf(hexStr, 16));
					binaryStr += binStr;
					// the second byte
					hexStr = getHexString(bytes[j]);
					binStr = getBinaryString(Integer.valueOf(hexStr, 16));
					binaryStr += binStr;
				}
				// convert unicode to utf-8
				String s1 = "1110" + binaryStr.substring(0, 4);
				String s2 = "10" + binaryStr.substring(4, 10);
				String s3 = "10" + binaryStr.substring(10, 16);
				byte[] bs = new byte[3];
				bs[0] = Integer.valueOf(s1, 2).byteValue();
				bs[1] = Integer.valueOf(s2, 2).byteValue();
				bs[2] = Integer.valueOf(s3, 2).byteValue();
				String ss = new String(bs, "UTF-8");
				sb.append(ss);
			} else {
				sb.append(s);
			}
		}
		return sb.toString();
	}

	private static String getHexString(byte b) {
		String hexStr = Integer.toHexString(b);
		int m = hexStr.length();
		if (m < 2) {
			hexStr = "0" + hexStr;
		} else {
			hexStr = hexStr.substring(m - 2);
		}
		return hexStr;
	}

	private static String getBinaryString(int i) {
		String binaryStr = Integer.toBinaryString(i);
		int length = binaryStr.length();
		for (int l = 0; l < 8 - length; l++) {
			binaryStr = "0" + binaryStr;
		}
		return binaryStr;
	}

	/**
	 * UTF-8格式的字符串,转换成GB2312
	 * 
	 * @param str
	 * @return
	 */
	public static String utf8Togb2312(String str) {
		String utf8 = "";
		String unicode = "";
		String gbk = "";
		try {
			utf8 = new String(str.getBytes("UTF-8"));
			// System.out.println(utf8);
			unicode = new String(utf8.getBytes(), "UTF-8");
			// System.out.println(unicode);
			gbk = new String(unicode.getBytes("GBK"));
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		return gbk;
	}

	/**
	 * 将 GB2312 编码格式的字符串转换为 UTF-8 格式的字符串:
	 * 
	 * @param str
	 * @return
	 */
	public static String gb2312ToUtf8(String str) {
		String urlEncode = "";
		try {
			urlEncode = URLEncoder.encode(str, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return urlEncode;
	}

java基础篇-日期格式处理 有更新!

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 日期工具类,提供常用的静态方法
 * 
 * @author Administrator
 * 
 */
public class DateUtils extends org.apache.commons.lang.time.DateUtils {

	protected final static Log log = LogFactory.getLog(DateUtils.class);
	public final static String[] ChineseWeek = { "日", "一", "二", "三", "四", "五",
			"六" };

	/**
	 * yyyy-MM-dd HH:mm:ss
	 */
	public static final String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss";
	/**
	 * new SimpleDateFormat("yyyy-MM-dd");
	 * */
	public final static SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat(
			"yyyy-MM-dd");;
	/**
	 * new SimpleDateFormat("yyyy-MM-dd HH:mm");
	 * */
	public final static SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm");;
	/**
	 * new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	 * */
	public final static SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");;
	/**
	 * new SimpleDateFormat("yyyyMMdd");
	 * */
	public final static SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat(
			"yyyyMMdd");;
	/**
	 * new SimpleDateFormat("yyyyMMddHHmmss")
	 * */
	public final static SimpleDateFormat simpleDateFormat5 = new SimpleDateFormat(
			"yyyyMMddHHmmss");;

	/**
	 * new SimpleDateFormat("yyyyMMddHHmm")
	 * */
	public final static SimpleDateFormat simpleDateFormat6 = new SimpleDateFormat(
			"yyyyMMddHHmm");

	/**
	 * 将日期转换为字符串时间
	 * 
	 * @param date
	 *            //日期
	 * @param dateFormat
	 *            //格式
	 * @return
	 */
	public static String date2String(Date date, SimpleDateFormat dateFormat) {
		return dateFormat.format(date);
	}

	public static String date2String(Date date, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		return dateFormat.format(date);
	}

	public static Date string2Date(String source, SimpleDateFormat dateFormat) {
		try {
			return dateFormat.parse(source);
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return null;
	}

	public static Date string2Date(String source, String format) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
		try {
			return dateFormat.parse(source);
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return null;
	}

	public static Date format(Date date, SimpleDateFormat dateFormat) {
		try {
			return dateFormat.parse(dateFormat.format(date));
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return date;
	}

	public static Date format(Date date, String f) {
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(f);
			return dateFormat.parse(dateFormat.format(date));
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}

		return date;
	}

	public static boolean isSameMinute(Date d1, Date d2) {
		return simpleDateFormat2.format(d1)
				.equals(simpleDateFormat2.format(d2));
	}

	/**
	 * 英文操作系统下 强制得到中文yyyy-MM-dd 星期 以上午10点为分界
	 * */
	public static String getChineseYMDWeek(Date d) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		int hour = c.get(Calendar.HOUR_OF_DAY);
		if (hour < 10)
			c.add(Calendar.DAY_OF_MONTH, -1);
		return simpleDateFormat1.format(c.getTime()) + " 星期"
				+ ChineseWeek[c.get(Calendar.DAY_OF_WEEK) - 1];
	}

	/**
	 * 英文操作系统下 强制得到中文yyyy-MM-dd 星期 标准
	 * */
	public static String getChineseYMDWeek_(Date d) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		return simpleDateFormat1.format(c.getTime()) + " 星期"
				+ ChineseWeek[c.get(Calendar.DAY_OF_WEEK) - 1];
	}

	public static String dateadd(Date d, int field, int num, String format) {
		SimpleDateFormat dateFormat = null;
		if (format == null)
			dateFormat = simpleDateFormat1;
		else
			dateFormat = new SimpleDateFormat(format);
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(field, num);
		return dateFormat.format(c.getTime());
	}

	/**
	 * @author wyong
	 * @version 1.0
	 * @2011-5-17
	 * @description 计算二个时间相差天数 同一天算做 0 .
	 * @path 
	 * @param othertime
	 * @return int
	 */
	public static int deduction(long othertime) {
		long nowtime = System.currentTimeMillis();
		long d = Math.abs(nowtime - othertime);
		int day = (int) (d / 1000 / 60 / 60 / 24);
		return day;
	}

	/**
	 * 得到最近一个月的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-06 12:10:10','2011-07-06 12:10:10']
	 */
	public static String[] getNearMonthDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.MONTH, -1);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近一个月的日期数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-06','2011-07-06']
	 */
	public static String[] getNearMonthDateStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat1.format(cal.getTime());
		cal.add(Calendar.MONTH, -1);
		String end = simpleDateFormat1.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近一周的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-06-29 09:33:12','2011-07-06 09:33:12']
	 */
	public static String[] getNearWeekDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.DAY_OF_WEEK_IN_MONTH, -1);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到最近三天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 09:33:12','2011-07-06 09:33:12']
	 */
	public static String[] getNearThreeDayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String begin = simpleDateFormat3.format(cal.getTime());
		cal.add(Calendar.DAY_OF_MONTH, -3);
		String end = simpleDateFormat3.format(cal.getTime());
		return new String[] { end, begin };
	}

	/**
	 * 得到今明后天
	 * 
	 * @param format
	 * @return
	 */
	public static String[] getThreeday(String format) {
		String[] theDate = new String[3];
		try {
			DateFormat dateFormat = new SimpleDateFormat(format);
			Date inputDate = new Date();
			Calendar cal = Calendar.getInstance();
			cal.setTime(inputDate);
			int inputDayOfYear = cal.get(Calendar.DAY_OF_YEAR);

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 0);
			theDate[0] = dateFormat.format(cal.getTime());

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 1);
			theDate[1] = dateFormat.format(cal.getTime());

			cal.set(Calendar.DAY_OF_YEAR, inputDayOfYear + 2);
			theDate[2] = dateFormat.format(cal.getTime());

		} catch (Exception e) {
		}
		return theDate;
	}

	public static void main(String[] args) {
		String[] a = DateUtils.getThreeday("yyyyMMdd");
		for (String s : a) {
			System.out.println(s);
		}

	}

	/**
	 * 得到今天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 00:00:00','2011-07-03 23:59:59']
	 */
	public static String[] getNearTodayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		String today = simpleDateFormat1.format(cal.getTime());
		return new String[] { today + " 00:00:00", today + " 23:59:59" };
	}

	/**
	 * 得到昨天的日期时间数组串,前面小时间,后面大时间
	 * 
	 * @return ['2011-07-03 00:00:00','2011-07-03 23:59:59']
	 */
	public static String[] getNearYesterdayDateTimeStr() {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DAY_OF_MONTH, -1);
		String today = simpleDateFormat1.format(cal.getTime());
		return new String[] { today + " 00:00:00", today + " 23:59:59" };
	}

	/**
	 * 取得该月的第一天
	 * 
	 * @param date
	 *            传入null时,默认取当前时间
	 * @return
	 * @author
	 */
	public static Date getCurrentMonthFirstDay(Date date) {
		Calendar cal = Calendar.getInstance();

		if (null != date) {
			cal.setTime(date);
		}
		cal.set(Calendar.DATE, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);

		return cal.getTime();
	}

	/**
	 * 取得下月的第一天
	 * 
	 * @param date
	 *            传入null时,默认取当前时间
	 * @return
	 * @author feng.li 2011-07-05
	 */
	public static Date getNextMonthFirstDay(Date date) {
		Calendar cal = Calendar.getInstance();

		if (null != date) {
			cal.setTime(date);
		}
		cal.set(Calendar.DATE, 1);
		cal.roll(Calendar.MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);

		return cal.getTime();
	}

	/**
	 * 取得在当天0时0分0秒的基础增加或减少N天的时间
	 * 
	 * @param add
	 *            增加或减少的偏移量
	 * @return
	 */
	public static Date getSetTime(int add) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);

		calendar.add(Calendar.DAY_OF_MONTH, add);

		return calendar.getTime();
	}

	public static Timestamp stringToTimestamp(String date) {
		Timestamp ts = null;
		try {
			DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			ts = new Timestamp(format.parse(date).getTime());
		} catch (ParseException e) {
			log.error(e.getMessage(), e);
		}
		return ts;
	}

	/**
	 * Date转化为字符串
	 * 
	 * @param Date
	 *            日期
	 * @return String yyyy-MM-dd HH:mm:ss
	 */
	public static String getDateToStr(Date date) {
		if (date == null) {
			return null;
		} else {
			SimpleDateFormat sdf = new SimpleDateFormat(YYYYMMDDHHMMSS);
			return sdf.format(date);
		}
	}

	/**
	 * Date转化为字符串
	 * 
	 * @param Date
	 *            日期
	 * @param format
	 *            格式
	 * @return String
	 */
	public static String getDateToStr(Date date, String format) {
		if (date == null) {
			return null;
		} else {
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}
	}
	
	/**String 转化date 验证
	 * <pre>
	 * @param date
	 *         时间
	 * @return
	 * </pre>
	 */
	public static boolean isDateMatch(String date) {
        String regex = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(date);
        return m.matches();
    }
	
}

java基础篇--模拟浏览器请求https--安全协议https请求 有更新!

https 协议,因为安全,所以在处理上,也有些不同。现在给出示例

 

/**
	 * @param url
	 * @param xmlstring
	 * @param match_id 密钥-- .p12的密钥
	 * @param file "apiclient_cert.p12" .p12的文件路径
	 * @return
	 */
	public static String httpsGetRequest(String url, String xmlstring, String match_id,String file){
		    KeyStore keyStore;
		    StringBuilder result = new StringBuilder();
			try {
				keyStore = KeyStore.getInstance("PKCS12");
				FileInputStream instream = new FileInputStream(new File(file));
	            keyStore.load(instream, match_id.toCharArray());

		        // Trust own CA and all self-signed certs
		        SSLContext sslcontext = SSLContexts.custom()
		                .loadKeyMaterial(keyStore, match_id.toCharArray())
		                .build();
		        // Allow TLSv1 protocol only
		        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
		                sslcontext,
		                new String[] { "TLSv1" },
		                null,
		                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		        CloseableHttpClient httpclient = HttpClients.custom()
		                .setSSLSocketFactory(sslsf)
		                .build();
		        try {

	            HttpGet httpget = new HttpGet(url);
	            System.out.println("executing request" + httpget.getRequestLine());
	            CloseableHttpResponse response = httpclient.execute(httpget);
	            try {
	                HttpEntity entity = response.getEntity();
	                System.out.println("----------------------------------------");
	                System.out.println(response.getStatusLine());
	                if (entity != null) {
	                    System.out.println("Response content length: " + entity.getContentLength());
	                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
	                    String text="";
	                    while ((text = bufferedReader.readLine()) != null) {
	                    	result.append(text);
	                    }
	                }
	                EntityUtils.consume(entity);
	            } finally {
	                response.close();
	            }
	        } finally {
	            httpclient.close();
	        }
			} catch (Exception e) {
				e.printStackTrace();
			}
		return result.toString();
	}
	

java基础篇-模拟浏览器请求(post,get) 有更新!

public static String postRequest(String url, Map<String, String> data) {
		// 响应内容
		String result = "";

		// 定义http客户端对象--httpClient
		HttpClient httpClient = new HttpClient();

		// 定义并实例化客户端链接对象-postMethod
		PostMethod postMethod = new PostMethod(url);

		try {
			// 设置http的头
			postMethod.getParams().setParameter(
					HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
			postMethod.setRequestHeader("ContentType",
					"application/x-www-form-urlencoded;charset=UTF-8");
			if (data != null) {
				NameValuePair[] data1 = new NameValuePair[data.size()];
				int i = 0;
				for (String mapKey : data.keySet()) {
					// 填入各个表单域的值
					String vString = data.get(mapKey) == null ? "" : data.get(
							mapKey).toString();
					// vString = new String(vString.getBytes("utf-8"),"GBK");
					data1[i++] = new NameValuePair(mapKey, vString);
				}

				// 将表单的值放入postMethod中
				postMethod.setRequestBody(data1);
			}
			// 定义访问地址的链接状态
			int statusCode = 0;
			try {
				// 客户端请求url数据
				statusCode = httpClient.executeMethod(postMethod);
			} catch (Exception e) {
				e.printStackTrace();
			}

			// 请求成功状态-200
			if (statusCode == HttpStatus.SC_OK) {
				try {
					result = postMethod.getResponseBodyAsString();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				System.out.println("请求返回状态:" + statusCode);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			// 释放链接
			postMethod.releaseConnection();
			httpClient.getHttpConnectionManager().closeIdleConnections(0);
		}
		return result;
	}

	public static String postRequest(String url, String xmlstring,
			String contentType, String charset) {
		if (StringUtils.isBlank(charset)) {
			charset = "UTF-8";
		}
		if (StringUtils.isBlank(contentType)) {
			contentType = "text/html;charset=" + charset;
		}
		PostMethod post = new PostMethod(url);
		// 设置请求的内容直接从文件中读取
		HttpClient httpclient = new HttpClient();
		httpclient.getParams().setContentCharset("UTF-8");
		String resultstring = "";
		try {
			post.setRequestEntity(new StringRequestEntity(xmlstring,
					contentType, charset));
			int result = httpclient.executeMethod(post);
			resultstring = post.getResponseBodyAsString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		post.releaseConnection();
		return resultstring;
	}

	public static String postRequest(String url, Map<String, Object> data,
			Map<String, String> cookie, String domain) {
		// 响应内容
		String result = "";

		// 定义http客户端对象--httpClient
		HttpClient httpClient = new HttpClient();

		// 定义并实例化客户端链接对象-postMethod
		PostMethod postMethod = new PostMethod(url);

		try {
			// 设置http的头
			postMethod.getParams().setParameter(
					HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
			postMethod.setRequestHeader("ContentType",
					"application/x-www-form-urlencoded;charset=UTF-8");
			if (cookie != null) {
				if (domain == null) {
					domain = "";
				}
				HttpState initialState = new HttpState();
				for (String cookieName : cookie.keySet()) {
					Cookie c = new Cookie(domain, cookieName,
							cookie.get(cookieName), "/", -1, true);
					initialState.addCookie(c);
				}
				httpClient.setState(initialState);
			}
			if (data != null) {
				NameValuePair[] data1 = new NameValuePair[data.size()];
				int i = 0;
				for (String mapKey : data.keySet()) {
					// 填入各个表单域的值
					String vString = data.get(mapKey) == null ? "" : data.get(
							mapKey).toString();
					// vString = new String(vString.getBytes("utf-8"),"GBK");
					data1[i++] = new NameValuePair(mapKey, vString);
				}

				// 将表单的值放入postMethod中
				postMethod.setRequestBody(data1);
			}

			// 定义访问地址的链接状态
			int statusCode = 0;
			try {
				// 客户端请求url数据
				statusCode = httpClient.executeMethod(postMethod);
			} catch (Exception e) {
				e.printStackTrace();
			}

			// 请求成功状态-200
			if (statusCode == HttpStatus.SC_OK) {
				try {
					result = postMethod.getResponseBodyAsString();
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				System.out.println("请求返回状态:" + statusCode);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			// 释放链接
			postMethod.releaseConnection();
			httpClient.getHttpConnectionManager().closeIdleConnections(0);
		}
		return result;
	}

java基础篇--生成指定长度的随机字符串 有更新!

public static Random random = new Random();
	/**
	 * 生成len 位随机整数
	 *  包括数字字母
	  * @Title: getSexRandom
	  * @return int    
	  * @throws
	 */
	public static String getRandomStr(int len){
		StringBuilder ret = new StringBuilder();
		for (int i = 0; i < len; i++) {
			boolean isChar = (random.nextInt(2) % 2 == 0);// 输出字母还是数字
			if (isChar) { // 字符串
				int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; // 取得大写字母还是小写字母
				ret.append((char) (choice + random.nextInt(26)));
			} else { // 数字
				ret.append(Integer.toString(random.nextInt(10)));
			}
		}
		return ret.toString();
	}

java提高篇-导出execl(具体使用篇) 有更新!

现在这篇文章,讲的是如何使用前一篇文章导出通用工具类

具体如下:

ackage com.xuahua.utils.export;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.CellView;
import jxl.write.Label;
import jxl.write.Number;

import com.xuahua.pojo.TMemCashTradeRecordVo;
import com.xuahua.utils.ExportExcelUtils;

public class TradeExportUtils extends ExportExcelUtils {
	
	@Override
	public List<Map<String, Object>> getHeaders() {
		List<Map<String, Object>> headers = new ArrayList<Map<String, Object>>();

		Map<String, Object> header = new HashMap<String, Object>();
		header.put("value", "序");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "用户名");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易号");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易前余额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易金额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易后余额");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "交易类型");
		headers.add(header);

		header = new HashMap<String, Object>();
		header.put("value", "收入支出");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "交易支出");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "订单号");
		headers.add(header);
		
		header = new HashMap<String, Object>();
		header.put("value", "摘要");
		headers.add(header);
		return headers;
	}

	@Override
	public void writeContent(List list) throws Exception{
		List<TMemCashTradeRecordVo> currencyCardList = list;
		CellView cellView = new CellView();  
	    cellView.setAutosize(true); //设置自动大小
		for (int i = 0; i < currencyCardList.size(); i++) {
			TMemCashTradeRecordVo vo = currencyCardList.get(i);

			number = new jxl.write.Number(0, rowIndex, (i + 1), cellFormat1);
			ws.addCell(number);
			
			label = new jxl.write.Label(1, rowIndex, vo.getUsername(),cellFormat1); // 用户名
			ws.addCell(label);

			label = new jxl.write.Label(2, rowIndex, vo.getTradeno(),cellFormat1); // 交易流水号
			ws.addCell(label);
			
			number = new Number(3, rowIndex, vo.getAccountcashmoney().add(vo.getAccountfrzoenmoney()).doubleValue(),cellFormat1); // 交易前金额
			ws.addCell(number);
			
			number = new Number(4, rowIndex, vo.getTradetotalmoney().doubleValue(),cellFormat1); // 交易金额
			ws.addCell(number);
			
			number = new Number(5, rowIndex, vo.getCashmoney().add(vo.getFrzoenmoney()).doubleValue(),cellFormat1); // 交易后金额
			ws.addCell(number);
			
			label = new jxl.write.Label(6, rowIndex,vo.getTradetype(), cellFormat1); // 交易类型
			ws.addCell(label);
			
			label = new jxl.write.Label(7, rowIndex,vo.getInorout(), cellFormat1); // 收入支出类型
			ws.addCell(label);

			label = new Label(8, rowIndex, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(vo.getCreatetime()),cellFormat1);
			ws.addCell(label);
			
			label = new Label(9, rowIndex, vo.getGeneralno(),cellFormat1); // 订单号
			ws.addCell(label);

			label = new Label(10, rowIndex, vo.getRemark(),cellFormat1); // 备注
			
			ws.setColumnView(i, cellView);
			ws.addCell(label);

			rowIndex++;
		}

	}
	
}

看了上面的代码以后,怎么样?会使用了么?

j2ee开发之druid联接池配置,监控 有更新!

数据库联接池有很多种,除了c3p0,dbcp,还有druid,而且现在用的也比较火。

今天把配置过程记录下来。

1,pom.xml 配置

  <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.23</version>
</dependency>


2,jndi配置

  jndi配置-喧哗博客


3,web.xml 配置


 <servlet>  
        <servlet-name>DruidStatView</servlet-name>  
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>  
    </servlet>    
    <servlet-mapping>  
        <servlet-name>DruidStatView</servlet-name>  
        <url-pattern>/druid/*</url-pattern>  
    </servlet-mapping> 
4,启动服务,在浏览器输入 http://localhost:8080/druid/index.html 就会展示默认的html页面


druid监控-喧哗博客


如果还需要使用Web应用、URI监控、Session监控、Spring监控等则还需要继续增加配置。

5、Wen应用配置

WebStatFilter用于采集web-jdbc关联监控的数据

在Web.xml中增加配置,就可以使用Web应用、URI监控、Session监控等功能

 <filter>
    <filter-name>DruidWebStatFilter</filter-name>
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
    <init-param>
        <param-name>exclusions</param-name>
        <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/console/*</param-value>
    </init-param>
    <init-param>
    	<param-name>profileEnable</param-name>
    	<param-value>true</param-value>
	</init-param>
	<init-param>
        <param-name>principalCookieName</param-name>
        <param-value>USER_COOKIE</param-value>
    </init-param>
    <init-param>
        <param-name>principalSessionName</param-name>
        <param-value>USER_SESSION</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

6,spring配置
<bean id="druid-stat-interceptor"
		class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
	</bean>
	<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
		scope="prototype">
		<property name="patterns">
			<list>
				<value>com.bdbvip.*.service.*</value>
				<value>com.bdbvip.*.dao.*</value>
			</list>
		</property>
	</bean>

	<aop:config proxy-target-class="true">
		<aop:advisor advice-ref="druid-stat-interceptor"
			pointcut-ref="druid-stat-pointcut" />
	</aop:config>

至此已经全部配置完毕。


数据库联接池连接,失效后自动重连参数设置 有更新!

 

二种连接,

1,alibaba出品的数据库连接驱动Druid

<Resource 
         name="jdbc/game"
         factory="com.alibaba.druid.pool.DruidDataSourceFactory"
         auth="Container"
         type="javax.sql.DataSource"
         driverClassName="com.mysql.jdbc.Driver"
         url="jdbc:mysql://xxx:3306/game1?sendStringParametersAsUnicode=false"
         username="game1"
         password="game1"
         maxActive="500"
         maxWait="60000"
         initialSize="100"
         removeabandoned="true"
         removeabandonedtimeout="60"
         timeBetweenEvictionRunsMillis="60000"
         minEvictableIdleTimeMillis="300000"
         validationQuery="select 1"
         testWhileIdle="true"
         testOnReturn="false"
         testOnBorrow="false"
         logabandoned="false"
         poolPreparedStatements="true"
         maxPoolPreparedStatementPerConnectionSize="20"
         filters="stat"/>

 

2,tomcat自带的连接池 org.apache.tomcat.jdbc.pool.DataSourceFactory

 

<Resource name="jdbc/game" auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      testWhileIdle="true"
      testOnBorrow="true"
      testOnReturn="false"
      validationQuery="SELECT 1"
      validationInterval="30000"
      timeBetweenEvictionRunsMillis="30000"
      maxActive="100"
      minIdle="10"
      maxWait="10000"
      initialSize="50"
      removeAbandonedTimeout="60"
      removeAbandoned="true"
      logAbandoned="true"
      minEvictableIdleTimeMillis="30000"
      jmxEnabled="true"
      jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
      username="game1"
      password="game1"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://xxx:13306/gametest?sendStringParametersAsUnicode=false"/>

 

 

 

 

 

 

 

 

微信公众号,高级群发接口,如何增加外链直接让推送的图文消息点 有更新!

最近弄这个头大了。。

如何实现点击微信图文信息直接跳转至外部链接

有知道的没有?请留言!

微信接口开发系列之九群发消息上传图片 有更新!

微信接口定义如下

上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】

请注意,本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下。

接口调用请求说明

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
事后证明,上传图片的接口请使用 http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=image 调用示例(使用curl命令,用FORM表单方式上传一个图片): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"

参数说明

参数是否必须说明
access_token 调用接口凭证
media form-data中媒体文件标识,有filename、filelength、content-type等信息

返回说明 正常情况下的返回结果为:

{
    "url":  "http://mmbiz.qpic.cn/mmbiz/gLO17UPS6FS2xsypf378iaNhWacZ1G1UplZYWEYfwvuU6Ont96b1roYs CNFwaRrSaKTPCUdBK9DgEHicsKwWCBRQ/0"
}

其中url就是上传图片的URL,可用于后续群发中,放置到图文消息中。

错误时微信会返回错误码等信息,请根据错误码查询错误信息。

 

 

使用httpclient 上传图片代码如下:

/**
	 * 微信客服消息,上传文件接口使用
	 * @param url  微信提供的上传地址
	 * @param file 上传图片地址,此处必须是本地文件路径
	 * @param filename 对应的上传文件名
	 * @return
	 */
	public static String postfile(String url,String file,String filename){
		StringBuilder sb = new StringBuilder();
		CloseableHttpClient httpclient = HttpClientBuilder.create().build();
        HttpPost httppost = new HttpPost(url); 
        postRequestconfig(httppost);
        
        try {
        	HttpEntity entityfile = MultipartEntityBuilder.create()  
        			.addBinaryBody("file", new File(file), ContentType.DEFAULT_BINARY, file).addTextBody("filename",filename)  
        			.build();  
        	httppost.setEntity(entityfile);  
	    	HttpResponse response = httpclient.execute(httppost);
			int statusOk = response.getStatusLine().getStatusCode();
			if(logger.isInfoEnabled()){
		        	logger.info(url+"result-statusCode=>>"+statusOk);
		    }
	        if(statusOk == HttpStatus.SC_OK){
	        	HttpEntity entity = response.getEntity();
	        	BufferedInputStream instream = new BufferedInputStream(entity.getContent()); 
		        byte[] chars = new byte[2048];
		        int len=0;
		        while((len=instream.read(chars))!=-1){
		        	sb.append(new String(chars,0,len));
		        }
	        }else{
	        	logger.error(url+"result->网络异常.."+statusOk);
	        }
	        if(logger.isInfoEnabled()){
	        	logger.info(url+"result->"+sb.toString());
	        }
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	    return sb.toString();
	}

dubbox框架实例

1,dubbox-service端

 接口与实现一起在service端。使用maven单独打成独立的interface.jar即可。

包名规则如下:

   com.xuahua --根包

   ---------------interfaces --接口包

----------------service --接口实现包

-----------------model --接口使用类对外的Pojo

创建接口类名 com.xuahua.interfaces.DemoService.java

/**
* @author wyong
* 定义测试例子
*/
public interface DemoService {

/**
* @param name
* @return
* 定义方法,与某人打招呼
*/
String sayHello(String name); 


}

 

接口实现类com.xuahua.service.DemoServiceImpl.java

package com.xuahua.service;

import org.springframework.stereotype.Service;

import com.xuahua.interfaces.DemoService;

@Service("demoService")
public class DemoServiceImpl implements DemoService {

	public String sayHello(String name) {
		return "Hello " + name;  
	}


}

 

加载独立的spring_dubbox.xml文件,可以在spring-mvc.xml中最下面增加

<!-- **************************** 导入其他XML文件 **************************** -->
<import resource="spring_dubbo.xml"/>
<!-- **************************** /导入其他XML文件 **************************** -->

spring_dubbo.xml内容如下

 

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
    <!-- 提供方应用信息,用于计算依赖关系 -->  
    <dubbo:application name="demoService_provider" owner="programmer" organization="dubbox" />  
    <dubbo:monitor protocol= "registry" />
    <!-- 使用zookeeper注册中心暴露服务地址  192.168.0.101 为zookeeper的ip地址及开放端口-->  
    <dubbo:registry protocol="zookeeper" address="192.168.0.101:2181"  />   
    
    <!-- 用dubbo协议在20880端口暴露服务 -->  
    <dubbo:protocol name="dubbo" port="20880" />  
   
    <!-- 声明需要暴露的服务接口 -->  
    <dubbo:service interface="com.xuahua.interfaces.DemoService" ref="demoService"  timeout="6000"/>  
      
    <!-- 具体的实现bean -->  
    <bean id="demoService" class="com.xuahua.service.DemoServiceImpl" />  
</beans>  

 

最后pom.xml文件如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.xuahua</groupId>
	<artifactId>dubbo-model-service</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>com.xuahua Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<!-- 定义本pom.xml引用版本属性, org.springframework-version,org.hibernate-version,project.build.sourceEncodeing 
		此名可随便取,必须与下面引用相匹配。 -->
	<properties>
		<org.springframework-version>4.0.0.RELEASE</org.springframework-version>
		<org.hibernate-version>4.3.1.Final</org.hibernate-version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.parent.version>2.8.4</project.parent.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<!-- 此处可以添加相关联的,使用的jar包 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>${project.parent.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring</artifactId>
					<groupId>org.springframework</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.2</version>
</dependency>
		<!-- 下面是springframwork 4.xx 引用的包 -->
		<!-- spring 4 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- Apache Commons 基础组件 -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.8.3</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.8</version>
		</dependency>
		<dependency>
			<groupId>commons-configuration</groupId>
			<artifactId>commons-configuration</artifactId>
			<version>1.10</version>
		</dependency>

		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.3.6</version>
		</dependency>

		<!-- 下面是返回json串时,使用到的处理相关包 Jackson -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>

		<!-- slf4j 日志文件框架使用的jar包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.2</version>
		</dependency>

		<!-- mysql driver 数据库驱动包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.15</version>
		</dependency>

		<!-- c3p0 datasource 数据库联接池使用的,此处是c3p0 -->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<!-- druid 联接池,同时也提供内部默认的监控,个人推荐 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.23</version>
		</dependency>
		<!-- dbcp使用的默认联接池 配合 commons-pool 使用 -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>1.5.4</version>
		</dependency>


		<!-- 中间件 ibatis -->
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-core</artifactId>
			<version>3.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- hiberante 4 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.18.1-GA</version>
		</dependency>
		<!-- http-client -->
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpcore</artifactId>
			<version>4.3.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.3</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.7.4</version>
		</dependency>

		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.7.4</version>
		</dependency>
		<!-- json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.7</version>
		</dependency>
		<!-- memcached -->
		<dependency>
			<groupId>com.whalin</groupId>
			<artifactId>Memcached-Java-Client</artifactId>
			<version>3.0.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.maven-play-plugin.spy</groupId>
			<artifactId>spymemcached</artifactId>
			<version>2.6</version>
		</dependency>

		<!-- servlet3 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.3</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.8</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jmx</groupId>
                    <artifactId>jmxri</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jdmk</groupId>
                    <artifactId>jmxtools</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.jms</groupId>
                    <artifactId>jms</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
	</dependencies>
	<build>
		<finalName>dubbo-service</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>3.0.2</version>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>jar</goal>
						</goals>
						<configuration>
							<classifier>interface</classifier>
							<includes>
								<include>**/interfaces/*</include>
								<include>**/model/*</include>
							</includes>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

 

####################################以上为dubbox-service的配置,########################

2,dubbox-client配置如下

包名规则如下

com.xuahua --------根包名

---------------controller --对外调用的服务,可以在内部使用上面暴露的接口。

 

com.xuahua.controller.DemoController.java 

内容如下

package com.xuahua.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.xuahua.interfaces.DemoService;



/**
 * @author wyong
 * @version 1.0
 * @link QQ343886028
 */
@Controller
@RequestMapping("/demo")
public class DemoController {

	@Autowired
	DemoService demoService;
//	
	@RequestMapping("/index")
	public String index(Model model){
		String result =demoService.sayHello("xuahua");
		System.out.println("======="+result);
		
		//此处是模拟调用请求,本人测试,服务端默认参数,超过5000个必定会抛出异常。
//		for(int i=0;i<1000;i++){
//			new Thread(new DemoController.process(demoService,String.valueOf(i))).start();
//		}
		return "index";
	}
	 
	/**
	 * @author wyong
	 * 此处只是做了一个多线程请求,模拟压力测试。。
	 
	class process implements Runnable {
		DemoService demoService;
		String name;
		public process(DemoService demoService,String name){
			this.demoService = demoService;
			this.name = name;
			Thread.currentThread().setName(name);
		}
		public void run() {
			 long s = System.currentTimeMillis();
			 String result =demoService.sayHello(name);
			 long b = System.currentTimeMillis();
			System.out.println(Thread.currentThread().getName()+"=>"+result+",cost=>"+(b-s)+"ms");
		}
		
	}*/
}

 

spring_dubbox.xml 配置文件如下

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
   
   <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
  <dubbo:application name="consumer-of-helloworld-web"  />
  <dubbo:monitor protocol= "registry" />
  
    <!-- 使用zookeeper注册中心暴露服务地址  192.168.0.101 为zookeeper的ip地址及开放端口--> 
 <dubbo:registry protocol = "zookeeper" address="192.168.0.101:2181" /> 
 <dubbo:protocol name="dubbo"  port="20880" />
 
 <!-- 对于初始化,强制使用 demoService 参数init="true" -->
	<dubbo:reference id="demoService" interface="com.xuahua.interfaces.DemoService" check="false" timeout="5000" /> 
</beans>  

 

同样在spring-mvc.xml配置最后面引入

<!-- **************************** 导入其他XML文件 **************************** -->
<import resource="spring_dubbo.xml" />
<!-- **************************** /导入其他XML文件 **************************** -->

 

dubbx-client工程pom.xml配置如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.xuahua</groupId>
	<artifactId>dubbo-module-client</artifactId>
	<packaging>war</packaging>
	<version>1.0</version>
	<name>com.xuahua Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<!-- 定义本pom.xml引用版本属性, org.springframework-version,org.hibernate-version,project.build.sourceEncodeing 
		此名可随便取,必须与下面引用相匹配。 -->
	<properties>
		<org.springframework-version>4.0.0.RELEASE</org.springframework-version>
		<org.hibernate-version>4.3.1.Final</org.hibernate-version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.parent.version>2.8.4</project.parent.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<!-- 从provider工程打包放到nexus上面后,再引用 -->
		<dependency>
			<groupId>com.xuahua.interfaces</groupId>
			<artifactId>demoService</artifactId>
			<version>1.0</version>
		</dependency>
		<!-- 此处可以添加相关联的,使用的jar包 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>${project.parent.version}</version>
			<exclusions>
				<exclusion>
					<artifactId>spring</artifactId>
					<groupId>org.springframework</groupId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.2</version>
		</dependency>

		<!-- 下面是springframwork 4.xx 引用的包 -->
		<!-- spring 4 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- Apache Commons 基础组件 -->
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.8.3</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.8</version>
		</dependency>
		<dependency>
			<groupId>commons-configuration</groupId>
			<artifactId>commons-configuration</artifactId>
			<version>1.10</version>
		</dependency>

		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.3.6</version>
		</dependency>

		<!-- 下面是返回json串时,使用到的处理相关包 Jackson -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>

		<!-- slf4j 日志文件框架使用的jar包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.2</version>
		</dependency>

		<!-- mysql driver 数据库驱动包 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.15</version>
		</dependency>

		<!-- c3p0 datasource 数据库联接池使用的,此处是c3p0 -->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<!-- druid 联接池,同时也提供内部默认的监控,个人推荐 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.23</version>
		</dependency>
		<!-- dbcp使用的默认联接池 配合 commons-pool 使用 -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>1.5.4</version>
		</dependency>


		<!-- 中间件 ibatis -->
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-core</artifactId>
			<version>3.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.3</version>
		</dependency>
		<!-- hiberante 4 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>${org.hibernate-version}</version>
		</dependency>
		<dependency>
			<groupId>org.javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.18.1-GA</version>
		</dependency>
		<!-- http-client -->
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpcore</artifactId>
			<version>4.3.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.3</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.7.4</version>
		</dependency>

		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.7.4</version>
		</dependency>
		<!-- json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.7</version>
		</dependency>
		<!-- memcached -->
		<dependency>
			<groupId>com.whalin</groupId>
			<artifactId>Memcached-Java-Client</artifactId>
			<version>3.0.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.maven-play-plugin.spy</groupId>
			<artifactId>spymemcached</artifactId>
			<version>2.6</version>
		</dependency>

		<!-- servlet3 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.3</version>
			<scope>provided</scope>
		</dependency>

	</dependencies>

</project>

 

特别要注意pom.xml中标红的,那是我使用dubbox-server工程打出来的接口jar包,我上传到了本地仓库中。如果你直接放到了lib中,就不需要此引用。

完整源码包下载

dubbox-service

dubbox-client

 

 

 

 

阿里云服务器初始化

1,阿里云磁盘分区查看 fdisk -l
2,格式化  mkfs -t ext3  /dev/xvdb
3,建立挂载目录 mkdir /data
4,赋予权限 chmod 777 /data
5,挂载 mount /dev/xvdb /data
6,自动挂载 vim /etc/fstab 最后一行添加 /dev/xvdb              /data                   ext3    defaults        0 0
7,reboot
 

No provider available for the service 有更新!

1,在搭建dubbo生产者与消费者过程中,启动生产者正常。。

启动消费者时,提示报错。

报错如下  http://file.xuahua.com/blog/2016/0901/QQ%E5%9B%BE%E7%89%8720160901112511.png

 

配置如下:

生产者 配置文件独立的 spring-dubbo.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
   
    <!-- 具体的实现bean -->  
    <bean id="demoService" class="com.xuahua.service.DemoServiceImpl" />  
      
    <!-- 提供方应用信息,用于计算依赖关系 -->  
    <dubbo:application name="demoService_provider" owner="programmer" organization="dubbox" />  
   
    
    <!-- 使用zookeeper注册中心暴露服务地址 -->  
    <dubbo:registry protocol="zookeeper" address="192.168.0.101:2181"  />   
    
    <!-- 用dubbo协议在20880端口暴露服务 -->  
    <dubbo:protocol name="dubbo" port="20880" />  
   
    <!-- 声明需要暴露的服务接口 -->  
    <dubbo:service interface="com.xuahua.interfaces.DemoService" ref="demoService"  timeout="3000" />  
      
</beans> 

 

消费者配置文件 spring_dubbo.xml

 <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
    <dubbo:application name="demoService_consumer" owner="programmer" organization="dubbox" />  
  
    <!-- 使用zookeeper注册中心暴露服务地址 -->  
 
    <dubbo:registry protocol="zookeeper" address="192.168.0.101:2181" />  
  
    <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
    <dubbo:reference id="demoService"  
        interface="com.xuahua.interfaces.DemoService" check="false" />  

之前定义的interface接口文件  DemoService.java

package com.xuahua.interfaces;

import java.util.List;

/**
 * @author wyong
 * 定义测试例子
 */
public interface DemoService {

	/**
	 * @param name
	 * @return
	 * 定义方法,与某人打招呼
	 */
	String sayHello(String name);  
	  
    /**
     * @return
     * 用户列表
     */
    public List getUsers(); 
}

 

此文件与实现在生产端布署。所以实现文件为

DemoServiceImpl.java

package com.xuahua.service;

import java.util.ArrayList;
import java.util.List;




import org.springframework.stereotype.Service;

import com.xuahua.interfaces.DemoService;
import com.xuahua.model.User;

@Service("demoService")
public class DemoServiceImpl implements DemoService {

	public String sayHello(String name) {
		return "Hello " + name;  
	}

	public List getUsers() {
		 List list = new ArrayList();  
         User u1 = new User();  
         u1.setName("jack");  
         u1.setAge(20);  
         u1.setSex("男");  
           
         User u2 = new User();  
         u2.setName("tom");  
         u2.setAge(21);  
         u2.setSex("女");  
           
         User u3 = new User();  
         u3.setName("rose");  
         u3.setAge(19);  
         u3.setSex("女");  
           
         list.add(u1);  
         list.add(u2);  
         list.add(u3);  
         return list;  
	}

}

 

其中的User.java 自己定义了三个属性。

package com.xuahua.model;

public class User extends BaseEntity {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	String name;
	Integer age;
	String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}

以上为生产者的配置以及实现。

把DemoService接口打成独立 的jar。放到消费者端lib包中。

消费者端,实现

ackage com.xuahua.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.xuahua.interfaces.DemoService;
import com.xuahua.model.User;

@Controller
@RequestMapping("/demo")
public class DemoController {

	DemoService demoService;
	
	
    //定义此方法Uri 请求路径为 /demo/index
	@RequestMapping("/index")
	public String index(Model model){
		List<User> users = demoService.getUsers();
		if(users!=null && !users.isEmpty()){
			for(User u : users){
				System.out.println(u.getName()+"--"+demoService.sayHello(u.getName()));
			}
		}
		System.out.println("=========");
		//默认会读取配置文件中 spring-webmvc.xml 中配置;
		//路径 /WEB-INF/views/index.jsp
		return "index";
	}


	public DemoService getDemoService() {
		return demoService;
	}


	public void setDemoService(DemoService demoService) {
		this.demoService = demoService;
	}

}

 

问题怎么解决?等待揭晓答案。。。。

从二个方面入手。

1,telnet 192.168.0.101 2181 是否ok

2,从消费者发起telnet 192.168.0.38 20880

输入命令应该可以看到提供的服务。

以上记录下。

 

Struts2配置详解_配置Action

转载地址:http://blog.csdn.net/ldl420783321/article/details/7546607

Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。

该方法如下:

   public String execute() throws Exception

Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:

    public String  xxx()

在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。

开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。

 

 

1.    Action映射:
  action
映射是Struts2框架中的基本 工作单元action映射就是将一个请求URL(action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
                   action
元素的完整属性表

属性

是否必须

说明

name

action的名字,用于匹配URL

class

Action实现类的完整类名

method

执行Action类时调用的方法

convert

应用于action的类型转换的完整类名



 

 

 

 

       例如:
<action name="user" class="org.lesson05.UserAction">

                <result name="success">/user.jsp</result>

        </action>

 

    2. 使用method属性
           在配置action时,我们可以通过action元素的method属性来指定action调用的
       
 方法,所指定的方法,必须遵循与execute方法相同的格式。
          
 Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用
        method
属性。
          
 Struts.xml文件中为同一个Action类配置不同的别名
            
<!-- 使用method属性 -->

<package name="methods" namespace="/"

extends="struts-default">

        <!-- 对应着MethodAction里面的execute方法 -->

        <action name="list" class="org.lesson05.MethodAction">

            <result name="success">/Methods/list.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的add方法 -->

        <action name="add" class="org.lesson05.MethodAction"

method="add">

            <result name="success">/Methods/add.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的edit方法 -->

        <action name="edit" class="org.lesson05.MethodAction"

method="edit">

            <result name="success">/Methods/edit.jsp</result>

        </action>

        <!-- 对应着MethodAction里面的delete方法 -->

        <action name="delete"

class="org.lesson05.MethodAction"

 method="delete">

            <result name="success">/Methods/delete.jsp</result>

        </action>

</package>

对应的MethodAction类,代码如下:
            
importcom.opensymphony.xwork2.ActionSupport;

public class MethodAction extends ActionSupport

{

 

    @Override

    public String execute() throws Exception

    {

       return SUCCESS;

    }

   

    public String add() throws Exception

    {

       return SUCCESS;

    }

   

    public String edit() throws Exception

    {

       return SUCCESS;

    }

   

    public String delete() throws Exception

    {

       return SUCCESS;

    }

}

           使用actionmethod属性可以任意指定处理请求的方法(只要该方法和execute

方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不

同的Action类。

           注意:Struts2在根据action元素的method属性查找方法时有两种途径:

           1.查找与method属性值完全一致的方法.
2.
查找doMethod()形式的方法.

   3.动态方法调用:

         另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用

Struts2的动态方法调用。

   动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格

式为 actionName!methodName.action

   例如,我们配置了如下的action

   <action name="user" class="org.lesson05.UserAction">

            <result name="success">/Methods/list.jsp</result>

   </action>

          当请求/user!delete.action时,就会自动调用UserAction中的delete()

提示,这种调用方式会带来安全隐患!

 

4模拟Struts1中的ForwardAction
             <action name="user">

       <result>/index.jsp</result>

              </action>

      这样写就可以了.

 

   5.默认的action

         如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。

         默认的action使用default-action-ref元素来声明,如下所示:

          <!-- 默认action -->

<package name="defaultAction" namespace="/default"

extends="struts-default">

        <default-action-ref name="error"></default-action-ref>    

        <action name="defaultaction"

class="org.lesson05.DefaultAction">

            <result name="success">/defaultAction.jsp</result>

        </action>

        <action name="error">

            <result>/error.jsp</result>

        </action>

    </package>

   注意:根据struts-2.0.dtd中定义的package元素的内容模型,

default-acion-ref必须在action元素之前使用。

   如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1action,那么名为erroraction将被调用。

    注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。

    注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。

 

6.通配符映射

      随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。

      通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。

             以下是在action映射中使用通配符:
              
 <action name="news*"          

class="org.struts2.lesson05.News{1}Action">

                    <result name="success">/WEB-INF/News/{1}.jsp</result>

        </action>

      我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。

      在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action

   执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp

      action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从19的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射:
    
 <action name="*_*" class="org.struts2.lesson05.{1}Action"  

method="{2}">

            <result>/WEB-INF/News/{0}.jsp</result>

        </action>

      当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配deleteclass属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。

      通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:

               <action name="News_*"

class="org.struts2.lesson05.NewsAction" method="{1}">

                    <result>/WEB-INF/News/{0}.jsp</result>

        </action>

       当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法

分布式框架安装与布署-dubbo 有更新!

 前言

在电子商务行业发展到今天,各种应用支持高并发的开源框架进行无数的实践以及验证。其中首推淘宝的dubbo,虽说这套系统淘宝不再跟进升级,但是其他从dubbo衍生出来的分支,dubbox等很多继续在使用中。。

像京东,当当网都是在使用的dubbo框架。

好了,话入正题

 ;)淘宝dubbo,只支持spring2.x ,下载地址 https://github.com/alibaba/dubbo

:)当当网的分支dubbox 已经可以支持spring3.x 下载地址 https://github.com/dangdangdotcom/dubbox

 

root> git clone https://github.com/dangdangdotcom/dubbox dubbo

root> cd dubbo

root> mvn clean install -Dmaven.test.skip=true 

在这里不跳过测试,会出现 N多问题,曾经在此花了N多时间来解决或看源码,最后放弃。。先直接跑起来才是王道。所以加上 -Dmaven.test.skip=true

生成的 com.allibaba.dubbo.jar 在 dubbo/target/目录下。

为了后续应用的使用,把此jar包上传至maven 私有库nexus中。

上传私有库

 

至此,dubbox 编译完成。

二,布署 zookeeper注册中心  原址:http://blog.csdn.net/huwei2003/article/details/49101269

官网文档地址大全:

OverView(概述)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperOver.html

Getting Started(开始入门)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html

Tutorial(教程)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperTutorial.html

Java Example(Java示例)
http://zookeeper.apache.org/doc/r3.4.6/javaExample.html

Programmer's Guide(开发人员指南)
http://zookeeper.apache.org/doc/r3.4.6/zookeeperProgrammers.html

Recipes and Solutions(技巧及解决方案)
http://zookeeper.apache.org/doc/r3.4.6/recipes.html

3.4.6 API online(在线API速查)

http://zookeeper.apache.org/doc/r3.4.6/api/index.html

另外推荐园友sunddenly的zookeeper系列
http://www.cnblogs.com/sunddenly/category/620563.html

 

文在一台机器上模拟3个 zk server的集群安装

1.1 下载解压

解压到3个目录(模拟3台zk server):

  /home/hadoop/zookeeper-1
  /home/hadoop/zookeeper-2
  /home/hadoop/zookeeper-3
1.2 创建每个目录下conf/zoo.cfg配置文件

/home/hadoop/zookeeper-1/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk1/data
dataLogDir=/home/hadoop/tmp/zk1/log
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

/home/hadoop/zookeeper-2/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk2/data
dataLogDir=/home/hadoop/tmp/zk2/log
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

/home/hadoop/zookeeper-3/conf/zoo.cfg 内容如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zk3/data
dataLogDir=/home/hadoop/tmp/zk3/log
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389

注:因为是在一台机器上模拟集群,所以端口不能重复,这里用2181~2183,2287~2289,以及3387~3389相互错开。另外每个zk的instance,都需要设置独立的数据存储目录、日志存储目录,所以dataDir、dataLogDir这二个节点对应的目录,需要手动先创建好。

另外还有一个灰常关键的设置,在每个zk server配置文件的dataDir所对应的目录下,必须创建一个名为myid的文件,其中的内容必须与zoo.cfg中server.x 中的x相同,即:

/home/hadoop/tmp/zk1/data/myid 中的内容为1,对应server.1中的1
/home/hadoop/tmp/zk2/data/myid 中的内容为2,对应server.2中的2
/home/hadoop/tmp/zk3/data/myid 中的内容为3,对应server.3中的3

生产环境中,分布式集群部署的步骤与上面基本相同,只不过因为各zk server分布在不同的机器,上述配置文件中的localhost换成各服务器的真实Ip即可。分布在不同的机器后,不存在端口冲突问题,可以让每个服务器的zk均采用相同的端口,这样管理起来比较方便。

1.3 启动验证

/home/hadoop/zookeeper-1/bin/zkServer.sh start

/home/hadoop/zookeeper-2/bin/zkServer.sh start

/home/hadoop/zookeeper-3/bin/zkServer.sh start
启用成功后,输入 jps 看下进程

20351 ZooKeeperMain
20791 QuorumPeerMain
20822 QuorumPeerMain
20865 QuorumPeerMain

应该至少能看到以上几个进程。

可以启动客户端测试下:

bin/zkCli.sh -server localhost:2181
(注:如果是远程连接,把localhost换成指定的IP即可)

成功后,应该会进到提示符下,类似下面这样:

[zk: localhost:2181(CONNECTED) 0]

 

二,布署dubbo-admin-2.8.4.war包,

进入dubbo目录

root> cd dubbo-admin

root> mvn clean package -Dmaven.test.skip=true

打包以后,复制 dubbo-admin.2.8.4.war包复制到 tomcat webapps/root中。

注意:

如果启动提示找不到 /META-INF/spring/dubbo-admin.xml

可以在 源码文件中找到或者修改 /WEB-INF/webx.xml 

<!-- 应用资源 -->
<beans:import resource="common/dubbo-admin.xml" />
<!-- <beans:import resource="classpath:/META-INF/spring/dubbo-admin.xml" /> -->

我把dubbo-admin.xml 复制到了 /WEB-INF/common/目录下。

同时修改tomcat中server.xml中 port=8090

访问 http://localhost:8090/dubbo-admin.2.8.4/ 根据个人情况,我是直接使用源码编译至 root目录下,所以访问路径有些变化,http://localhost:8090/

如下图dubbo后台

 

 

 

 

三,监控dubbo-monitor布署

下载

root> git clone https://github.com/handuyishe/dubbo-monitor dubbo-monitor

root> cd dubbo-monitor

root>mvn clean package -Dmaven.test.skip=true

进入 target 目录找到 dubbo-monitor.2.8.4.war 

布署到tomcat webapps/root/目录中。。我是解压后再扔进去,没有dubbo-monitor.2.8.4 这层目录,所以访问直接使用http://localhost:8091/即可;

修改service.xml 。因为已经存在一个host,需要同时复制一个host,同时修改port=8091

重启tomcat。

访问http://localhost:8091/

结果如下 dubbo-monitory

 

 

如何解决热点数据更新问题

原创地址: http://blog.itpub.net/22664653/viewspace-1269948/

一 背景
     某个业务线 商品开放开用户申请免费试用,当某个商品特别吸引人时,比如iPhone6 。肯定有一大波人为了少卖一个肾 疯狂去抢申请资格。有甚者利用机器人申请注册,于是简单的申请操作变成了秒杀行为. 大量请求同时更新数据库中的同一个商品的申请次数,update 操作给表加上行锁,导致后面的请求全部排队等待前面一个update完成,释放行锁后才能处理下一个请求。大量后来请求等待,占用了数据库的连接。一旦数据库连接数被占满,就会导致后来的全部请求因拿不到连接而超时,业务请求出现无法及时处理的情况,数据库系统的RT会异常飙高,业务层由于等待出现超时,app 层的连接耗尽,一系列的雪崩效应!

二 解决方案
     从上面的背景分析,解决热点数据并发更新需要注意核心问题: 减少直接对db层数据热点的并发更新,本文从业务和数据库的设计层面来规划.同时也希望大家提更好的解决思路。
1 前端层面
   前端是整个流量的入口, 正常业务访问时系统表现平稳,但是当有人恶意请求时,需要加上流控措施,比如常见的
   a 需要用户回答问题,填写验证码,移动图像等等,防止或者减少有机器人来恶意请求。
   b 页面上采用防止机器人的判断 两秒以内的成功请求一律拒绝。
   c 通过设置nginx ,对同一个ip源的请求次数做限制,防止机器人来申请。
  优点 有效减少或者防止有人利用机器人恶意请求
  缺点 存在一定的误杀率,错杀了正常的请求。

2 应用层
    应用程序接收前端前端请求,进行一系列的数据库操作,在我们规避了恶意请求之后如果还是有大量的数据库写访问请求,我们需要
    a 对业务做降级
限制接口的调用次数,降低对数据库的请求压力。
选择不更新请求次数,弱化该商品申请次数的展现。类似于阅读次数,申请次数 ,与金额,库存无关的功能点。

    b 通过异步更新来避免直接写数据库 。
      应用使用分布式缓存(比如tair)来存储某项商品的申请次数或者某人的申请次数,以商品id/user_id 或者将where 条件作为key,申请试用人数为value/符合某项具体条件的 count结果为value, 有用户申请成功则更新申请试用人数。不需要查询和实时写数据库,每隔一定时间/次数将结果写入数据库。
      优点:该方法完全依赖于缓存,读写速度快,不需要实时更新数据库,减轻数据库并发写的压力;
      缺点:缓存不是100%稳定,很容易丢,即使采用持久化的缓存,在高并发下有时也可能会出现异常,穿透缓存到db ,导致前端业务展现问题。
    
3 数据库层
    a 将热点数据拆分,分在不同的库不同的表中,分散热点数据,减轻数据库并发更新热点带来的RT升高和应用连接等待时能保证业务能够正常访问其他商品表,损失局部可用性。
    优点:实时读写数据库,前端展示数据的准确性。
    缺点:业务逻辑稍显复杂。
  b 限流补丁
     针对某些特定的sql语句 从MySQL 层面加以限制,当系统thread_running达到一定值或者某个sql执行时间超过一定阈值则拒绝该sql的执行。(阿里内部已经实现限流版本)
   c 使用MySQL的 thread pool 功能。在并发较大时,one to one的模式会引起Innodb的mutex锁争用。当前解决方法是通过innodb_thread_concurrency参数,但是该参数自身也存在锁争用,同样影响了MySQL的性能。
优点:thread pool主要从四个方面考虑:减少SQL并发,使得有足够的资源:使用线程组,独立管理:使用优先级队列,限制并发执行的事务:避免死锁。
缺点:在测试过程中发现,会有大量的连接等待kernel mutex锁,但是持续的压力会导致MySQL的thread running飙高,最终导致MySQL不可用。
三 小结
     在电商类业务中数据库的热点/单点更新 一直是DBA和业务方比较关心的问题,它最直观的影响用户体验,比如商品的超卖,系统的可用性。需要不断的细化解决思路和具体实现比如 热点商品的属性是否实时更新 ,库存数量需要实时展示,访问次数,请求次数可以异步延迟展示。本文只是简单阐述了 对热点更新的解决思路,还有不完善的地方,欢迎给位提供更好的建议。
 

liunx下FTP快速搭建 有更新!

1,查看系统是否已经安装

rpm -qa |grep vsftpd

vsftpd服务器快速搭建

2,安装

yum install vsftpd -y

vsftpd快速搭建

3,重启 service vsftpd start|restart|stop

 

4,建立ftp账号密码

建用户:在root用户下:
useradd -d /home/ftp   ftpuser //增加用户ftpuser,并制定ftpuser用户的主目录为/home/ftp
passwd ftpuser                        //为ftpuser设置密码
 

5, 修改配置文件

root>vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO ##禁用匿名账号

local_enable=YES

write_enable=YES

 最后在该文件的最后面添加如下行:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

chroot_list_enable=YES //限制访问自身目录
 
chroot_list_file=/etc/vsftpd/chroot_list #指定账号密码文件


最后保存/etc/vsftpd/vsftpd.conf文件。

6,写入账号访问路径限制

root>vim /etc/vsftpd/chroot_list

ftpuser /home/ftp

 

保存退出。

root>service vsftpd restart

httpclient4.x 模拟post请求

     /**
	 * @param url
	 * @param data
	 * @param encode
	 *            指定头编码
	 * @return
	 */
	public static String postRequest(String url, Map<String, String> data,
			String encode) {
		if(StringUtils.isBlank(encode)){
			encode = "utf8";
		}
		StringBuilder sb = new StringBuilder();
		CloseableHttpClient httpclient = HttpClientBuilder.create().build();
		HttpPost httppost = new HttpPost(url);
		postRequestconfig(httppost);
        try{
        	if (data != null) {
        		List<NameValuePair> dataary = new ArrayList<NameValuePair>();
				for (String mapKey : data.keySet()) {
					// 填入各个表单域的值
					String vString = data.get(mapKey) == null ? "" : data.get(
							mapKey).toString();
					NameValuePair data1 = new BasicNameValuePair(mapKey, vString);
					dataary.add(data1);
				}
				// 将表单的值放入postMethod中
				 httppost.setEntity(new UrlEncodedFormEntity(dataary,encode));
			}
	        CloseableHttpResponse response = httpclient.execute(httppost);
	        int statusOk = response.getStatusLine().getStatusCode();
	        if(logger.isInfoEnabled()){
	        	logger.info(url+"result-statusCode=>>"+statusOk);
	        }
	        if(statusOk == HttpStatus.SC_OK){
	        	HttpEntity entity = response.getEntity();
	        	BufferedInputStream instream = new BufferedInputStream(entity.getContent()); 
		        byte[] chars = new byte[2048];
		        int len=0;
		        while((len=instream.read(chars))!=-1){
		        	sb.append(new String(chars,0,len,encode));
		        }
		        instream.close();
		        response.close();
	        }else{
	        	logger.error(url+"result->网络异常.."+statusOk);
	        }
	        if(logger.isInfoEnabled()){
	        	logger.info(url+"result->"+sb.toString());
	        }
        }catch(Exception e){
        	e.printStackTrace();
        }finally{
        	httppost.releaseConnection();
        	try {
				httpclient.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
        return sb.toString();
	}

公告

喧哗博客--繁华过后的沉寂--技术经验分享^-^
Copyright (c) 2009-2019, b3log.org & hacpai.com