发表于: 2018-03-25 22:31:12
1 503
今天完成的事情:
使用springMVC实现简单的表单提交
项目结构:
在web.xml文件中配置springmvc-context.xml的路径
<web-app>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置springmvc-context.xml文件,这一部分主要是开启注解功能、配置试图解析器
<mvc:annotation-driven />
<!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<context:component-scan base-package="com.ycc" />
<!-- 这两个类用来启动基于Spring MVC的注解功能,将控制器与方法映射加入到容器中 -->
<!--<beans:bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />-->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />-->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 这个类用于Spring MVC视图解析 -->
<beans:bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/pages/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
其中
<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的,即解决了@Controller注解使用的前提配置。
被注释掉的两个类是教程上用的,然后看到是被弃用的,因为RequestMappingHandlerMapping和RequestMappingHandlerAdapter这两个新的类代替了它们。
其中
1,RequestMappingHandlerMapping是HandlerMapping的实现类,它会处理@RequestMapping 注解,并将其注册到请求映射表中。
2,RequestMappingHandlerAdapter是HandlerAdapter的实现类,它是处理请求的适配器,就是确定调用哪个类的哪个方法,并且构造方法参数,返回值。
<mvc:annotation-driven>与<context:component-scan/>的区别
<context:component-scan/>标签是告诉Spring 来扫描指定包下的类,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件。
而<mvc:annotation-scan/>是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean(还有一个 ExceptionHandlerExceptionResolver)到工厂中,来处理我们的请求。
接下来是两个jsp界面:
create.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!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>Add User From</title>
</head>
<body>
<form action="/save" method="post">
<fieldset>
<legend>创建用户</legend>
<p>
<label>姓名:</label> <input type="text" id="name" name="name" tabindex="1">
</p>
<p>
<label>年龄:</label> <input type="text" id="age" name="age" tabindex="2">
</p>
<p>
<label>密码:</label> <input type="text" id="pwd" name="pwd" tabindex="3">
</p>
<p id="buttons">
<input id="reset" type="reset" tabindex="4" value="取消"> <input
id="submit" type="submit" tabindex="5" value="创建">
</p>
</fieldset>
</form>
</body>
</html>
detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!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>
<div id="gloobal" >
<h4>创建成功</h4>
<p>
<h5>详情:</h5>
姓名:${user.name}<br /> 年龄:${user.age}<br /> 密码:${user.pwd}<br />
</p>
</div>
</body>
</html>
UserController.java
@Controller
public class UserController
@RequestMapping("")
public String Create(Model model) {
return "create";
}
@RequestMapping("/save")
public String Save(@ModelAttribute("form") User user, Model model) {
// user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象
model.addAttribute("user", user);
return "detail";
}
}
其中
@Controller注解表明了一个类是作为控制器的角色而存在的。
分派器(DispatcherServlet)会扫描所有注解了@Controller的类,检测其中通@RequestMapping注解配置的方法。
需要在配置中加入组件扫描的配置代码来开启框架对注解控制器的自动检测。
<context:component-scan base-package=""/>
@RequestMapping注解来将请求URL,如/appointments等,映射到整个类上或某个特定的处理器方法上。一般来说,类级别的注解负责将一个特定(或符合某种模式)的请求路径映射到一个控制器上,同时通过方法级别的注解来细化映射,即根据特定的HTTP请求方法(“GET”“POST”方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。
类级别的@RequestMapping注解并不是必须的。不配置的话则所有的路径都是绝对路径,而非相对路径。
*类级别:
@Controller
@RequestMapping("/appointments")
public class AppointmentsController
它指示了所有/appointments开头的路径都会被映射到控制器下。
*方法级别:
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {}
get()方法上的@RequestMapping注解对请求路径进行了进一步细化:它仅接受GET方法的请求。这样,一个请求路径为/appointments、HTTP方法为GET的请求,将会最终进入到这个方法被处理。
@RequestMapping(path = "/new", method = RequestMethod.GET)
public AppointmentForm getNewForm() {}
getNewForm()方法则同时注解了能够接受的请求的HTTP方法和路径。这种情况下,一个路径为appointments/new、HTTP方法为GET的请求将会被这个方法所处理。
@RequestMapping(path = "/{day}", method = RequestMethod.GET)
public Map<String, Appointment> getForDay(@PathVariable@DateTimeFormat(iso=ISO.DATE) Date day, Model model) {}
getForDay()方法使用@RequestMapping注解的另一个用法:URI模板
URI模板"/owners/{ownerId}"指定了一个变量,名为ownerId。当控制器处理这个请求的时候,ownerId的值就会被URI模板中对应部分的值所填充。
注解@ModelAttribute是一个常用的注解,其功能主要在两方面:
1,运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
2,运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
因此下面这段代码的意思就是,从表单传过来的参数就注入到User中
(@ModelAttribute("form") User user, Model model)
还有其中的Model model,看到网上的说法是为了将user给传递到jsp页面去,相当于user+model=ModelAndView,相当于模型驱动。
User.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String pwd;
private Integer age;
private Date creatTime;
这里的Serializable是序列化的意思:
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
序列化分为两大部分:序列化和反序列化。
1,序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。
2,反序列化就是打开字节流并重构对象。
对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。
最后的运行结果就是
输入数据后创建
可以看到没有返回值在页面上,
解决办法:
返回
数字的值返回了 ,但是中文返回的是乱码,但是明明都设置了utf-8编码?
明天计划的事情:
继续学习springMVC
遇到的问题:
如上
收获:
学习了springMVC中的注解,但是还是不知道jsp页面中的各个代码的意思,明天学习学习
进度:任务二步骤2
任务开始时间:3.23
预计demo时间:3.28
是否延期:否
禅道地址:http://task.ptteng.com/zentao/project-task-562.html
评论