1. springmvc包的正确导入方式( 不用maven )
添加Spring的jar包时,我一开始是用User Library导入,tomcat 启动时报 ClassNotFound 的错误,是 DispatchServlet 这个 类没有找到,但事实上它就在我刚通过User Library导入的那些包里。StackOverflow上的大神指出要放在 WEB- INF的lib目录下,照做后发现 lib 下的jar包会自动被收录在 Web App Libraries 这个目录下。然后运行ok。
2. 对springmvc标签库 <form:form>
,<form:input path="">
的属性自动注入 的初步理解
@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
<form:form method="post" action="/SpringMVCTest/doSpringForm" commandName="studentBean">
姓名:<form:input path="name" /><br/>
年龄:<form:input path="age" /><br/>
<button type="submit" value="提交">提交</button>`
</form:form>
commandName指定一个叫"studentBean"的东西, 这个东西从哪儿获取呢, 从model里获取. 猜测viewResolver在解析视图时会将model中的数据解析到视图中. 而这个model是spring隐式地传递给viewResolver的, 只要在model 用addAttribute方法把commandName指定的object放进去即可. <form:input path="name">
path指定读取 commName所指定的object的属性, 也就是读取 studentBean 的属性, 也就是绑定到了studentBean的name属性上.
form的这个代码是模仿易百教程上的, 它有个submit按钮, 但是我觉得它只是方便的用 <form:input path="name">
来绑定model中的数据来展示. 对于提交表单并没特别之处. 只不过 <form:input path="name">
这样写会被解析成<input name="name">
罢了.
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里的东西如图.
并且执行后输出结果为: true true true
@ModelAttribute("NameDefinedByYourself") 注解的方法既会预先执行, 又能将方法的返回值加入到model中去.
5. 使用Hibernate时,报错 createQuery is not valid without active transaction;
报错时,我的 hibernate 的 session 用的是单利模式,即<prop key="hibernate.current_session_context_class">thread</prop>
弃用后采用 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结尾来作为 handler
的 requestmapping
, 现在想想可能 .do 就是用来说明 url
将被一个handle
r处理
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"
<property name="password" column="password" insert="false"/>
网友评论