7月5日
今天主要在慕课网上实现SSH框架的demo,SSH的配置主要使用四个文件,首先需要配置
**web.xml:**
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 对Spring容器进行实例化 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
ApplicationContext.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
<bean id="productService" class="cn.ssh.service.ProductService">
<property name="productDAO" ref="productDAO" />
</bean>
<bean id="productDAO" class="cn.ssh.dao.ProductDAO">
</bean>
</beans>
今天主要遇到了“java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;”错误,经过检查是jar包出现了问题,采用myeclipse标准包即可避免。
7月6号
applicationContext.xml文件里面,缺少context标签,
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
加入这一句:context=”http://www.springframework.org/schema/context”。
7月7日
1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from input stream
最终发现是Employee.hbm.xml的id name写错了,这个name应该和定义的实体类属性一致。
2
无法找到struts标签。主要是里面的文件名写错了。jsp标准配置如下:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %>
7月9日
- Hibernate错误:
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibe
解决方法:最好Spring3+Hibernate4不太好用,替换成Spring3+Hibernate3就解决了。 - s:表单标签
<s:form action="teacher_login" method="post" namespace="/">
<h3><s:actionerror/></h3>
<button class="btn btn-lg btn-block" id="entry" type="submit" >立即登录</button>
</s:form>
利用ModelDriven获取用户名密码,并且填入actionerror。
if(existTeacher==null){
this.addActionError("用户名或者密码错误");
return INPUT;
}else{
ActionContext.getContext().getSession().put("existTeacher", existTeacher);
return SUCCESS;
}
- 利用Hibernate模板获取实体
public class TeacherDaoImpl extends HibernateDaoSupport implements TeacherDao {
@Override
public Teacher findByUsernameAndPassword(Teacher teacher) {
String hql="from Teacher where username=:username and password =:password";
List<Teacher> list=this.getHibernateTemplate().findByValueBean(hql, teacher);
if(list.size()>0){
return list.get(0);
}
return null;
}
}
7月14日
报错:No Dialect mapping for JDBC type: 3
mysqlDialect.java
package tool;
import java.sql.Types;
import org.hibernate.Hibernate;
public class MySQLDialect extends org.hibernate.dialect.MySQLDialect{
public MySQLDialect(){
super();
registerHibernateType(Types.DECIMAL,Hibernate.BIG_DECIMAL.getName());
}
}
ApplicationContext.xml
<!-- 配置Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">tool.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
7月15日
利用AJAX使用JSON数据传递给ECharts,SSH框架
注意检查json的jar包是否齐全。要想实现JSON和java对象之间的互转,需要借助第三方jar包,这里使用json-lib这个jar包,json-lib需要commons-beanutils-1.8.0.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar五个包的支持,可以自行从网上下载,这里不再贴出下载地址。
public static void listToJSON(){
Student stu=new Student();
stu.setName("JSON");
stu.setAge("23");
stu.setAddress("北京市海淀区");
List<Student> lists=new ArrayList<Student>();
lists.add(stu);
//1、使用JSONObject
//JSONObject listObject=JSONObject.fromObject(lists);
//2、使用JSONArray
JSONArray listArray=JSONArray.fromObject(lists);
//System.out.println("listObject:"+listObject.toString());
System.out.println("listArray:"+listArray.toString());
}
EChartsAction.java
private JSONArray jsonObj;
private String result;
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public JSONArray getJsonObj() {
return jsonObj;
}
public void setJsonObj(JSONArray jsonObj) {
this.jsonObj = jsonObj;
}
public String barTable(){
HttpServletResponse response = ServletActionContext.getResponse();
Test t=new Test(1);
List<Test> list=new ArrayList<Test>();
list.add(t);
list.add(t);
list.add(t);
list.add(t);
list.add(t);
jsonObj=JSONArray.fromObject(list);
try {
response.setHeader("Cache-Control", "no-cache");
response.setContentType("aplication/json;charset=UTF-8");
response.getWriter().print(jsonObj);
} catch (IOException e) {
e.printStackTrace();
}
//利用ajax传输柱状图数据
var json1=[];
$.ajax({
url : "barDisplay.action",
type : 'GET',
dataType :'json',
async : false,
success : function(jsonObj) {
for(var i=0;i<jsonObj.length;i++){
json1.push(jsonObj[i].mark);
}
},error:function(xhr){}
});
<package name="default" extends="json-default" >
<action name="barDisplay" class="com.jxfz.action.EchartsAction" method="barTable">
<result type="json">
<param name="root">jsonObj</param>
</result>
</action>
</package>
注意:如果想使用JSONArray.fromObject(list)方法,list的对象必须有get set方法。
7月16日
1 echart字符云
使用echarts的字符云图,不能只引入echarts.min.js,需要额外引入wolrdcloud.js。
2 使用Hibernate原生语句
@Override
public List<Object[]> getChartA() {
Transaction tx=null;
String sql="SELECT COUNT(id) as mark,FLOOR(defen/10) AS part FROM datifenshuview GROUP BY FLOOR(defen/10)";
List<Object[]> tableResult;
try{
tx=getSession().beginTransaction();
SQLQuery query = getSession().createSQLQuery(sql);
tableResult=query.list();
getSession().close();
}catch(Exception e){
e.printStackTrace();
tx.commit();
return null;
}
return tableResult;
}
这种情况下,查询出来的数据是 List
3 问题:原网址重复请求,数据库链接就会超载
trace com.mchange.v2.resourcepool.BasicResourcePool@ab15e2 [managed: 15, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@4c5d20)
解决方案:
<!-- 配置Hibernate的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">tool.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.release_mode">after_statement</prop>
</props>
</property>
4
问题:
org.hibernate.MappingException : No Dialect mapping for JDBC type: 3
解决方法:
在applicationContext.xml:
<property name="hibernateProperties">
<props>
***<prop key="hibernate.dialect">tool.MySQLDialect</prop>***
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.release_mode">after_statement</prop>
</props>
新建类:
package tool;
import java.sql.Types;
import org.hibernate.Hibernate;
public class MySQLDialect extends org.hibernate.dialect.MySQLDialect{
public MySQLDialect(){
super();
registerHibernateType(Types.DECIMAL,Hibernate.BIG_DECIMAL.getName());
}
}
7月23日
Q:IDEA创建SpringBoot无法连接https://start.spring.io
A:使用自定义网址,把那个网址的https后面的s去掉,使用http开头就可以访问和使用了。
7月24日
Spring boot使用ajax
后台controller类:
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String index(ModelMap modelMap){
modelMap.put("msg","SpringBoot Ajax 实例");
return "index2";
}
@RequestMapping(value = "/home",method = RequestMethod.GET)
public String home(){
return "login";
}
@RequestMapping(value = "/data",method = RequestMethod.POST)
@ResponseBody
public List<User> data(){
List<User> list=new ArrayList<User>();
for (int i=0;i<10;i++){
User user=new User();
user.setId(i + 1);
user.setName("springboot" + i);
user.setSex("male");
user.setAge(i + 1);
user.setRole("developer");
list.add(user);
}
return list;
}
前台JS
/**
* Created by Intellij IDEA.
* @Author LUOLIANG
* @Date 2016/8/2
* @Comment js文件,用于页面发送ajax请求
*/
//定义一个avalonjs的控制器
var viewmodel = avalon.define({
//id必须和页面上定义的ms-controller名字相同,否则无法控制页面
$id: "viewmodel",
datalist: {},
text: "请求数据",
request: function () {
$.ajax({
type: "post",
url: "/hello/data", //向springboot请求数据的url
data: {},
success: function (data) {
$('button').removeClass("btn-primary").addClass("btn-success").attr('disabled', true);
viewmodel.datalist = data;
viewmodel.text = "数据请求成功,已渲染";
}
});
}
});
Spring boot使用html
在默认配置下,thymeleaf对.html的内容要求很严格,比如,如果少最后的标签封闭符号/,就会报错而转到错误页。也比如你在使用Vue.js这样的库,然后有这样的html代码,也会被thymeleaf认为不符合要求而抛出错误。
因此,建议增加下面这段:
spring.thymeleaf.mode = LEGACYHTML5spring.thymeleaf.mode的默认值是HTML5,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求。
maven依赖如下:
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.21</version>
</dependency>
7月27日
Spring boot扫描不到bean
Spring boot开发是从神奇到正常的过程。启动类需要放在package文件夹中,启动后Spring boot会扫描当前目录下所有包。所以不要将启动类放在子包中。
Spring错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bi
public User getUser(@Param("name") String name,@Param("password") String password);
默认配置下,thymeleaf对.html的内容要求很严格,比如,如果少最后的标签封闭符号/,就会报错而转到错误页。也比如你在使用Vue.js这样的库,然后有
这样的html代码,也会被thymeleaf认为不符合要求而抛出错误。通过设置thymeleaf模板可以解决这个问题,下面是具体的配置:
spring.thymeleaf.mode =LEGACYHTML5
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>