SpringMvc笔记一

SpringMVC介绍

  1. Strut2缺点

1)  效率低

2)  标签库非常丰富,但业界使用的并不多,业界使用JSTL(通用)

Jsp/servlet/struts1/struts2/springmvc

  1. SpringMVC工作原理

 

  1. 体验springmvc

开发步骤:

1、  创建一个工程

2、  导入jar

spring-aop-3.2.2.jar                   AOP

spring-aspects-3.2.2.jar            面向切面

spring-beans-3.2.2.jar               核心包

spring-context-3.2.2.jar            扩展包

spring-context-support-3.2.2.jar               对扩展包支持

spring-core-3.2.2.jar                  核心包

spring-expression-3.2.2.jar      spring表达式

spring-web-3.2.2.jar                  b/s

spring-webmvc-3.2.2.jar          springmvc

com.springsource.org.aopalliance-1.0.0.jar             aop

com.springsource.org.apache.commons.logging-1.1.1.jar     通用日志

3、  需求:http://localhost/springmvc/home.action

最终要转向一个jsp页面 /WEB-INF/pages/index.jsp

4、  配置DispatcherServlet,在web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

         <!-- 配置springmvc核心分发器,对所有的url后缀为action的进行过滤 -->

         <servlet>

                   <servlet-name>action</servlet-name>

                   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

         </servlet>

         <servlet-mapping>

                   <servlet-name>action</servlet-name>

                   <url-pattern>*.action</url-pattern>

         </servlet-mapping>

         <welcome-file-list>

                   <welcome-file>index.jsp</welcome-file>

         </welcome-file-list>

</web-app>

l  Springmvc 什么时间加载的?

它不随容器启动而启动,它是第一次访问时进行加载。

l  改动springmvc的配置文件的位置

改到classpath下

         <servlet>

                   <servlet-name>action</servlet-name>

                   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                   <!-- 改变springmvc配置文件的位置和名称 -->

                   <init-param>

                            <param-name>contextConfigLocation</param-name>

                            <param-value>classpath:springmvc-servlet.xml</param-value>

                   </init-param>

         </servlet>

5、  配置Controller

handlerMapping默认BeanName方式

<bean name="/home.action" class="cn.itcast.controller.HomeController"/>

6、  写jsp页面 在WEB/INF/pages/index.jsp

7、  配置转向jsp

1)  在Controller处理完返回一个逻辑名 new ModelAndView(“逻辑名”)

2)  在springmvc-servlet.xml中配置Jsp视图解析器,内部资源视图解析器

<!-- 配置视图jsp解析器      

内部资源视图解析器     前缀+逻辑名+后缀  /WEB-INF/pages/   index   .jsp -->                  

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

           <property name="prefix" value="/WEB-INF/pages/"/>

           <property name="suffix" value=".jsp"/>

</bean>

了解常用的handlerMapping

1)   BeanNameUrlHandlerMapping 

<bean

id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

找寻配置的Controller,搜索器name属性,找到则转向jsp

2)   SimpleUrlHandlerMapping

前提controller要声明id属性

<bean id="homeController" name="/home.action" class="cn.itcast.controller.HomeController"/>

         <bean

id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

                   <property name="mappings">

                            <props>

                                     <prop key="/a.action">homeController</prop>

                                     <prop key="/b.action">homeController</prop>

                                     <prop key="/c.action">homeController</prop>

                            </props>

                   </property>

         </bean>

当有beanName方式和simple方式它们声明冲突时,也就是同名url。这时springmvc框架如何处理?

l  首先配置重名不会引起冲突。

l  当同名时,springmvc框架先按配置文件配置的顺序执行,当发现有一个URL满足,就跳出。

支持用户自定义顺序。增加order属性即可。

<proprety name=”order” value=”n”/>             n是一个整数,从0开始,越小优先级越高

3)   ControllerClassName 控制器类名

<bean

id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

访问链接:

http://localhost/springmvc/homeController.action

链接有多个单词时,都小写。

也可以去掉Controller

  1. 常见的Contoller控制器

1)   Command命令控制器

规定:传参,command,对应实体

在构造方法中要指定command对应实体

         public MyCommandController() {

                   this.setCommandClass(Person.class);

         }

2)   简单的Form控制器

规定:链接以get方式提交时转向formView;链接以post方式提交转向successView

         <bean class="cn.itcast.controller.PersonFormController">

                   <property name="formView" value="PersonForm"/>    <!-- 转向的form视图 -->

                   <property name="successView" value="index"/>          <!-- 成功视图 -->

         </bean>

3)   Wizard控制器

需求:个人简历,包括:简历信息、教育经历、工作经历

1)  继承  extends AbstractWizardFormController

2)  构造方法时设置关联的实体

         public MyWizardController() {

                   this.setCommandClass(Person.class);

                   this.setCommandName("p");                    //设置页面访问的对象

         }

3)  设置processFinish成功完成要处理的事情;设置processCancel取消转向页面

4)  做多个页面

