学习Spring+SpringMVC+Hibernate

1. springmvc包的正确导入方式( 不用maven )

添加Spring的jar包时,我一开始是用User Library导入,tomcat 启动时报 ClassNotFound 的错误,是 DispatchServlet 这个 类没有找到,但事实上它就在我刚通过User Library导入的那些包里。StackOverflow上的大神指出要放在 WEB- INF的lib目录下,照做后发现 lib 下的jar包会自动被收录在 Web App Libraries 这个目录下。然后运行ok。

2. 对springmvc标签库 , 的属性自动注入 的初步理解

@Controller
public class FormController {
    
    @RequestMapping("/SpringForm")
    String doSpringForm(Model model) {
        StudentBean s = new StudentBean();
        s.setAge(789);
        s.setName("haha");
        model.addAttribute("studentBean",s);
        return "springForm";
        
    }

上面的Controller将返回下面这个 jsp


        姓名:
年龄:
`

commandName指定一个叫"studentBean"的东西, 这个东西从哪儿获取呢, 从model里获取. 猜测viewResolver在解析视图时会将model中的数据解析到视图中. 而这个model是spring隐式地传递给viewResolver的, 只要在model 用addAttribute方法把commandName指定的object放进去即可. path指定读取 commName所指定的object的属性, 也就是读取 studentBean 的属性, 也就是绑定到了studentBean的name属性上.
form的这个代码是模仿易百教程上的, 它有个submit按钮, 但是我觉得它只是方便的用 来绑定model中的数据来展示. 对于提交表单并没特别之处. 只不过 这样写会被解析成 罢了.

3. 对model的属性自动添加的初步理解

当上述的表单提交后, 由下面的控制器处理

@RequestMapping("/doSpringForm")
    String displaySpringForm(Model model,StudentBean s) {
    
        System.out.println(model.containsAttribute("studentBean"));
        
        return "redisplaySpringForm";
        
    }

输出结果为 true, 首先知道Spring会自动地将 request 请求中的参数装配给了传入的参数StudentBean s, 这是一种自动绑定.而且model中会被add进一个 <"studentBean",s>这样一个键值对.
如果想要自定义键值对中的key, 可以在加上@ModelAttribute("keyDefinedByYourself")

@RequestMapping("/doSpringForm")
    String displaySpringForm(Model model,@ModelAttribute("sB1")StudentBean s) {
    
        System.out.println(model.containsAttribute("studentBean"));
        System.out.println(model.containsAttribute("sB1"));
        
        return "redisplaySpringForm";
        
    }

输出结果为: false true

4. 对于@ModelAttribute 的初步理解

上面有说到 @ModelAttribute 可以将指定的object 以自定义的name加入到model中
这里要说的, 它所注解的方法(Controller中的方法)会被预先执行.

@Controller
public class FormController {
    
    @ModelAttribute("x")//按定义的顺序预先执行
    String init1() {
        return "xxx";
    }
    
    @ModelAttribute("y")//按定义的顺序预先执行
    String init2() {
        return "yyy";
    }
    
    @RequestMapping("/SpringForm")
    String doSpringForm(Model model) {
        model.addAttribute("sB",new StudentBean());
        return "springForm";
        
    }
    
    @RequestMapping("/doSpringForm")
    String displaySpringForm(Model model,@ModelAttribute("sB1")StudentBean s) {
    
        System.out.println(model.containsAttribute("x"));//断点给到这里
        System.out.println(model.containsAttribute("y"));
        System.out.println(model.containsAttribute("sB1"));
        
        return "redisplaySpringForm";
        
    }
}

当请求/doSpringForm时, model里的东西如图.

model内部的东西

并且执行后输出结果为: true true true
@ModelAttribute("NameDefinedByYourself") 注解的方法既会预先执行, 又能将方法的返回值加入到model中去.

5. 使用Hibernate时,报错 createQuery is not valid without active transaction;

报错时,我的 hibernate 的 session 用的是单利模式,即thread 弃用后采用 opensesion() 来获取session 就解决问题了。至于为什么这样子,我还没有深究。

6. HQL 中 from 后加的是类名不是表名

Query query = session.createQuery("from TOPICCOMMMENT where topicId=:topicId").setParameter("topicId",topicId);

报错

nested exception is
org.hibernate.hql.internal.ast.QuerySyntaxException: TOPICCOMMENT is
not mapped [from TOPICCOMMENT where topicId=:topicId]] with root cause
org.hibernate.hql.internal.ast.QuerySyntaxException: TOPICCOMMENT is
not mapped [from TOPICCOMMENT where topicId=:topicId]

7. 貌似EL表达式不能像java变量传值, js变量倒是可以, 为什么呢?

8. Restful 风格的url传参的小数点问题

http://localhost:8080/zhihuDemo/confirmRegister/2234122450@qq.com

用PathVariable接受参数时会将小数点后面的忽略掉. 也是说只能接收到2234122450@qq. 之前有见到有的url 以 .do结尾来作为 handlerrequestmapping , 现在想想可能 .do 就是用来说明 url 将被一个handler处理

9. 向Controller提交ajax请求时不要使用 get 方式,而是使用post。使用get方式会报如下错误

Chrome 控制台报 400
Tomcat 控制台

java.lang.IllegalArgumentException: Invalid character found in the
request target. The valid characters are defined in RFC 7230 and RFC
3986

10. hibernate不能加入一个没有主键的类, 否则报错如下

org.hibernate.InvalidMappingException: Unable to read XM

emmmn,之前有注意到在mysql里创建一张没有主键的表, 也没有报错, 觉得好奇怪. 到这里就出问题了.

11. 关于Hibernate的 Batch update returned unexpected row count from update异常

ERROR [http-8080-Processor22] (BatchingBatcher.java:60) - Exception
executing batch: org.hibernate.StaleStateException: Batch update
returned unexpected row count from update: 0 actual row count: 0
expected: 1

使用的是hibernate的saveOrUpdate/update方法保存实例。saveOrUpdate/update方法要求ID为null时才执行SAVE,在其它情况下执行UPDATE。在保存实例的时候是新增,但你的ID不为null,所以使用的是UPDATE,但是数据库里没有主键相关的值,所以出现异常。

13. 当mysql某字段设置默认值时, 而Hibernate默认会对所有的字段赋值, 即使该字段为null, 此时调用save()会用null来覆盖在mysql中设置的默认值.

解决方式:
hbm.xml文件中加入insert="false"


你可能感兴趣的:(学习Spring+SpringMVC+Hibernate)