2017-6-13
Lifusen 此文章仅代表个人观点,如有问题提出请联系Q:570429601
1、Hibernate (开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
!(Hibernate默认用的是slf4j-nop.jar日志实现方式。
但是我们可以替换成log4j的实现。但不是简单的加上log4j-1.2.17.jar就行了。
中间还需要一个转换器slf4j-log4j12-1.5.8.jar)
1.在src目录下创建hibernate.cfg.xml配置文件(文件名字不能修改)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/sampe_h5_db</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 为Hibernate指定不同数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property> <mapping class="sample.h5.entity.User" />     <!-- create and update the database automaticlly -->
<property name="hbm2ddl.auto">update</property> <!-- javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个
bean-validation**包,但是找不到,所以beanvalitionFactory错误 -->
<property name="javax.persistence.validation.mode">none</property> </session-factory>
</hibernate-configuration> 注意: hibernate.hbm2ddl.auto属性不要乱用,也可以不用
(1)<property name="hibernate.hbm2ddl.auto"> create-drop </property> create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用 (2)<property name="hibernate.hbm2ddl.auto">create</property> 在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格 (3)<property name="hibernate.hbm2ddl.auto">update</property> 只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构 (4)<property name="hibernate.hbm2ddl.auto">validate</property> 校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用 最后一条javax.persistence.validation.mode可以不用,
加上<mapping class="sample.h5.entity.User" />
------------------------------------------------------------------------------------------------------------------------------------------
@Entity
@Table(name="tbl_book")
public class Book { @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="bid")
private Integer id; @Column(name="btitle")
private String title; @ManyToOne
@JoinColumn(name="bcategoryid")
private Category category; category--- @OneToMany(mappedBy="category")
private Set<Book> books; @Column(name="otime")
@Temporal(TemporalType.TIMESTAMP)
private Date time; @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER, mappedBy="order")级联,紧急加载
private Set<OrderItem> items = new HashSet<OrderItem>(); //组件注解:使用Embedded注解说明,我要使用ZhangHao(组件类)类中的属性来匹配表中的列(数据库没有实体对应)
@Embedded
@AttributeOverrides({
@AttributeOverride(name="username", column=@Column(name="uloginid")),
@AttributeOverride(name="password", column=@Column(name="uloginpsw"))
})
private ZhangHao zhaoHao; @ElementCollection(fetch=FetchType.EAGER) // 将所有集合的默认抓取策略(fetch),LAZY(延迟加载)设置成EAGER(紧急加载)
@CollectionTable(name="tbl_tel", joinColumns=@JoinColumn(name="tuid"))
@Column(name="tphone")
@SortNatural
private SortedSet<String> phones = new TreeSet<String>(); @ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name="tbl_score", joinColumns=@JoinColumn(name="suid"))
@MapKeyColumn(name="scourse")
@Column(name="sscore")
@SortNatural @ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name="tbl_recieve", joinColumns=@JoinColumn(name="ruid"))
@MapKeyColumn(name="rname")
@OrderBy(clause="rid")
private Map<String, Recieve> recieves = new HashMap<String, Recieve>();
private Map<String, Integer> scores = new HashMap<String, Integer>(); @Column(name="uregistDate", updatable=false)
// 日期时间类型的注解
@Temporal(TemporalType.DATE)
private Date registDate; // 计算列:该注解修饰的字段(count)是根据注解指定的语句查询计算出来的值,并不存在一个叫做count的列在表中
@Formula("(select count(*) from tbl_user)")
private Integer count; // 瞬时属性的注解:表示Hibernate忽略该属性
@Transient
private String other; hql
// 查询出一组或一个实体对象
//List<Book> list = session.createQuery("from Book b where b.title = '西游记'").list();
查出单个的对象(值)
//Object result = session.createQuery("select avg(b.price) from Book b").uniqueResult();
// hql的更新和修改
//int row = session.createQuery("update Book b set b.price = b.price * 0.8").executeUpdate();
//System.out.println("修改了" + row +"本书的价格!"); int pageSize = 2;
int pageNO = 1;
List<Book> list = session.createQuery("from Book b where b.price >= :price")
.setParameter("price", 30.0)
.setFirstResult((pageNO-1) * pageSize)
.setMaxResults(pageSize)
.list();
//String hql = "from Book b where b.title <> '西游记' and b.price >= 50 ";
//String hql = "from Book b where b.title like '%记%'";
//String hql = "from Book b where b.price between 40 and 80";
//String hql = "from Book b where b.author in ('吴承恩', '司马迁')";
//String hql = "from Book b where b.category is not null";
//String hql = "select b from Book b, Category c where b.category = c";
//String hql = "select b.id, b.title, b.price from Book b";
//String hql = "select new list(b.id, b.title, b.price) from Book b";
//String hql = "select new map(b.id as ID, b.title as 标题, b.price as 价格) from Book b";
//String hql = "select new Book(b.id, b.title, b.price) from Book b";
//String hql = "from Book b where b.category.name = '历史'";
//String hql = "select b from Book b left join b.category c where c.name = '历史' ";
//String hql = "select distinct c from Category c left join fetch c.books b where b.price < 30.0";
//String hql = "select c from Category c where size(c.books) > 0 order by c.id";
String hql = "select new map(b.category.name as 分类, count(b) as 图书本数, avg(b.price) as 图书平均售价) from Book b group by b.category having avg(b.price) >= 40.0 order by 图书平均售价 desc"; List<Map> list = session.createQuery(hql).list();
/*
List<Order> orders = session.createCriteria(Order.class)
.add(Restrictions.ge("money", 300.0))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
*/ 连接池
hibernate.cfg.xml
<property name="hibernate.c3p0.min_size">5</property><!-- 连接池中最小连接数 -->
<property name="hibernate.c3p0.max_size">20</property><!-- 连接池中最大连接数 -->
<property name="hibernate.c3p0.timeout">120</property><!-- 设定数据库连接超时时间,以秒为单位。如果连接池中某个数据库连接处于空闲状态且超过timeout秒时,就会从连接池中移除-->
<property name="hibernate.c3p0.idle_test_period">3000</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="D:\ehcacheData"/> <defaultCache
maxElementsInMemory="1000"
eternal="false"
overflowToDisk="true"
diskPersistent="true"
timeToIdleSeconds="120"
timeToLiveSeconds="240"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache> 存储过程
// 创建了一个存储过程 调用器对象
ProcedureCall call = session.createStoredProcedureCall("getOrderDetails");
call.registerParameter("m", Double.class, ParameterMode.IN).bindValue(300.0);
call.registerParameter("c", Long.class, ParameterMode.OUT); ProcedureOutputs outputs = call.getOutputs(); // 从存储过程的输出的对象组中,获取输出参数的值
Long count = (Long) outputs.getOutputParameterValue("c"); // 从存储过程的输出的对象组中获取结果集类型的输出结果
ResultSetOutput output = (ResultSetOutput) outputs.getCurrent();
// 从结果集类型的输出结果中,获取数据列表
List<Object[]> orderinfos = output.getResultList(); System.out.println("下单顾客\t下单次数\t总消费额");
for(Object[] orderinfo : orderinfos) {
System.out.println(orderinfo[0] + "\t" + orderinfo[1] + "\t" + orderinfo[2]);
}
System.out.println("\n订单金额在200以上的订单数量是:" + count );
}
命名查询
// 调用session的创建命名查询对象的方法:createNamedQuery
List<Order> orders = session.createNamedQuery("getOrdersByMoney", Order.class)
.setParameter("minMoney", 300.0)
.list(); for(Order o : orders) {
System.out.println(o.getId() + ", " + o.getCustomer() + ", " + o.getMoney() + ", " + o.getTime() + ", " + o.getItems());
}
}
存储过程2
@Test
public void testSencodLevelCache() {
Category c1 = session.get(Category.class, 1);
System.out.println(c1.getId() +", " + c1.getName()); session.createQuery("from Category c").setCacheable(true).list();
} @Test
public void testSencodLevelCache2() {
Category c1 = session.get(Category.class, 1);
System.out.println(c1.getId() +", " + c1.getName());
session.createQuery("from Category c").setCacheable(true).list();
}
二级缓存
List<Book> list = session.createQuery("from Book b left join fetch b.category").list();
for(Book elem : list) {
System.out.println(elem);
}
List<Category> list2 = session.createQuery("select distinct c from Category c left join fetch c.books").list();
for(Category elem : list2) {
System.out.println(elem);
}
总结: 1、一级缓存是session级别的,二级缓存和查询缓存都是sessionfactory级别的,查询缓存和二级缓存是一起来使用的 2、任何sql执行都会存入到同一个session的一级缓存中去 3、同时开启查询缓存和二级缓存,可以在不同session间共享缓存的结果 4、二级缓存缓存的是实体,不是属性 5、查询缓存的结果如果只是属性,那么查询缓存中存储的是id和属性的值,如果是实体的集合,那么查询缓存存储的只是实体的id,对应的实体会存储到二级缓存中去。 6、不同session间返回数据的顺序是,二级缓存先将数据返回,然后将数据存入本session的一级缓存中去,以便下次调用时的使用 2、Struts2:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
1. web.xml
<filter>
<filter-name>struts2-filter</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 如果你的Action类没有继承ActionSupport,而你又没有在struts.xml中对应<action>标签中用method属性指定你自己的方法的话,
默认就要找execute方法,这时是必须要实现execute方法的,否则Struts2会找不到对应的方法而报错。
src下面struts.xml
<struts> <!-- 配置的是全局的国际化资源包的基础包名 -->
<constant name="struts.custom.i18n.resources" value="myRes" /> <!-- 配置常量:struts.devMode是控制是否启用开发模式 -->
<constant name="struts.devMode" value="false" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <include file="struts-user.xml" /> <package name="default" extends="struts-default"> <!-- 指定当前包中的默认处理器为notFound处理器:当请求到当前包中时,没有匹配到对应的action,则执行该默认action
<default-action-ref name="notFound" />
-->
<action name="notFound">
<result>/WEB-INF/jsp/not-found.jsp</result>
</action> </package> </struts> struts-user.xml
<package name="zjp" extends="struts-default" namespace="/"> <!-- 全局(包范围)结果定义 -->
<global-results>
<result name="ex">/WEB-INF/jsp/errorHandle.jsp</result>
</global-results> <!-- 全局(包范围)“异常映射”定义 -->
<global-exception-mappings>
<exception-mapping result="ex" exception="java.lang.Exception" />
</global-exception-mappings> <action name="userLoginForm" class="sample.s2.web.action.UserAction"
method="loginForm">
<result name="success" type="dispatcher">
<param name="location">/WEB-INF/jsp/login.jsp</param>
</result>
</action> <action name="userLogin" class="sample.s2.web.action.UserAction"
method="login">
<result name="success" type="redirectAction">userHome</result>
<result name="error" type="chain">userLoginForm</result>
</action> <action name="userHome" class="sample.s2.web.action.UserAction"
method="home">
<result>/WEB-INF/jsp/home.jsp</result>
</action> <action name="userRegistForm" class="sample.s2.web.action.UserAction"
method="registForm">
<result>/WEB-INF/jsp/regist.jsp</result>
</action> <action name="userRegist" class="sample.s2.web.action.UserAction" method="regist">
<result type="chain">userRegistForm</result>
</action> </package> <package name="back" extends="struts-default" namespace="/mgr"> <global-results>
<result name="ex">/WEB-INF/jsp/errorHandle.jsp</result>
</global-results> <global-exception-mappings>
<exception-mapping result="ex" exception="java.lang.Exception" />
</global-exception-mappings> <action name="adminLoginForm">
<result>/WEB-INF/jsp/mgr/admin-login.jsp</result>
</action>
</package> <s:debug></s:debug>标签
type------------chain 、dispatcher 、stream 、redirect 、redirectAction
UserAction 继承ActionSupport
private User u; 有get set 下面有
private Integer id;
private String name;
private Integer age;
private Date birthdate;
private boolean married;
private List<Integer> luckyNumbers;
private List<Parent> parents;
private List<Game> games; 国际化资源包myRes_zh_CN.properties 、myRes_en_US.properties
<a href="/SampleStruts2/userLoginForm?request_locale=zh_CN">中文</a> | <a href="/SampleStruts2/userLoginForm?request_locale=en_US">English</a>
user.home.header=Hello:{0},Welcome to the site!
<h3><s:text name="user.home.header"><s:param>${currLoginId }</s:param></s:text></h3>
前端:<p><s:text name="user.login.form.label.loginId" /><input type="text" name="u.loginId" value="${loginId }" /></p>
后端:ctx.put("loginErrorMsg", super.getText("user.login.faile"));
服务器异常查看
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>服务器异常</title>
<script type="text/javascript"> function showDetails() {
document.getElementById('details').style.display = 'block';
}
</script>
</head>
<body>
<h3>Sorry,服务器出错了,请稍后再试!</h3>
<p><a href="javascript: showDetails();">技术人员,查看详情</a></p> <div id='details' style="font-size:12px; color: red; display:none;">
<p style="font-size:14px; font-weight: bold;">${ exception }</p> <s:iterator value="#request.exception.stackTrace">
<p><s:property /></p>
</s:iterator>
</div>
</body>
</html> 传入id转成类
<p>喜欢的游戏:
<s:iterator value="#allGames" var="g">
<input type="checkbox" name="u.games" value="${g.id }" />${g.name }&nbsp;
</s:iterator>
</p>
src下面xwork-conversion.properties
内容sample.s2.entity.Game=sample.s2.web.typeconverter.GameTypeConverter
GameTypeConverter extends StrutsTypeConverter 内容
@Override
public Object convertFromString(Map context, String[] params, Class kls) {
int id = Integer.parseInt(params[0]);
Game game = new Game();
game.setId(id);
return game;
} @Override
public String convertToString(Map arg0, Object obj) {
Game game = (Game)obj;
return "游戏信息:id=" + game.getId() + ", name=" + game.getName();
} struths验证 userAction
private User u;
同包下面userAction_zh_CN.properties
invalid.fieldvalue.u.age=\u7528\u6237\u5E74\u9F84\u503C\u683C\u5F0F\u9519\u8BEF\uFF0C\u5FC5\u987B\u662F\u4E2A\u6574\u6570 //年龄格式错误,必须是个整数
invalid.fieldvalue.u.birthdate=\u51FA\u751F\u65E5\u671F\u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u8BE5\u4F8B\u5982\uFF1A1995-01-01 //出生日期格式错误,应该例如:1995-01-01
如果没有就在xwork.default.invalid.fieldvalue=\u6570\u636E\u7684\u683C\u5F0F\u9519\u8BEF\u201C{0}\u201D //数据的格式错误
前端显示<s:property value="[0].fieldErrors" />
格式验证失败返回input 上传文件
<action name="userRegist" class="sample.s2.web.action.UserAction" method="regist">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg, image/png, image/gif</param>
<param name="maximumSize">1024000</param>
</interceptor-ref>
<interceptor-ref name="myDefault"/>
<result name="input" type="chain">userRegistForm</result>
</action> userAction_zh_CH.properties
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=\u6587\u4EF6{1}\u592A\u5927\u4E86\uFF0C\u5FC5\u987B\u5C0F\u4E8E {4} \u5B57\u8282\uFF01
struts.messages.error.content.type.not.allowed=\u5934\u50CF\u6587\u4EF6\u5FC5\u987B\u662F\u56FE\u7247
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3} private File face;
if(face != null) {
System.out.println("face: " + face); System.out.println("faceContentType: " + faceContentType);
/* 获取相对网站根路径的相应的磁盘路径 */
String realPath = ServletActionContext.getServletContext().getRealPath("/upload/" + faceFileName);
try {
FileUtils.copyFile(face, new File(realPath));
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("用户未上传头像"); 强加验证
UserAction-userRegist-validation.xml
<field name="u.age">
<field-validator type="required">
<message>年龄必填</message>
</field-validator>
<field-validator type="int">
<param name="min">18</param>
<param name="max">40</param>
<message>年龄必须在18到40岁之间</message>
</field-validator>
</field> <field name="u.birthdate">
<field-validator type="required">
<param name="trim">true</param>
<message>出生日期不能为空</message>
</field-validator>
</field> </validators>
前端
<s:property value="[1].fieldErrors['u.birthdate'][0]" />
自定义验证类型
src validators.xml
<validators>
<validator name="zip" class="sample.s2.web.validator.ZipValidator" />
</validators> class
public class ZipValidator extends FieldValidatorSupport { @Override
public void validate(Object action) throws ValidationException {
String fieldName = super.getFieldName(); // "zip"
String fieldValue = (String) super.getFieldValue(fieldName, action); // "610000"
if(fieldValue != null && !fieldValue.equals("")) {
System.out.println("fieldName: " + fieldValue);
System.out.println("fieldValue: " + fieldValue);
if(!Pattern.matches("^\\d{6}$", fieldValue)) {
super.addFieldError(fieldName, action);
}
}
} } UserAction-userRegist-validation.xml
<field name="zip">
<field-validator type="zip">
<message>邮政编码格式错误!</message>
</field-validator>
</field> 拦截器
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="sample" class="sample.s2.web.interceptor.SampleInterceptor" />
<interceptor name="log" class="sample.s2.web.interceptor.LogInterceptor">
<param name="datePattern">yyyy年MM月dd日 HH点mm分ss秒</param>
</interceptor>
<interceptor-stack name="myDefault">
<interceptor-ref name="log" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors> <!-- 配置默认拦截器引用: 该包下的所有未直接配置拦截器引用的action,都使用myDefault这个拦截器栈 -->
<default-interceptor-ref name="myDefault" /> 文件下载
<action name="download" class="sample.s2.web.action.ResourceAction" method="download">
<result name="success" type="stream">
<param name="inputName">is</param>
<param name="contentType">${contentType}</param>
<param name="contentDisposition">attchement;filename=${fileName}</param>
<param name="bufferSize">4096</param>
</result>
</action> private Integer rid; private InputStream is;
private String fileName;
private String contentType; //get set
public String download() throws UnsupportedEncodingException { System.out.println("download... rid: " + rid);
if(rid == 1001) {
// 想下载/WEB-INF/resources/bbs_gd.doc
this.is = ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/resources/bbs_gd.doc");
this.fileName = URLEncoder.encode("bbs设计文档.doc", "utf-8");
System.out.println("fileName encode: " + this.fileName);
System.out.println("fileName decode: " + URLDecoder.decode(this.fileName, "UTF-8"));
this.contentType="application/msword";
} else if(rid == 1002) {
// 想下载10.jpg
this.is = ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/resources/10.jpg");
this.fileName = "10.jpg";
this.contentType = "image/jpeg";
}
// ActionContext.getContext().put("downloadError", "下载失败:必须是登录用户才能下载,现在马上<a href='#'>去登录</a>。");
return SUCCESS;
} private InputStream fengJingInputName; @Override
public String execute() throws Exception { this.fengJingInputName = ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/resources/Ajax:2.avi");
return SUCCESS;
} <action name="downloadFengJing" class="sample.s2.web.action.DownloadFengJingAction">
<!-- 启用拦截器:为当前处理器 -->
<interceptor-ref name="sample" />
<interceptor-ref name="myDefault" />
<result type="stream">
<param name="inputName">fengJingInputName</param>
<param name="contentDisposition">attchement;filename=Ajax:2.avi</param>
</result>
</action> 权限验证
<package name="management" extends="json-default" namespace="/mgr">
<interceptors>
<!-- 声明“权限验证”拦截器 -->
<interceptor name="authority" class="sample.s2.web.interceptor.mgr.AuthorityInterceptor">
<param name="excludeMethods">loginForm,loginCheck</param>
</interceptor> <!-- 声明“后台管理默认拦截器栈” -->
<interceptor-stack name="mgrDefaultStack">
<interceptor-ref name="authority" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors> AuthorityInterceptor.java @SuppressWarnings("serial")
public class AuthorityInterceptor extends MethodFilterInterceptor { @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = invocation.getInvocationContext();
if(ctx.getSession().get("currAdmin") == null) {
ctx.put("tip", "请先登录,再进行其他操作!");
return "login";
} else {
return invocation.invoke();
}
} }
<action name="getRandom" class="sample.s2.web.action.mgr.DemoAjaxAction" method="getRandom">
<result type="stream">
<param name="inputName">bais</param>
<param name="contentType">text/html;charset=UTF-8</param>
</result>
</action>
action name="getAllAdmins" class="sample.s2.web.action.mgr.DemoAjaxAction" method="getAllAdmins">
<result type="json">
<param name="root">admins</param>
<param name="contentType">application/json;charset=UTF-8</param>
</result>
</action> private String type;
private InputStream bais;
private List<Admin> admins; public String getRandom() throws Exception { int offset = type.equals("small") ? 0 : 5; String r = (int)(Math.random() * 5) + offset + ""; // "9" bais = new ByteArrayInputStream(r.getBytes("utf-8")); return SUCCESS;
} public String getAllAdmins() {
admins = adminService.getAdmins();
return SUCCESS;
} $(function(){ $.get("/SampleStruts2/mgr/getRandom", {"type" : "small"}, function(data){
$("#num").text(data);
}); $.getJSON("/SampleStruts2/mgr/getAllAdmins", function(data){
alert(data.length);
}); }); 3、Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。
简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
src下面 applicationContext.xml
<bean id="inkPrinter" class="demo.spring4.bean.InkPrinter" /> <bean id="lesserPrinter" class="demo.spring4.bean.LesserPrinter" /> <bean id="computer" class="demo.spring4.bean.Computer">
<property name="printer" ref="lesserPrinter" />
</bean> <bean id="zwj" class="demo.spring4.bean.Student" scope="prototype">
<property name="name" value="张无忌" />
<property name="age" value="23" />
<property name="birthdate">
<bean class="java.util.Date" />
</property>
<property name="lover" ref="zm" />
<property name="loveBooks">
<list>
<value>西游记</value>
<value>水浒传</value>
<value>三国演义</value>
<value>红楼梦</value>
</list>
</property>
<property name="scores">
<map>
<entry key="HTML" value="95" />
<entry key="JSP" value="87" />
<entry key="JavaBasic" value="91" />
</map>
</property>
<property name="healthPoster">
<props>
<prop key="height">1.81</prop>
<prop key="weight">82</prop>
</props>
</property>
</bean> <bean id="zm" class="demo.spring4.bean.Student">
<constructor-arg index="0" value="赵敏" />
<constructor-arg index="1" value="22" />
<property name="birthdate" ref="now" /><!-- ref属性代表引用了容器中的其他Bean的ID -->
</bean> <bean id="now" class="java.util.Date" /> src test.properties
# a common properties file
name=\u5F20\u4E09
age=23
sex=male
height=1.79 public void testProperties() {
/*
Properties props = System.getProperties();
for(Object key : props.keySet()) {
System.out.println(key + " = " + props.get(key));
}
*/ Properties props = new Properties();
try {
props.load(new InputStreamReader(Spring4Test.class.getResourceAsStream("/test.properties"), "UTF-8"));
System.out.println(props);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
System.out.println("-- ApplicationContext 已经创建完成 -----------------------------\n"); context.getBean("zwj");
context.getBean("zwj");
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
System.out.println("-- ApplicationContext 已经创建完成 -----------------------------\n"); context.getBean("zwj");
context.getBean("zwj"); 4、Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,
从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
WEB-INF下面
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app> src下面 springmvc-servlet.xml
<context:component-scan base-package="demo.springmvc.web.controller" /> <mvc:annotation-driven /> <!-- 防止无法正确访问静态资源 -->
<mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean> controller页面
@Controller
@RequestMapping("/mvc")
public class mvcController { //类上面
  @Controller 负责注册一个bean 到spring 上下文中   @RequestMapping 注解为控制器指定可以处理哪些 URL 请求
Date类型转
//the parameter was converted in initBinder
@RequestMapping("/date")
public String date(Date date){
System.out.println(date);
return "hello";
} //At the time of initialization,convert the type "String" to type "date"
@InitBinder
public void initBinder(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),
true));
} //pass the parameters to front-end
@RequestMapping("/show")
public String showPerson(Map<String,Object> map){
Person p =new Person();
map.put("p", p);
p.setAge(20);
p.setName("jayjay");
return "show";
}
  前台可在Request域中取到"p" //pass the parameters to front-end using ajax
@RequestMapping("/getPerson")
public void getPerson(String name,PrintWriter pw){
pw.write("hello,"+name);
}
@RequestMapping("/name")
public String sayHello(){
return "name";
}
  前台用下面的Jquery代码调用 $(function(){
$("#btn").click(function(){
$.post("mvc/getPerson",{name:$("#name").val()},function(data){
alert(data);
});
});
}); //redirect
@RequestMapping("/redirect")
public String redirect(){
return "redirect:hello";
}

Java五大框架的更多相关文章

  1. Java面试之五大框架的理解

    五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...

  2. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

  3. 推荐Java五大微服务器及其代码示例教程

    来源素文宅博客:http://blog.yoodb.com/yoodb/article/detail/1339 微服务越来越多地用于开发领域,因为开发人员致力于创建更大,更复杂的应用程序,这些应用程序 ...

  4. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  5. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  6. Java三大框架 介绍

    三大框架:Struts+hibernate+spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...

  7. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  8. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  9. Java集合框架之map

    Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...

随机推荐

  1. git diff 与 git diff --cached的不用

    git diff比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容.若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命 ...

  2. react 脚手架--create-react-app

    1.yarn add -g create-react-app 2.create-react-app demo cd demo yarn start 可以跑起来整个项目了 一般都会用到路由,需要 yar ...

  3. node-express根据请求,判断PC和移动端

    function getMachine(req) { var deviceAgent = req.headers["user-agent"].toLowerCase(); var ...

  4. Nodejs基础(5-6)HTTP概念进阶

    1.什么是回调? 是异步编程最基本的方法,对于nodejs来说需要按顺序执行异步逻辑的时候一般采用后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数逐层去嵌套.通过这种方式来让程序按照 ...

  5. GoWeb-Gin 文件上载

    前些日子,我们Node.JS了一把. 如今,我们还是回到我们伟大的GO来吧 今天,带领大家继续Golang的啦,而且是个上传文件的例子 先给大家看结果 1. 如果是windows端,你需要安装post ...

  6. iOS UI布局-回到顶部

    回到顶部,是比较常用的一个效果 核心代码 在ViewDidLoad中,添加回到顶部按钮 计算偏移量,如果当前显示的内容全部向上隐藏掉,则显示“回到顶部”按钮 // // ViewController. ...

  7. cocos2d JS-(JavaScript) 类型检测与判断

    //检测类型 var str = "Hello World"; if (typeof str=="string") {//使用typeof来判断对象类型的一个例 ...

  8. 有关于异常捕获点滴,plus我也揭揭java的短

    ▄︻┻┳═一『异常捕获系列』Agenda: ▄︻┻┳═一有关于异常捕获点滴,plus我也揭揭java的短 ▄︻┻┳═一根据异常自定义处理逻辑([附]java异常处理规范) ▄︻┻┳═一利用自定义异常来 ...

  9. 线程间操作无效: 从不是创建控件“button1”的线程访问它。

    .net2后是不能跨线程访问控件的.,窗体上的控件是当前线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会 ...

  10. HTTP参数污染【转】

    HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致. 例如: www.XX.com/a?key=ab&key=3 如果服务端返回输入key的值,可能会有 一: ab 二:3 三 ...