SpringMVC配置式开发、注解式开发和控制器参数说明
- SpirngMVC概述
SpringMVC本质就是一个Spring,所以它也可以使用Spring中的Ioc和AOP,与Spring不同的是SpringMVC是专门来做Web应用开发的.除外它还强化了Spring中的注解的使用。
- 配置式开发
和Spring一样SpringMVC也有一个核心配置文件用来声明Web相关的对象,例如处理处理器对象,视图对象等 - 项目目录
- springmvc.xml文件(SpringMVC核心配置文件):
<!--springmvc的配置文件-->
<!--声明控制器对象,让容器创建控制器对象,并把请求交给这个对象
class:控制器类的全限定名
id:请求的url地址,需要以"/"开头
-->
<bean id="/some.do" class="com.bjpowernode.controller.MyController"/>
<!--声明视图解析器:SpringMVC中的一个对象,处理视图的,能指定视图的路径和扩展名
InternalResourceViewResolver:内部资源视图解析器,处理jsp等视图文件
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--指定前缀:视图文件目录-->
<!--注意WEB-INF中的资源文件是受到保护的用户无法直接访问这个目录下的资源-->
<property name="prefix" value="/WEB-INF/views/"/>
<!--指定后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
- web.xml(Tomcat核心配置文件):
<!--
在服务器启动的时候,会找[/WEB-INF/myweb-servlet.xml]文件
在DispatcherServlet的init函数中,会创建SpringMVC的容器对象WebApplicationContext,
在创建容器对象时,会读取SpringMVC需要的配置文件,默认查找为/WEB/<serlvet-name>-servlet.xml
-->
<!--注册SpringMVC核心对象DispatcherServlet(*调度器)-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--来指定SpringMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--在服务器启动的时候创建serlvet对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
<url-pattern>表示把请求交给指定的servlet对象,只有把请求交给DispatcherServlet
才能使用SpringMVC框架处理.使用DispatcherServlet接受用户的请求在框架中url-pattern
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意:servlet-mapping中的servlet-name是使用SpringMVC核心对象DIspatchServlet
- MyController文件:
/**handleRequest()函数可以等同于Servlet中的doService()
* ModelAndView:表示给用户的处理结果
* */
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest,
javax.servlet.http.HttpServletResponse httpServletResponse)
throws Exception {
ModelAndView mv=new ModelAndView();
/**数据放到Model中,addObject相当于map.put()
* Model中的数据最后会放到request作用域中
* */
mv.addObject("msg","hello SpringMVC");
/**指定视图,setViewName("视图的完整路径")
* 框架对视图执行forward,等同于request.getRequestDispatcher("/show.jsp").forward()
**/
//mv.setViewName("/WEB-INF/views/show.jsp");
/**使用视图解析器后,可以使用视图的逻辑名称(视图文件名)
* 视图解析器:前缀+逻辑名称+后缀
* */
mv.setViewName("show");
/**返回值只存储了数据和视图的名称
* */
return mv;
}
- 配置式开发原理
注意的是用户发送的请求以及服务器返回的响应都通过DispatcherServlet,所以DispatcherServlet称为*调度器
- 注解式开发
注解:1.@Controller:创建控制器对象。2.@RequestMapping:指定请求有哪个函数处理
为了方便理解把原先配置式开发的项目来使用注解开发
- 对MyController文件的改造:
/**@Controller:创建控制器对象。默认是单例对象
*控制器对象能接受到用户的请求。指定函数处理请求
* 位置:在类定义的上面
* @Controller等同于
* <bean id="myController" class="com.bjpowernode.controller.MyController"/>
* */
@Controller
public class MyController{
/**@RequestMapping:请求映射,指定请求给某一个函数处理
* 属性:
* 1.value:请求的url地址,地址是唯一的,推荐"/"开头
* 2.method:可以指定请求方式(例:method=RequestMethod.POST)
* 位置:1.在函数的上面. 2.在类的上面(即在类中嵌套使用该注解)
* */
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","SpirngMVC注解式开发");
/**指定视图名称
* */
mv.setViewName("show");
return mv;
}
}
- 对springmvc.xml(SpringMVC核心配置文件)的改造:
<!--声明组件扫描器-->
<context:component-scan base-package="com.bjpowernode.controller"/>
注意:由于使用了注解开发所以无需在该配置文件中声明控制器对象,只要声明组件扫描器即可
注解式开发原理与配置式开发原理差不多,只不过在SpringMVC核心配置文件查找对应的Controller那里是由组件扫描器来扫描指定包下的@Controller注解和@RequestMapping注解然后通过对应的@RequestMapping注解对应的函数来处理请求,请求的结果同样是存到ModelAndView中并通过DispatcherServlet把数据存到view中然后再通过HttpServletResponse返回到用户浏览器
- 控制器的参数
@RequestMapping(value = "/some.do")
public ModelAndView doSome(HttpServletRequest request,
HttpServletResponse response,
HttpSession session){
String name=request.getParameter("name");
String age=request.getParameter("age");
System.out.println("name:"+name+",age:"+age);
ModelAndView mv=new ModelAndView();
mv.addObject("msg","SpirngMVC注解式开发");
/**指定视图名称
* */
mv.setViewName("show");
return mv;
}
用户提交的参数除了可以使用HttpServletRequest来接收外还可以使用对象和简单类型的参数来接收
- 简单类型参数接收:
@RequestMapping(value = "/some.do")
public ModelAndView doSome(String name,int age){
System.out.println("name:"+name+",age:"+age);
ModelAndView mv=new ModelAndView();
mv.addObject("msg","SpirngMVC注解式开发");
/**指定视图名称
* */
mv.setViewName("show");
return mv;
}
注意:简单类型的参数名称必须与提交请求中的参数名一致,此外该方式来接收用户请求的参数都是String类型的,当用户请求中的age没有值,那么就默认是空字符串或者提交的是字符串,由于后端是int类型的就会报400错误
- 简单类型接收方式2
/**@RequestParm注解:
* 属性:1.value:请求中的参数名
* 2.required:默认是true,true表示请求中必须有这个参数
* */
@RequestMapping(value = "/some.do")
public ModelAndView doSome(@RequestParam(value = "rname")String name,
@RequestParam(value = "rage") int age){
System.out.println("name:"+name+",age:"+age);
ModelAndView mv=new ModelAndView();
mv.addObject("msg","SpirngMVC注解式开发");
/**指定视图名称
* */
mv.setViewName("show");
return mv;
}
- 以对象的方式来接收:
@RequestMapping(value = "/some.do")
public ModelAndView doSome(User user){
System.out.println("控制器接收请求的参数:"+user);
ModelAndView mv=new ModelAndView();
mv.addObject("msg","SpirngMVC注解式开发");
/**指定视图名称
* */
mv.setViewName("show");
return mv;
}
注意:前端的input标签中的name的值要和User类中的set函数省去set后的名一致,这本质就是Spring中的设值注入
本文地址:https://blog.csdn.net/weixin_43730516/article/details/109278722
上一篇: 以前是泡功夫茶的
下一篇: 淘宝人生身价怎么涨 淘宝人生怎么提高身价