springmvct原理

springmvc运行原理:客户端发送请求提交到DispatherServlet控制器,查询一个或多个HandlerMapping.找到处理请求的controller.DispatherServlet将请求提交到controller,controller调用业务逻辑处理后返回ModelAndView.DispatherServlet查询一个或多个viewResolver视图解析器,找到ModelAndView指定的视图,视图负责将结果显示到客户端。

web.xml

 <!-- 配置Spring MVC的核心控制器DispatcherServlet -->
  <servlet>
  <servlet-name>dispatcherServlet</servlet-name>  和dispatcherServlet-servlet.xml对应
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 初始化参数 -->
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>

自动启动servlet加载的优先级

负数 选择启动的时候才启动

  </servlet>


  <servlet-mapping>
  <servlet-name>dispatcherServlet</servlet-name> 和dispatcherServlet-servlet.xml对应
  <url-pattern>/</url-pattern>不能写/*
  </servlet-mapping>

配置文件默认WEB-INF下建的

<!--Spring默认的就是BeanNameUrlHandlerMapping -->//基本不用

<bean class=" org.springframework.web.servlet.BeanNameUrlHandlerMapping">//这句话要不要都行

通过bean的名称完成URL映射(访问的URL根目录)

<bean name=" url" class=" controller">

<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>


继承abstractController(不用写注解@controller)相当于struts2里action的execute 重写handleRequestInternal(request,response)方法

return new ModelAndView("welcome");//逻辑视图名 web-info里的页面是安全的不能访问到



<!--使用annotation方式,完成映射-->

<!--让spring扫描包下的所有的类,让标注spring注解的类都生效-->

 加@controller

<context:component-scan base-package="cn.bdqn.controller"/>    
    <mvc:annotation-driven/>
    
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

基于注解DefaultAnnotationHandlerMapping让spring扫描包下的所有类,让标注spring注解的类生效

通过RequestMapping映射 @RequestMapping(value="")


HandlerMapping两种实现

BeaningNameUrlHandlerMapping根据控制器Bean的名字将控制器映射到URL

DefalutAnnotationHandlerMapping将请求映射给使用@RequestMapping注解的控制器和控制方法


视图解析器:将逻辑视图的名字与JSP等视图技术进行匹配InternalResourceViewResovler

在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定

prefix subffix

(@requestParam(value="username",required=true(默认值)) String username) 直接通过函数参数传值

支持Rest风格会把参数当做URL地址的一部分(required=false)

(@requestParam(value="username")前端参数名和后台参数名一致可省略,不用写@requestparam 是地址?后的参数 和前台请求参数


model.addAttribute("username",username); map键值对结构

model.addAttribute(username)前台取key值username类型“string” 或“user”对象

return返回字符串view视图名

也可以用注解@ModelAttribute("user");user是key值

//springmvc对象入参,如果没有用addAttibute或注解会自动放到model中去key的名字为对象名(user)

前提是:从来没有往model里放数据


mview.setViewName("/");return modelandview 返回modelandview

mview.addObject("username",username);String类型

mview.addObject(username);前台取key值username类型“string” 或“user”对象${string}${username}小写

入参两种Map(不推荐)和Model(作用域request 多线程)同一张hash表 索引改变


struts2的action多例的 scope="prototype"

springMvc里的controller是单例的(高并发的情况下方法间的入参传递参数性能高)

<c:out value="${}">jstl el表达式

rest风格并不等于rest技术 表述性状态转移

method=RequestMethod.

get 请求读取数据 

post请求添加提交

delete请求删除

 put请求修改

不同的请求对应不同的关系 一个资源可以对应多种视图

return "redirect/forward:url" 返回的是url不是逻辑视图名

@requestMapping具有唯一性(参数要不一样value,method,param)

controller是单例的


JSR303验证框架服务器端验证

Jboss.jar

Hibernate-Validator.jar

validation-api.jar

import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

public class User {
	
	private int id;
	private String userName;
	private String password;
	private String email;
	
	public User() {
	}

	public User(int id, String userName, String password, String email) {
		this.id = id;
		this.userName = userName;
		this.password = password;
		this.email = email;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	@NotEmpty(message="用户名不能为空")
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Size(max=4,min=10,message="密码长度必须在4-10之间")
	public String getPassword() {
		return password;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}
	@Email(message="邮箱格式不正确")
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", password="
				+ password + ", email=" + email + "]";
	}
	
}

@Controller
public class UserLogin{
	private Map<String,User> map = new HashMap<String,User>();

	public UserLogin() {
		map.put("1",new User(1,"beta01","admin","beta@qq.com"));
		map.put("2",new User(2,"beta02","admin","beta@qq.com"));
		map.put("3",new User(3,"beta03","admin","beta@qq.com"));
	}
	
	@RequestMapping(value="/addsave",method=RequestMethod.POST)
	public String addSave(@Validated User user,BindingResult bindingResult){//紧跟validate之后写验证结果
		if(bindingResult.hasErrors()){
			return "user/add";
		}
		map.put(user.getId()+"",user);
		return "redirect:/user/list";
	}
}

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="fm"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--不指定action 提交到/add  -->
<fm:form modelAttribute="user" action="addsave" method="post">
ID:<fm:input path="id"/> 
userName:<fm:input path="username"/> <fm:errors path="username"/>
password:<fm:input path="password"/> <fm:errors path="password"/>
email:<fm:input path="email"/> <fm:errors path="email"/>
<input type="submit" value="提交"/>
</fm:form>
</body>
</html>



rest风格 ?id=123 @requestParam String id 取问号后的参数

//rest风格 @PathVariable 取地址里的参数

//rest风格 取地址里的参数
	@RequestMapping(value="/view/{id}",method=RequestMethod.GET)
	public String view(@PathVariable String id,Model model){
		model.addAttribute(map.get(id));
		return "user/view";
	}


server.xml

URIEncoding="urf-8"

useBodyEncodingForURI="TRUE"


<!--处理字符编码的filter-->
  <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
  </init-param>
  </filter>
  
  <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值