5)  配置页面和顺序

         <bean class="cn.itcast.controller.MyWizardController">

                   <!-- 配置这个向导有哪些页面和页面的流转顺序 -->

                   <property name="pages">

                            <list>

                                     <value>wizard/PersonInfo</value>

                                     <value>wizard/PersonEdu</value>

                                     <value>wizard/PersonWork</value>

                            </list>

                   </property>

         </bean>

  1. 注解方式开发

1)   开发步骤:

1、  新建项目

2、  导入jar包

3、  创建controller,用注解方式声明

4、  在web.xml配置核心分发器DispatcherServlet

5、  创建一个springmvc-servlet.xml,只配置注解开发方式,配置视图解析器

6、  创建jsp

2)   需求:人员的管理,CRUD

1、  内存数据库,模拟一个service层

2、  初始化数据,10条,模拟列表页面

3、  将数据传递给页面,(集合)

4、  新增从页面获取数据,Model

3)   注意:新增保存如何传参

public String saveOrUpdate(String name, Integer age){

参数只要在方法中声明,springmvc框架会自动从页面中找寻对应变量,找寻变量的set方法,找到就设置,找不到抛弃。

l  方法一,按字段从页面取值

         @RequestMapping("/person/saveOrUpdate")

         public String saveOrUpdate(String name, Integer age){

                   Person p = new Person();

                   p.setName(name);

                   p.setAge(age);

                  

                   ps.insert(p);                                                              //调用servcie.insert方法插入记录

                  

                   return "redirect:/person/all.action";                         //转向列表action

         }

l  方法二,传实体对象

         @RequestMapping("/person/saveOrUpdate")

         public String saveOrUpdate(Person p){            //可以传递字段,也可以传递实体对象

                   ps.insert(p);                                                              //调用servcie.insert方法插入记录

                  

                   return "redirect:/person/all.action";                         //转向列表action

         }

修改方法:

4)   删除方法

封装到数组,但名称不同,页面一个名称,声明的属性另外一个名称

public String deleteMuch(@RequestParam("id")Integer[] ids){

当封装多个同名值时,springmvc如何封装?

1)  当类型为string,多个值以逗号隔开,

2)  当类型为integer或者double,date等只留第一个值;不会抛出错误。、

5)   传参总结

1)  从页面传递参数到action

Struts2               Model

Springmvc       可以通过单个属性,也可以通过实体对象

2)  从action传递参数到页面

Struts2               Model

Springmvc         Model(Map)

  1. 图片上传

1)  改造form enctype=”multipart/form-data” ;使用springmvc提供标签

2)  在后台接收参数二进制流

3)  配置单独的文件上传视图解析器

修改修改页面,先让数据回显,使用springmvc提供的标签

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>

<sf:form

action="${pageContext.request.contextPath}/person/saveOrUpdate.action" method="post">

<sf:hidden path="id"/>

<sf:input path="name"/>

  1. 注意修改时接收对象参数:

<sf:form

         enctype="multipart/form-data"

         action="${pageContext.request.contextPath}/person/saveOrUpdate.action"

         modelAttribute="p"

         method="post">model.addAttribute("p", p);                            //数据放到response

modelAttribute接收设置在Model中的对象

  1. 图片显示

默认只扫描.action结尾

         <servlet-mapping>

                   <servlet-name>action</servlet-name>

                   <url-pattern>*.action</url-pattern>

         </servlet-mapping>

扫描所有URL

         <servlet-mapping>

                   <servlet-name>action</servlet-name>

                   <url-pattern>/</url-pattern>

         </servlet-mapping>

<mvc:resources location="/upload/" mapping="/upload/**"/>

  1. 文件上传需要一个视图解析器

         <!-- 文件上传视图解析器,它的名字必须为multipartResolver -->

         <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                   <property name="maxUploadSize" value="10485760"/><!-- 10M -->

         </bean>

还需要两个jar

commons-fileupload-1.2.2.jar

commons-io-2.0.1.jar

  1. 框架中动态资源和静态资源分别解析

Apache + tomcats(集群)

Apache负责负载均衡,同时它来解析静态资源(js,css,image),tomcat做动态资源解析(jsp,action) 静态内容处理比动态快很多倍。

Nginx + tomcats

它的速度是apache的100倍。

  1. 校验JSR303 hibernate

com.springsource.javax.validation-1.0.0.GA.jar      校验规则

hibernate-validator-4.1.0.Final.jar                              hibernate实现

log4j.jar

slf4j-api-1.5.8.jar

slf4j-log4j12.jar

后台校验步骤:

1)  在实体上配置要校验的属性

public class Person {

         private Integer id;

         @Size(min=6,max=30,message="用户名称必须大于6个字符,小于30个字符。")

         private String name;

2)是否启用校验

@Valid Person p

3)  发生错误,在页面上提示    

BindingResult br      传递错误信息

4)  在新增页面中加错误提示

原文地址:https://www.cnblogs.com/biaogejiushibiao/p/9726846.html