dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
dispatcherServlet
/
@Controller
public class HelloWorld {
@RequestMapping("/helloWorld")
public String hello() {
System.out.println("hello world");
return "success";
}
}
http://127.0.0.1:8080/springmvc-01/helloWorld
,这个地址被web.xml中的DispatcherServlet拦截然后根据spring-mvc.xml中的扫描配置去寻找到有对应mapping的controller,这时候找到helloworld中的hello方法(注意:请求的mapping是springmvc-01/helloWorld,但是hello方法只需要写helloWorld即可,为什么这样需要参考源码),执行完成之后返回success然后加上前后缀找到相应的物理页面;params = {"username","age!=10"}
表示必须包含username跟age参数并且age不等于10,规则是
示例:下面表示使用PathVariable注解中name属性绑定路径中{id},并将其作为值传入方法hello的参数id中;
@RequestMapping(value = "/helloWorld/{id}")
public String hello(@PathVariable(name="id") String id) {
System.out.println("hello world:"+id);
return "success";
}
web.xml中过滤器配置
/*跟/的区别
https://www.cnblogs.com/xiehang/p/9472620.html
这种形式将会覆盖所有其它的servlet。不管你发出了什么样的请求,最终都会在这个servlet中结束。因此,对于servlet来说,这是一个很糟糕的URL模式。通常来讲,你只会想要在一个Filter中使用这种模式。它可以通过调用doFilter()方法来使请求继续。
这种形式不会覆盖任何其它的servlet。它仅仅替换了servlet容器中内建的默认servlet。这种形式通常只用来请求静态资源(CSS/JS/image等)和展示目录的列表。servlet容器内建的默认servlet同样可以处理HTTP cache请求、媒体(声音/视频)流以及文件的下载。通常来说,你不会想要覆盖这个默认的servlet,否则,你将不得不自己处理一些琐碎的任务。因此,对于sevlet来说,这同样是一个糟糕的URL模式。说到为什么JSP页面的请求并不会命中这个servlet,那是因为servlet容器内建的JSP servlet将会被调用,而这个容器内建的JSP servlet已经默认地映射在了*.jsp上。
这种空串的形式。当上下文的根被请求的时候,它将被调用。这与的方式是不同的,因为这种形式在当任何子目录被请求的时候不会被调用。当你期望一个“首页servlet”的时候,这种URL模式就是适合你的。
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
controller代码
@Controller
public class HelloWorld {
@RequestMapping(value = "/helloWorld",method=RequestMethod.POST)
public String testPost() {
System.out.println("test post");
return "success";
}
@RequestMapping(value = "/helloWorld/{id}",method=RequestMethod.GET)
public String testGet(@PathVariable(name="id") String s) {
System.out.println("test get:"+s);
return "success";
}
@RequestMapping(value = "/helloWorld/{id}",method=RequestMethod.PUT)
public String testPut(@PathVariable(name="id") String s) {
System.out.println("test put:"+s);
return "success";
}
@RequestMapping(value = "/helloWorld/{id}",method=RequestMethod.DELETE)
public String testDelete(@PathVariable(name="id") String s) {
System.out.println("test delete:"+s);
return "success";
}
}
请求jsp中form表单
@Controller
public class TestParam {
private static final String SUCCESS = "success";
@RequestMapping(value="/testParam")
public String testParam(@RequestParam(value = "uname") String uname,
@RequestParam(value = "uage") String uage) {
System.out.println("uname:"+uname);
System.out.println("uage:"+uage);
return SUCCESS;
}
}
控制器代码,页面表单传入uname跟uage会自动注入到user参数中;
@RequestMapping(value="/testParam")
public String testParam(User u) {
System.out.println("uname:"+u);
return SUCCESS;
}
表单属性
用户实体类
public class User {
private String uname;
private String uage;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUage() {
return uage;
}
public void setUage(String uage) {
this.uage = uage;
}
@Override
public String toString() {
return "User [uname=" + uname + ", uage=" + uage + "]";
}
}
设置view为页面,model是数据
设置model
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map modelMap)
设置视图
void setView(View view)
void setViewName(String viewName)j
控制器
@RequestMapping(value="/testModelAndView")
public ModelAndView testModelAndView(User u) {
System.out.println("uname:"+u);
ModelAndView modelAndView = new ModelAndView(SUCCESS);
modelAndView.addObject("user", u);
return modelAndView;
}
请求表单
应答页面
跳转成功
uname: ${requestScope.user.uname}
uage: ${requestScope.user.uage}
@RequestMapping(value="/testModelAndView")
public String testModelAndView(Map map) {
map.put("users", Arrays.asList("1","2","3"));
return SUCCESS;
}
@SessionAttributes("users")
@Controller
public class TestParam {
private static final String SUCCESS = "success";
@RequestMapping(value="/testModelAndView")
public String testModelAndView(Map map) {
map.put("users", Arrays.asList("1","2","3"));
return SUCCESS;
}
}
@Controller
public class TestParam {
private static final String SUCCESS = "success";
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false) Integer id,Map map) {
if(id != null) {
User user = new User();
user.setUage("15");
user.setUname("z3");
System.out.println("获取一个user:"+user);
map.put("user", user);
}
}
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println(user);
return SUCCESS;
}
}
mvc:view-controller
可以让请求直接根据配置的路径转发到响应的view中而不经过控制器,但是同时也必须配置mvc:annotation-driven
标签
@Component
public class HelloView implements View {
@Override
public void render(Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.getWriter().print("hello view time:"+new Date());
}
@Override
public String getContentType() {
// TODO Auto-generated method stub
return "text/html";
}
}
@RequestMapping("/testHelloView")
public String testHelloView() {
System.out.println("test view");
return "helloView";
}
,配置了则寻找目标资源,没配置则控制台输出找不到映射,页面返回404