SpringMVC
1)概念:用来简化基于MVC架构的web应用程序开发的框架
注:SpringMVC属于Spring框架的一部分
2)五大组件
a、DispatcherServlet 前端控制器
b、HandlerMapping 映射处理器 里面有请求地址与模型的对象关系
c、Controller 处理器 模型
d、ModelAndView 模型和视图 (处理结果里面有数据和视图名,这边的视图名只是文件的名字不带.后缀名的)
e、ViewResolver 视图解析器 ()
这五大组件之间的关系: +1+ 浏览器将请求发送给DispatcherServlet
+2+ HandlerMapping告知DispatcherServlet请求地址与模型的对应关系
+3+ DispatcherServlet知道对应关系后,会调用Controller 来处理业务逻辑
+4+ Controller会将处理后的结果封装到ModelAndView返回给DispatcherServlet
+5+ DispatcherServlet接收到结果后再询问ViewResolver调用哪个jsp
+6+ 最后DispatcherServlet得到解析后的视图名后调用对应的jsp
DispatcherServlet收到请求之后,会依据HandlerMapping的配置,去调用相应的Controller来处理。
Controller将处理结果封装成ModelAndView对象,然后将对象返回给DispatcherServlet
DispatcherServlet依据ViewResolver的解析,调用响应的jsp来展现。
3)编程步骤
第一步、导包 spring-webMVC 导入到pom.xml
第二步、 添加spring的配置文件 将applicationContext.xml这个文件复制到resource文件夹下
第三步、配置DispatcherServlet 在web.xml里配置,增加以下代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param> //初始化参数配置
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value> //第二步中的那个配置文件存放的地址
</init-param>
<load-on-startup>1</load-on-startup> // 1 表示立马执行
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第四步、写Controller相关的类 要实现Controller
例如: public class HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("hello spring-mvc");
/*ModelAndView有两个常用的构造器
ModelAndView(String viewname)
ModelAndView(String viewname,Map data)
注:viewname 视图的名字
data 数据*/
return new ModelAndView("hello");
}
}
第五步、写一个jsp文件(就是视图名字.jsp)
第六步、配置HandlerMapping和ViewResolver
先在applicationContext.xml配置文件中配置HandlerMappling
<!--定义请求处理映射HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--指定请求和Controller对应关系 -->
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<!--声明Controller 处理器,这边的id要和上面<prop></prop>中间的值一样-->
<bean id="helloController" class="controller.HelloController"/>
再配置ViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/> //前缀 也就是文件所在的路劲
<property name="suffix" value=".jsp"/> //文件的后缀
</bean>
整个mvc的工作流程
tomcat启动就会实例化DispatcherServlet并执行,DispatcherServlet实例化后就会启动spring容器,容器会实例化 HandlerMapping Controller 和ViewResolver
接下来的流程就按照上面写的五大组件之间的关系执行
15、基于注解的SpringMvc应用
第一步:导包spring-webmvc
第二步:添加spring的配置文件 将applicationContext.xml这个文件复制到resource文件夹下
第三步:配置DispatcherServlet 在web.xml里配置,增加以下代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param> //初始化参数配置
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value> //第二步中的那个配置文件存放的地址
</init-param>
<load-on-startup>1</load-on-startup> // 1 表示立马执行
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第四步:写Controller
a、不用实现Controller接口了e
b、可以添加多个方法 一个方法处理一个请求
c、方法名不做要求的,可以自己取名字,返回值可以是ModelAndView也可以是String
d、将@Controller注解添加到类的前面 用于组件扫面 用注解方式创建对象,相当于之前的声明Controller 处理器,配置的那个类的bean配置
e、将@RequestMaping这个注解添加到类的前面或则方法前 代替之前在配置文件里的那个HandlerMappling 的配置
第五步:写一个jsp文件
第六步:在配置文件中配置ViewResolver,还要添加组件扫面和mvc注解扫描
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/main/"/> //前缀 也就是文件所在的路劲
<property name="suffix" value=".jsp"/> //文件的后缀
</bean>
<!-- 组件扫描 -->
<context:component-scan base-package="controller"/>
<!-- 配置mvc扫描 这个扫描的是第四步的e的那个步骤 -->
<mvc:annotation-driven/>
16、读取请求的参数值
1)通过request的getParameter方法
在写的Controller的下面的方法中写参数 HttpServletRequest request
然后调用getParameter方法
例如:public String login(HttpServletRequest request){
String name=request.getParameter("adminCode");
String pwd=request.getParameter("pwd");
System.out.println("name:"+name+";pwd:"+pwd);
}
2)通过给@RequestParam注解来获取
例如:
/*
如果参数的名称和jsp页面中的name属性的值不一样,就用@RequestParam("pwd")这个注解来说明
把请求参数的值给方法中的那个参数* 如果方法中的参数名和页面中的name的属性值一样,就不用写@RequestParam("pwd")这个注解了/
@RequestMapping("/login2.do")
public String login2(String adminCode,@RequestParam("pwd") String password){
System.out.println("name:"+adminCode+";pwd:"+password);}
3)可以通过javabean的方式获得请求参数的值
a、写一个java类
要求:变量的名字和页面中name属性的值一样,并且提供相应的get和set方法
b、将这个类作为参数给Controller的下面的方法
在调用那个类的相应的get方法获得参数值
例如: public String login3(AdminParam ap){
String adminCode=ap.getAdminCode();
String password=ap.getPwd();
System.out.println("name:"+adminCode+";pwd:"+password);}
17、向jsp页面传值
1)将值绑定在request对象上
先获得值后,用request的setAttribute方法给一个对象名赋值,然后在页面上可以用el表达式显示值
例如:@RequestMapping("/login4.do")
public String login4(AdminParam ap,HttpServletRequest request){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
//将数据绑定到request对象上
request.setAttribute("adminCode", adminCode);
request.setAttribute("pwd", pwd);}
<p>首页<br/>
账号:${adminCode }
密码:${pwd }
</p>
2)返回ModelAndView
先获得值后,/*将数据添加到ModelAndView中:
第一步:将数据添加到Map集合里;
第二步:将Map添加到ModelAndView
*/
public ModelAndView login5(AdminParam ap,HttpServletRequest request){
String admin=ap.getAdminCode();
String pwd=ap.getPwd();
Map<String,Object> data=new HashMap<String, Object>();
data.put("adminCode", admin); //这边的key(就是adminCode)可以自己取名,在页面上用el表达式取的时候名字和这个一样即可
data.put("pwd", pwd);
ModelAndView mav=new ModelAndView("in",data); //这边的"in" 是要转发到的那个视图的名字
return mav;//默认会使用转发
在页面上就可以通过Map的key来获得value值
3)将数据添加到ModelMap上
先获得值后,/*将数据添加到ModelMap中
调用ModelMap中的addAttribute方法,绑定对象,这样就可以在页面显示值了 用el表达式显示值的使用${这里面的名字和addAttribute这个方法的第一个参数的名字一样}
@RequestMapping("/login6.do")
public String login6(AdminParam ap,ModelMap mm){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
/* 实际上着还是DispatcherServlet讲ModelMap中的数据取出来,绑定在request对象上
*/
mm.addAttribute("admin",adminCode);
mm.addAttribute("p",pwd);
return "in";//默认会使用转发
4)将数据添加到session对象上
先获得值,调用setAttribute的方法,绑定到session上
//向jsp页面传值
@RequestMapping("/login7.do")
public String login7(AdminParam ap,HttpSession session){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
//将数据绑定到session
session.setAttribute("admin", adminCode);
session.setAttribute("p", pwd);
return "in";//默认会使用转发
}
18、mvc中页面重定向
1)如果处理器的方法的返回值是String 在重定向地址前添加"redirect:"
那么在方法中的return的语法是: return "redirect:toIndex.do";
再写一个方法处理重定向的请求
例如: //重定向
@RequestMapping("/login8.do")
public String login8(){ //返回值是String
return "redirct:in.do";//重定向
}
//处理重定向请求
@RequestMapping("/in.do")
public String login9(){
return "in";
}
2)如果处理器的方法的返回值ModelAndView
先创建RedirectView对象 RedirectView rv=new RedirectView("in.do"); 这边的参数是重定向的地址
在创建ModelAndView mav=new ModelAndView(rv); 这边的参数是上面的RedirectView对象
例如@RequestMapping("/login9.do")
public ModelAndView login10(){
RedirectView rv=new RedirectView("in.do");
ModelAndView mav=new ModelAndView(rv);
return mav;
}
//处理重定向请求
@RequestMapping("/in.do")
public String login9(){
return "in";
}
1)概念:用来简化基于MVC架构的web应用程序开发的框架
注:SpringMVC属于Spring框架的一部分
2)五大组件
a、DispatcherServlet 前端控制器
b、HandlerMapping 映射处理器 里面有请求地址与模型的对象关系
c、Controller 处理器 模型
d、ModelAndView 模型和视图 (处理结果里面有数据和视图名,这边的视图名只是文件的名字不带.后缀名的)
e、ViewResolver 视图解析器 ()
这五大组件之间的关系: +1+ 浏览器将请求发送给DispatcherServlet
+2+ HandlerMapping告知DispatcherServlet请求地址与模型的对应关系
+3+ DispatcherServlet知道对应关系后,会调用Controller 来处理业务逻辑
+4+ Controller会将处理后的结果封装到ModelAndView返回给DispatcherServlet
+5+ DispatcherServlet接收到结果后再询问ViewResolver调用哪个jsp
+6+ 最后DispatcherServlet得到解析后的视图名后调用对应的jsp
DispatcherServlet收到请求之后,会依据HandlerMapping的配置,去调用相应的Controller来处理。
Controller将处理结果封装成ModelAndView对象,然后将对象返回给DispatcherServlet
DispatcherServlet依据ViewResolver的解析,调用响应的jsp来展现。
3)编程步骤
第一步、导包 spring-webMVC 导入到pom.xml
第二步、 添加spring的配置文件 将applicationContext.xml这个文件复制到resource文件夹下
第三步、配置DispatcherServlet 在web.xml里配置,增加以下代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param> //初始化参数配置
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value> //第二步中的那个配置文件存放的地址
</init-param>
<load-on-startup>1</load-on-startup> // 1 表示立马执行
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第四步、写Controller相关的类 要实现Controller
例如: public class HelloController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
System.out.println("hello spring-mvc");
/*ModelAndView有两个常用的构造器
ModelAndView(String viewname)
ModelAndView(String viewname,Map data)
注:viewname 视图的名字
data 数据*/
return new ModelAndView("hello");
}
}
第五步、写一个jsp文件(就是视图名字.jsp)
第六步、配置HandlerMapping和ViewResolver
先在applicationContext.xml配置文件中配置HandlerMappling
<!--定义请求处理映射HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--指定请求和Controller对应关系 -->
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<!--声明Controller 处理器,这边的id要和上面<prop></prop>中间的值一样-->
<bean id="helloController" class="controller.HelloController"/>
再配置ViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/> //前缀 也就是文件所在的路劲
<property name="suffix" value=".jsp"/> //文件的后缀
</bean>
整个mvc的工作流程
tomcat启动就会实例化DispatcherServlet并执行,DispatcherServlet实例化后就会启动spring容器,容器会实例化 HandlerMapping Controller 和ViewResolver
接下来的流程就按照上面写的五大组件之间的关系执行
15、基于注解的SpringMvc应用
第一步:导包spring-webmvc
第二步:添加spring的配置文件 将applicationContext.xml这个文件复制到resource文件夹下
第三步:配置DispatcherServlet 在web.xml里配置,增加以下代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param> //初始化参数配置
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value> //第二步中的那个配置文件存放的地址
</init-param>
<load-on-startup>1</load-on-startup> // 1 表示立马执行
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
第四步:写Controller
a、不用实现Controller接口了e
b、可以添加多个方法 一个方法处理一个请求
c、方法名不做要求的,可以自己取名字,返回值可以是ModelAndView也可以是String
d、将@Controller注解添加到类的前面 用于组件扫面 用注解方式创建对象,相当于之前的声明Controller 处理器,配置的那个类的bean配置
e、将@RequestMaping这个注解添加到类的前面或则方法前 代替之前在配置文件里的那个HandlerMappling 的配置
第五步:写一个jsp文件
第六步:在配置文件中配置ViewResolver,还要添加组件扫面和mvc注解扫描
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/main/"/> //前缀 也就是文件所在的路劲
<property name="suffix" value=".jsp"/> //文件的后缀
</bean>
<!-- 组件扫描 -->
<context:component-scan base-package="controller"/>
<!-- 配置mvc扫描 这个扫描的是第四步的e的那个步骤 -->
<mvc:annotation-driven/>
16、读取请求的参数值
1)通过request的getParameter方法
在写的Controller的下面的方法中写参数 HttpServletRequest request
然后调用getParameter方法
例如:public String login(HttpServletRequest request){
String name=request.getParameter("adminCode");
String pwd=request.getParameter("pwd");
System.out.println("name:"+name+";pwd:"+pwd);
}
2)通过给@RequestParam注解来获取
例如:
/*
如果参数的名称和jsp页面中的name属性的值不一样,就用@RequestParam("pwd")这个注解来说明
把请求参数的值给方法中的那个参数* 如果方法中的参数名和页面中的name的属性值一样,就不用写@RequestParam("pwd")这个注解了/
@RequestMapping("/login2.do")
public String login2(String adminCode,@RequestParam("pwd") String password){
System.out.println("name:"+adminCode+";pwd:"+password);}
3)可以通过javabean的方式获得请求参数的值
a、写一个java类
要求:变量的名字和页面中name属性的值一样,并且提供相应的get和set方法
b、将这个类作为参数给Controller的下面的方法
在调用那个类的相应的get方法获得参数值
例如: public String login3(AdminParam ap){
String adminCode=ap.getAdminCode();
String password=ap.getPwd();
System.out.println("name:"+adminCode+";pwd:"+password);}
17、向jsp页面传值
1)将值绑定在request对象上
先获得值后,用request的setAttribute方法给一个对象名赋值,然后在页面上可以用el表达式显示值
例如:@RequestMapping("/login4.do")
public String login4(AdminParam ap,HttpServletRequest request){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
//将数据绑定到request对象上
request.setAttribute("adminCode", adminCode);
request.setAttribute("pwd", pwd);}
<p>首页<br/>
账号:${adminCode }
密码:${pwd }
</p>
2)返回ModelAndView
先获得值后,/*将数据添加到ModelAndView中:
第一步:将数据添加到Map集合里;
第二步:将Map添加到ModelAndView
*/
public ModelAndView login5(AdminParam ap,HttpServletRequest request){
String admin=ap.getAdminCode();
String pwd=ap.getPwd();
Map<String,Object> data=new HashMap<String, Object>();
data.put("adminCode", admin); //这边的key(就是adminCode)可以自己取名,在页面上用el表达式取的时候名字和这个一样即可
data.put("pwd", pwd);
ModelAndView mav=new ModelAndView("in",data); //这边的"in" 是要转发到的那个视图的名字
return mav;//默认会使用转发
在页面上就可以通过Map的key来获得value值
3)将数据添加到ModelMap上
先获得值后,/*将数据添加到ModelMap中
调用ModelMap中的addAttribute方法,绑定对象,这样就可以在页面显示值了 用el表达式显示值的使用${这里面的名字和addAttribute这个方法的第一个参数的名字一样}
@RequestMapping("/login6.do")
public String login6(AdminParam ap,ModelMap mm){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
/* 实际上着还是DispatcherServlet讲ModelMap中的数据取出来,绑定在request对象上
*/
mm.addAttribute("admin",adminCode);
mm.addAttribute("p",pwd);
return "in";//默认会使用转发
4)将数据添加到session对象上
先获得值,调用setAttribute的方法,绑定到session上
//向jsp页面传值
@RequestMapping("/login7.do")
public String login7(AdminParam ap,HttpSession session){
String adminCode=ap.getAdminCode();
String pwd=ap.getPwd();
//将数据绑定到session
session.setAttribute("admin", adminCode);
session.setAttribute("p", pwd);
return "in";//默认会使用转发
}
18、mvc中页面重定向
1)如果处理器的方法的返回值是String 在重定向地址前添加"redirect:"
那么在方法中的return的语法是: return "redirect:toIndex.do";
再写一个方法处理重定向的请求
例如: //重定向
@RequestMapping("/login8.do")
public String login8(){ //返回值是String
return "redirct:in.do";//重定向
}
//处理重定向请求
@RequestMapping("/in.do")
public String login9(){
return "in";
}
2)如果处理器的方法的返回值ModelAndView
先创建RedirectView对象 RedirectView rv=new RedirectView("in.do"); 这边的参数是重定向的地址
在创建ModelAndView mav=new ModelAndView(rv); 这边的参数是上面的RedirectView对象
例如@RequestMapping("/login9.do")
public ModelAndView login10(){
RedirectView rv=new RedirectView("in.do");
ModelAndView mav=new ModelAndView(rv);
return mav;
}
//处理重定向请求
@RequestMapping("/in.do")
public String login9(){
return "in";
}