JavaWeb-20-SpringMVC的表单标签以及引入静态资源
目录
2:用了表单标签的页面可能会报这个错误;请求域中没有一个command类型的对象;来到页面之前一定要给请求域中放这个对象;
2:原因是因为springmvc在web.xml中设置了拦截除jsp外所有的请求
通过 SpringMVC的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显
1:页面操作
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
//必须指定导入form
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
1.为什么使用SpringMVC的form标签
① 快速开发
② 表单回显
2.可以通过modelAttribute指定绑定的模型属性,
若没有指定该属性,则默认从request域中查找command的表单的bean
如果该属性也不存在,那么,则会发生错误。
3: path:表单字段,对应 html 元素的 name 属性,支持级联属性
htmlEscape:是否对表单值的 HTML 特殊字符进行转换,默认值为 true
cssClass:表单组件对应的 CSS 样式类名
cssErrorClass:表单组件的数据存在错误时,采取的 CSS 样式
4: form:radiobuttons:单选框组标签,用于构造多个单选框
items:可以是一个 List、String[] 或 Map
itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个属性值
itemLabel:指定 radio 的 label 值
delimiter:多个单选框可以通过 delimiter 指定分隔符
-->
<form:form action="empAdd" method="POST" modelAttribute="employee">
LastName : <form:input path="lastName"/><br><br>
Email : <form:input path="email"/><br><br>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("1", "Male");
map.put("0","Female");
request.setAttribute("genders", map);
%>
Gender : <br><form:radiobuttons path="gender" items="${genders }" delimiter="<br>"/><br><br>
DeptName :
<form:select path="department.id"
items="${deptList }"
itemLabel="departmentName"
itemValue="id"></form:select><br><br>
<input type="submit" value="Submit"><br><br>
</form:form>
</body>
</html>
2:用了表单标签的页面可能会报这个错误;请求域中没有一个command类型的对象;来到页面之前一定要给请求域中放这个对象;
3:后端操作
@RequestMapping(value="/empInput",method=RequestMethod.GET)
public String empInput(Map<String,Object> map){
map.put("deptList", departmentDao.getDepartments());
//解决错误:java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute
Employee employee = new Employee();
//map.put("command", employee);
// 可以通过 modelAttribute 属性指定绑定的模型属性,若没有指定该属性,则默认从 request 域对象中读取 command 的表单 bean,如果该属性值也不存在,则会发生错误。
map.put("employee", employee);
return "add";
}
4:springmvc引入静态资源
1:当在页面使用静态资源时回报异常
2:原因是因为springmvc在web.xml中设置了拦截除jsp外所有的请求
3:解决办法:配置<mvc:default-servlet-handler/>
- 在dispatcher-servlet.xml中配置<mvc:default-servlet-handler/>告诉springmvc自己能映射的自己管理;不能映射的交给tomcat
- 但是当设置了<mvc:default-servlet-handler/>后其他的动态请求又不好使了,那么在此设置开启springmvc管理动态资源<mvc:annotation-driven />
4:关于<mvc:default-servlet-handler/>作用
<mvc:default-servlet-handler/> 将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,
它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,
就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
一般 WEB 应用服务器默认的 Servlet 的名称都是 default。
若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定
参考:CATALINA_HOME/config/web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
该标签属性default-servlet-name默认值是"default",可以省略。
<mvc:default-servlet-handler/>
-->
<mvc:default-servlet-handler default-servlet-name="default"/>