一、开发步骤
1、新建maven工程
a、添加web.xml
b、添加Tomcat运行环境
c、添加依赖jar包:spring-webmvc
d、添加配置文件:spring-mvc.xml
e、在web.xml文件中配置前端控制器
f、在spring-mvc.xml中配置视图解析器
<!-- 组件扫描 -->
<context:component-scanbase-package="cn.xxxx.controller"/>
<!-- 配置视图解析器 -->
<beanid="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix"value="/WEB-INF/web/"/>
<propertyname="suffix"value=".jsp"/>
</bean>
<!--
1、基于注解的映射器默认是:DefaultAnnotationHandlerMapping,此映射处理器是2.5版本的
2、3.2版本定义一个新的映射处理器:RequestMappingHandlerMapping
3、如果要改变默认的映射处理器,使用下面的配置
4、此配置默认初始化一些工具类:比如异常处理,解析json
-->
<mvc:annotation-driven/>
2、定义xxx.jsp页面
3、定义控制器类XxxController
二、从客户端向控制器传递数据(页面→控制器)
1、方式一:request对象(不建议使用)
特点:简单,不能实现类型转换。 |
(1)login.jsp页面
<formaction="${pageContext.request.contextPath}/user/loginHandler.do"method="post">
姓名:<inputtype="text"name="name"/><br>
密码:<inputtype="password"name="pwd"/><br>
<inputtype="submit"value="登录"/>
</form>
(2)控制器类UserController
Package cn.xxxx.controller;
import ......
@Controller
@RequestMapping("/user")
Public class UserController {
/**
* 处理登录的提交按钮的请求
* 1、使用request变量获取数据
* 2、在方法的参数列表中定义request对象
* @return
*/
@RequestMapping("/loginHandler.do")
public String loginHandler(HttpServletRequest request) {
System.out.println(request.getParameter("name"));
System.out.println(request.getParameter("pwd"));
return"ok";
}
}
2、方式二:使用属性传值(1)
特点:参数列表的名称和表单的name属性值相同; 可以实现自动类型转换,但是可能会有异常; 表单数据量小。 |
(1)定义demo.jsp页面和ok.jsp页面
<form action="${pageContext.request.contextPath}/demo/test2.do" method="get">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
<bodystyle="font-size:30px;">
ok!<br>
${name},${age}<br>
</body>
(2)定义控制器类DemoController
Package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
Public class DemoController {
//显示demo.jsp页面
@RequestMapping("/showDemo.do")
publicString showDemo() {
return"demo";
}
@RequestMapping("/test2.do")
publicString test2(String name,Integer age) {
System.out.println(name+","+age);
return"ok";
}
}
3、方式二:使用属性传值(2)(表单name属性值和参数列表变量名不相同)
特点:使用@RequestParam注解辅助完成变量的赋值。 |
@RequestParam("name"):name表示表单name的属性值 如果@RequestParam("name")中的name在页面上不存在,会有400异常 |
(1)定义demo.jsp页面和ok.jsp页面
<formaction="${pageContext.request.contextPath}/demo/test3.do"method="get">
姓名:<inputtype="text"name="name"><br>
年龄:<inputtype="text"name="age"><br>
<inputtype="submit"value="提交">
</form>
<bodystyle="font-size:30px;">
ok!<br>
${name},${age}<br>
</body>
(2)定义控制器类DemoController
package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/showDemo.do")
public String showDemo() {
return "demo";
}
@RequestMapping("/test3.do")
public String test3(@RequestParam("name") String username,Integer age){
System.out.println(username+","+age);
return "ok";
}
}
4、方式三:使用Bean对象传值(适合数据量大)
特点:把表单name属性值封装成类类型: 成员变量名称必须与表单的name属性值相同; 适合数据量大的参数传值。 |
(1)定义demo.jsp页面和ok.jsp页面
<formaction="${pageContext.request.contextPath}/demo/test4.do"method="get">
姓名:<inputtype="text"name="name"><br>
年龄:<inputtype="text"name="age"><br>
<inputtype="submit"value="提交">
</form>
<bodystyle="font-size:30px;">
ok!<br>
${name},${age}<br>
</body>
(2)定义控制器类DemoController
package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/showDemo.do")
public String showDemo() {
return "demo";
}
@RequestMapping("/test4.do")
public String test4(User user) {
System.out.println(user.toString());
return "ok";
}
}
三、从控制器向客户端传递数据(控制器→页面)
request、session(cookie)、application
1、方式一:request、session传递数据到页面
(1)定义demo.jsp页面和ok.jsp页面
<form action="${pageContext.request.contextPath}/demo/test5.do" method="get">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
<body style="font-size:30px;">
ok!<br>
${name},${age}<br>
</body>
(2)定义控制器类DemoController
package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/showDemo.do")
public String showDemo() {
return "demo";
}
@RequestMapping("/test5.do")
public String test5(HttpServletRequest request,HttpSession session) {
request.setAttribute("name","admin");
session.setAttribute("age","18");
return "ok";
}
}
2、方式二:ModelAndView传递数据(Model→ModelMap→Map)
特点:框架把Map属性获取到,设置到request对象中。 |
(1)定义demo.jsp页面和ok.jsp页面
<form action="${pageContext.request.contextPath}/demo/test5.do" method="get">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
<body style=" font-size:30px;">
ok!<br>
${requestScope.address}<br>
</body>
(2)定义控制器类DemoController
package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/showDemo.do")
public String showDemo() {
return "demo";
}
@RequestMapping("/test6.do")
public ModelAndView test6() {
Map<String,Object> map= new HashMap<>();
map.put("address","xx省xx市");
return new ModelAndView("ok",map);
}
}
(3)方式三:ModelMap传递数据(推荐)
特点:使用ModelMap传递数据到页面: map由框架设置到request变量中。 |
(1)定义demo.jsp页面和ok.jsp页面
<form action="${pageContext.request.contextPath}/demo/test7.do" method="get">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
<body style="font-size:30px;">
ok!<br>
${requestScope.phone}
</body>
(2)定义控制器类DemoController
package cn.xxxx.controller;
import.....
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/showDemo.do")
public String showDemo() {
return "demo";
}
@RequestMapping("/test7.do")
public String test7(ModelMap map) {
map.addAttribute("phone","15888888888");
return "ok";
}
}