SpringMVC入门总结
一、SpringMVC的好处?
1,基于注解,stuts2虽然也有注解但是比较慢,没人用更多的时候是用xml的形式
2,能与spring其它技术整合比如说webflow等,
3,获取request及session对象比较简单,直接当参数值传入就行了,而struts2还需要通过ServletActionContext 对象获取
4,验证也比较简单,通过jsr-303就能实现,而不必写其它的代码,而struts2是通过写 actionName-validation.xml实现的
二、SpringMVC是什么?
Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
三、SpringMVC的用法
1.传统方式
(1)创建工程,拷贝springmvc相关的jar,并把jar拷贝到lib
(2) 配置web.xml,配置前段控制器DispatcherServlet
1 <servlet> 2 <servlet-name>springmvc</servlet-name> 3 <servlet-class> 4 org.springframework.web.servlet.DispatcherServlet 5 </servlet-class> 6 </servlet> 7 <servlet-mapping> 8 <servlet-name>springmvc</servlet-name> 9 <url-pattern>*.do</url-pattern> 10 </servlet-mapping>
(3) 在web-inf 下创建springmvc配置文件,[servlet-name]-servlet.xml 文件名必须和web.xml中的servlet-name一致。例如:springmvc-servlet.xml
(4) [servletname]-servlet.xml中配置HandlerMapping 根据benaname找到对应Conntroller( 可以省略)
1 <bean class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping 2 </bean>
(5)创建JSP页面,需要发出请求的页面
(6) 创建HelloController 继承AbstractController重写handleRequestInternal,控制类中的方法如下:
1 protected ModelAndView handleRequestInternal(HttpServletRequest request, 2 HttpServletResponse response) throws Exception { 3 String hello=request.getParameter("ceshi"); 4 System.out.println(hello); 5 ModelAndView model=new ModelAndView("index"); 6 model.addObject("helloworld", hello); 7 return model; 8 }
(7)[servletname]-servlet.xml中配置<!-- 配置视图解析器 -->
1 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 2 <!-- 前缀 --> 3 <property name="prefix" value="/view/"></property> 4 <!-- 后缀 --> 5 <property name="suffix" value=".jsp"></property> 6 </bean>
(8)[servletname]-servlet.xml中配置HandlerMapping给你钱,Controller就要接着(比喻)
1 <bean name=”/hello.do” class=”zyy.controller.helloController”></bean>
2.注解方式
注解方式呢,在开发中庸的比较多,方便。
- 在web.xml中配置DispatcherServlet
- 在web-inf下新建[servlet-name]-servlet.xml配置文件
- 在[servlet-name]-servlet.xml中配置注解驱动
1 <mvc:annotation-driven/>
4.配置注解扫描
1 <context:component-scan base-package="zyy"></context:component-scan>
5.创建控制器
1 @Controller 2 public class HelloController { 3 @RequestMapping(value = "/hello.do") 4 public String hello(String ceshi, Model model) { 5 System.out.println(ceshi); 6 model.addAttribute("helloworld", ceshi); 7 return "index"; 8 } 9 }
6.创建请求jsp页面
7.创建视图解析器
8.没了,这就是注解,你会发现注解会减少好多代码。
四、再说说如何从页面获取参数的方式
- 通过HttpServletRequest request来获取,request.getParameter();
1 @RequestMapping(value = "/list.do") 2 public String list(HttpServletRequest request){ 3 String name=request.getParameter("userName"); 4 return "userinfo/user_list"; 5 }
2. 直接定义参数,保证参数和前台标签的name一致即可
1 java代码 2 @RequestMapping(value = "/list.do") 3 public String list(@RequestParam(value = "uName") String userName, 4 Integer userPassword, String userSex) { 5 System.out.println(userName + "\t" + userPassword + "\t" + userSex); 6 return "userinfo/user_list"; 7 } 8 jsp代码 9 <form action="user/list2.do" method="post"> 10 姓名:<input type="text" name="userName"/><br/> 11 <-- 姓名2:<input type="text" name="uName"/><br/>--> 12 密码:<input type="text" name="userPassword"/><br/> 13 性别:<input type="text" name="userSex"/><br/> 14 日期:<input type="text" name="userTime"/> 15 <input type="submit" name="commit" value="提交"/> 16 </form>
注意:
1,@RequestParam()这个可以设置从页面传的参数设置默认值。或者设置别名(例如:input标签中name=”userName”时,此方法可以获取到该标签的value值,当name=”uName”时,也可以获取到该标签的value值)
2,直接定义参数方式,参数可以自动转换格式,例如页面时String类型的密码,参数可以为Integer类型,它可以自动转换(这点非常好)
3. 通过对象来获取值
1 @RequestMapping(value = "/list2.do") 2 public String list2(User us, Date userTime) { 3 System.out.println(us.getUserName() + "\t" + us.getUserPassword() 4 + "\t" + us.getUserSex()); 5 System.out.println(userTime); 6 return "userinfo/user_list"; 7 } 8 9 @InitBinder 10 public void initBinder(WebDataBinder binder) { //自动转换成Date类型 11 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 12 dateFormat.setLenient(false); 13 binder.registerCustomEditor(Date.class, new CustomDateEditor( 14 dateFormat, false)); 15 }
注意:
1,@RequestParam()这个可以设置从页面传的参数设置默认值。或者设置别名(例如:input标签中name=”userName”时,此方法可以获取到该标签的value值,当name=”uName”时,也可以获取到该标签的value值)
2,直接定义参数方式,参数可以自动转换格式,例如页面时String类型的密码,参数可以为Integer类型,它可以自动转换(这点非常好)
3. 通过对象来获取值
1 @RequestMapping(value = "/list2.do") 2 public String list2(User us, Date userTime) { 3 System.out.println(us.getUserName() + "\t" + us.getUserPassword() 4 + "\t" + us.getUserSex()); 5 System.out.println(userTime); 6 return "userinfo/user_list"; 7 } 8 9 @InitBinder 10 public void initBinder(WebDataBinder binder) { //自动转换成Date类型 11 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 12 dateFormat.setLenient(false); 13 binder.registerCustomEditor(Date.class, new CustomDateEditor( 14 dateFormat, false)); 15 }
注意:参数为日期类型时,需要定一下检测日期类型的方法,进行格式转换。
五、如何从控制器中传值到页面呢?
1 1.最原始的,通过HttpServletRequset request来传递,request.setAttribute();
1 @RequestMapping(value="/add1.do") 2 public String add(HttpServletRequest request){ 3 4 String userNumber = request.getParameter("userNumber"); 5 String passWord = request.getParameter("passWord"); 6 7 System.out.println("userNumber:"+userNumber+" passWord:"+passWord); 8 9 String str = "userNumber:"+userNumber+" passWord:"+passWord; 10 11 request.setAttribute("user", str); 12 13 return "user_add1"; 14 }
1 2. 通过ModelAndView来传递到页面
1 @RequestMapping(value="/add2.do") 2 public ModelAndView add2(){ 3 4 ModelAndView mav = new ModelAndView("user_add2"); 5 mav.addObject("userId", 1001); 6 mav.addObject("userName", "张三"); 7 8 return mav; 9 }
1 3. 通过model来传递(一般开发这个比较用的多)
1 @RequestMapping(value="/add3.do") 2 public String add3(Model model){ 3 4 model.addAttribute("personId", 9527); 5 model.addAttribute("personName", "唐伯虎"); 6 7 return "user_add3"; 8 }
1 4. 通过map来传递
1 @RequestMapping(value="/add4.do") 2 public String add4(Integer personId,String userName,Map map){ 3 4 System.out.println(personId); 5 System.out.println(userName); 6 map.put("personId", 9527); 7 map.put("personName", "唐伯虎"); 8 9 return "user_add4"; 10 }
六、最后再掌握一个ajax,就算入门了
1 jsp页面 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <% 5 String path = request.getContextPath(); 6 String basePath = request.getScheme() + "://" 7 + request.getServerName() + ":" + request.getServerPort() 8 + path + "/"; 9 %> 10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 11 <html> 12 <head> 13 <base href="<%=basePath%>"> 14 <title>Insert title here</title> 15 <script type="text/javascript" src="js/jquery.js"></script> 16 <script type="text/javascript"> 17 $().ready(function(){ 18 $("#but01").click(function(){ 19 var userNumber = $("#userNumber").val(); 20 if(userNumber.length == 0){ 21 alert('请输入账号'); 22 }else{ 23 $.post("<%=basePath%>ajaxUser.do",{userNumber:userNumber},function(data){ 24 alert(data); 25 }); 26 } 27 }); 28 $("#but02").click(function(){ 29 var userId = $("#userId").val(); 30 $.post("<%=basePath%>ajaxUser2.do",{userId:userId},function(data){ 31 alert(data.userId+' --'+data.userName+' --- '+data.userAge); 32 },"json"); 33 }); 34 }); 35 </script> 36 </head> 37 <body> 38 <hr> 39 账号:<input type="text" id="userNumber" name="userNumber"/> 40 <input type="button" id="but01" value="验证"/> 41 <hr/> 42 编号:<input type="text" id="userId" name="userId"/> 43 <input type="button" id="but02" value="查询"/> 44 <hr/> 45 </body> 46 </html>
1 控制器代码 2 @Controller 3 public class UserController { 4 @RequestMapping("/ajaxUser.do") 5 public void userNumber(String userNumber, HttpServletResponse response) { 6 System.out.println(userNumber); 7 try { 8 // 响应 9 response.setContentType("text/html"); 10 response.setCharacterEncoding("utf-8"); //向页面传递提示消息 11 PrintWriter out = response.getWriter(); 12 if ("liu".equals(userNumber)) { 13 out.println("对不起,请重新输入账号"); 14 } else { 15 out.println("恭喜您,账号可以使用"); 16 } 17 out.flush(); 18 out.close(); 19 } catch (Exception e) { 20 e.printStackTrace(); 21 } 22 } 23 24 @RequestMapping("/ajaxUser2.do") 25 public @ResponseBody UserInfo ajaxUser(Integer userId){ 26 System.out.println("编号:"+userId); 27 UserInfo user = new UserInfo(); 28 user.setUserId(userId); 29 user.setUserName("张三"); 30 user.setUserAge(18); 31 return user; 32 } 33 34 }
七、总结:
1 经过上述简单但有态度的总结,希望看到的朋友可以明白SpringMVC的执行的过程和用法。想要深入的精通SPringMVC还需要自己慢慢的钻研喽,加油,我们一起努力。