VO
Value Object / View Object 專門為視圖定制的模型
如:
class MessageVO {
private int id;
private String title;
private String pubDate;
private String nickname;
private String[] filenames;
public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
public MessageVO(Message message) {
this.id = message.getId();
this.title = message.getTitle();
this.pubDate = format.format(message.getPubDate());
this.nickname = message.getPubUser().getNickname();
}
}
DTO
Data Transfer Object 數(shù)據(jù)傳輸對(duì)象
分層架構(gòu)
分層架構(gòu)(事務(wù)腳本模式) 用戶有一個(gè)請(qǐng)求 在業(yè)務(wù)中就有一個(gè)方法 就有一個(gè)事務(wù)
微服務(wù)架構(gòu)/六邊形架構(gòu)
反射工具類
clazz.getField(String arg) 得到目標(biāo)類中指定的某個(gè)public屬性對(duì)應(yīng)的Field對(duì)象
clazz.getDeclaredField(String arg) 同getField列肢,但不局限于public修飾,只要是目標(biāo)類中聲明的屬性均可
f.setAccessible(true) 設(shè)置屬性可修改
f.get(target) 拿到對(duì)象實(shí)例的 域成員的值
例子1:根據(jù)字段名查找字段的類型
先
/**
* 根據(jù)字段名查找字段的類型
* @param target 目標(biāo)對(duì)象
* @param fieldName 字段名
* @return 字段的類型或null
*/
public static Class<?> getFieldType(Object target, String fieldName) {
Class<?> clazz = target.getClass();
String[] fs = fieldName.split("\\.");
try {
for (int i = 0; i < fs.length - 1; ++i) {
Field f = clazz.getDeclaredField(fs[i]);
target = f.getType().newInstance();
clazz = target.getClass();
}
return clazz.getDeclaredField(fs[fs.length - 1]).getType();
}
catch (Exception e) {
return null;
}
}
例子2:獲取對(duì)象所有字段的名字
/**
* 獲取對(duì)象所有字段的名字
* @param obj 目標(biāo)對(duì)象
* @return 字段名字的數(shù)組
*/
public static String[] getFieldNames(Object obj) {
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
List<String> fieldNames = new ArrayList<>();
for (int i = 0; i < fields.length; i++) {
if ((fields[i].getModifiers() & Modifier.STATIC) == 0) {
fieldNames.add(fields[i].getName());
}
}
return fieldNames.toArray(new String[fieldNames.size()]);
}
例子3:通過反射取對(duì)象指定字段(屬性)的值
1.根據(jù)傳入的target對(duì)象得到target的類信息
2.將傳入的字段名字根據(jù).分割成字符串?dāng)?shù)組
3.限定小于fs.length() - 1之間循環(huán) 如果字符串長(zhǎng)度為2 循環(huán)一次
4.用clazz根據(jù)字段名用getDeclaredField()方法拿到字段對(duì)象
5.將字段對(duì)象設(shè)置為可以修改的
6.f.get(target)字段對(duì)象根據(jù)傳入的target對(duì)象拿到對(duì)應(yīng)target實(shí)例中參數(shù)的值抄淑,如果是基本類型int 就拿到對(duì)應(yīng)的值23刻剥,如果是類Car育灸,就拿到對(duì)象car
7.根據(jù)對(duì)應(yīng)屬性的值得到對(duì)應(yīng)字段值對(duì)象的類信息 如: String 對(duì)應(yīng) String的類信息腻窒, 自己定義的Car類 得到對(duì)應(yīng)的Car類的類信息
8.如果循環(huán)未結(jié)束,繼續(xù)向下磅崭。如Person中有Car這個(gè)對(duì)象屬性,拿到之后向下繼續(xù)得到Engine對(duì)象儿子。
9.若循環(huán)結(jié)束 或 字符串?dāng)?shù)組長(zhǎng)度為1,直接fs[fs.length - 1]得到對(duì)應(yīng)的字段绽诚,設(shè)置可以訪問權(quán)限
10.返回字段的值
/**
* 通過反射取對(duì)象指定字段(屬性)的值
* @param target 目標(biāo)對(duì)象
* @param fieldName 字段的名字
* @throws 如果取不到對(duì)象指定字段的值則拋出異常
* @return 字段的值或null
*/
public static Object getValue(Object target, String fieldName) {
Class<?> clazz = target.getClass();
String[] fs = fieldName.split("\\.");
try {
for (int i = 0; i < fs.length - 1; i++) {
Field f = clazz.getDeclaredField(fs[i]);
f.setAccessible(true);
target = f.get(target);
clazz = target.getClass();
}
Field f = clazz.getDeclaredField(fs[fs.length - 1]);
f.setAccessible(true);
return f.get(target);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
例子4:通過反射給對(duì)象的指定字段賦值
/**
* 通過反射給對(duì)象的指定字段賦值
* @param target 目標(biāo)對(duì)象
* @param fieldName 字段的名稱
* @param value 值
* @throws
*/
public static void setValue(Object target, String fieldName, Object value) {
Class<?> clazz = target.getClass();
String[] fs = fieldName.split("\\.");
try {
for (int i = 0; i < fs.length - 1; i++) {
Field f = clazz.getDeclaredField(fs[i]);
f.setAccessible(true);
Object val = f.get(target);
if (val == null) {
Constructor<?> c = f.getType().getDeclaredConstructor();
c.setAccessible(true);
val = c.newInstance();
f.set(target, val);
}
target = val;
clazz = target.getClass();
}
Field f = clazz.getDeclaredField(fs[fs.length - 1]);
f.setAccessible(true);
f.set(target, value);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
安全性
基本驗(yàn)證
web.xml配置
配置安全性約束
<security-constraint>
指定需要安全約束的資源
<web-resource-collection>
<web-resource-name>protected</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>DIGEST</auth-method>
<realm-name>protected</realm-name>
</login-config>
tomcat-users.xml配置
<!-- AA - Authentication / Authorization -->
<!-- What you konw? -->
<!-- What you have? -->
<!-- Whom you are? -->
<role rolename="authorizedUser" />
<role rolename="admin" />
<role rolename="manager" />
<role rolename="emp" />
<user username="jack" password="123456" roles="admin,manager" />
客戶端證書驗(yàn)證
如果創(chuàng)建了keystore
rm .keystore
第一步:
keytool -genkey -alias tomcat -keyalg RSA
第二步:
keytool - certreq -alias tomcat -file tomcat.csr
第三步:
keytool -importcert -alias tomcat -file tomcat.cer