情景:SpringMVC向后台控制层发送请求,特定方法处理该请求(获取传过来的数据,响应请求,把一些简单数据放入request即Model对象中)
- 在web.xml中加入SpringMVC的DispatcherServlet核心控制器,指明拦截哪些请求。
- 在WEB-INF文件夹下建立SpringMVC的XML配置文件,component-scan指明扫描那个包下的控制类。
- 被@Controller注解的类视为控制类,被@RequestMapping(value="",method=RequestMethod..POST)注解的方法表示处理该类请求(被value值匹配的请求),而且该请求只能是POST请求。
- 关于@RequestParam和Model model对象,如处理请求的方法 String login(@RequestParam("username") String userName,Model model){ model.addAttribute("userName",userName) } 表示从Request参数username取值赋值给userName,然后放入model对象中,model对象相当于request,里面存储的对象可以通过EL表达式 ${}获取。
- @RequestParam从request参数中取值,如果action层变量名和request参数名相同,不需要@RequestParam注解就可以获取值。
Q1:场景:直接输入URL地址以访问控制层达到实现一些功能的目的,如列表 【模拟表单提交】
A1:可以浏览器发送请求模拟表单提交等如http://localhost:8080/project/listViewer.spring?username=zhang
若拦截以".spring"结尾请求,控制层方法将处理listViewer这个请求,并接受参数username的值
Q2:场景:控制层限制请求的方式?
A2:在请求处理方法上加@RequestMapping(value="",method=RequestMethod..POST)指明前台发送的请求只能是POST
Q3:场景:解决多人开发路径可能重复的问题?(如前台登录发送/login请求,后台登录也发送/login请求)【有助于模块化开发】
解决路径重复问题的办法就是限定各模块的访问路径。
A3:两个请求可以是/a/login和/b/login,控制层有两个类分别处理/a或者/b下面的请求如:
1 @Controller 2 @RequestMapping("/a") 3 public class Login{ 4 @RequestMapping("/login") 5 public String login(){} 6 }
如果在类的上方使用@RequestMapping注解,表示首先定义相对的父路径,然后在方法上定义的路径是相对于类级别的。
Q4: 路径问题?controller响应请求是以当前路径为基准,响应文件的路径写法类似Linux切换目录。
可以在springMVC-servlet.xml加入如下配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" />
它的 功能就是限定默认访问的是/ 根路径。
注:响应同一目录下文件,路径不要加/,一般情况全部JSP文件应该放在/WEB-INF目录下,这样可以防止直接通过路径访问,必须让后台处理后跳转。
Q5:控制层重定向到控制层-有参数和无参数传递(区别在请求后面跟参数)
A5:如控制层处理方法 return "redirect:/listUsername.spring?username=zhang";
// SpringMVC重定向的关键代码在返回字符串加入"redirect:/"前缀。表示当前目录下发送一个listUsername.spring请求。
Q6:匹配URL路径执行指定Controller (控制层的处理方法@RequestMapping的value值用变量表示,表示请求的路径该部分可以是任意值,都可以匹配上)
A6:如发送的请求为 http://localhost:8080/springmvc/login/a/login.spring 表示发送/login目录下的login请求。
@Controller @RequestMapping("/login/{subfolder}") public class Login{ @RequestMapping("/login") public String login(@PathVariable("subfolder") String subFolder){ System.out.println(subFolder); return "/index.jsp"; } }
打印输出a,这里login方法中传入的参数和上面@RequestMapping注解的名称相同时,不用向@PathVariable出入值。