SpringMVC
一:
1:SpringMvc基本步骤
- 配置
web.xml
文件
-
创建
springMVC-servlet.xml
并配置—主要配置以下内容<!--开启注解--> <mvc:annotation-driven/> <!--扫描--> <context:component-scan base-package="com.shiro.test.mvc.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置视图前缀--> <property name="prefix" value="/WEB-INF/pages"/> <!--配置视图后缀--> <property name="suffix" value=".jsp"/> </bean>
-
创建
Controller
@Controller
:通知spring
需要被扫描的controller
类,得到DispatcherServlet
的解析@RequestMapping(value = "gologin.html")
:DispatcherServlet
根据这个配置中的url地址决定调用哪个方法,方法的返回值类型如果是字符串,说明返回的是一个视图
@Controller public class LoginController { @RequestMapping(value = "gologin.html") public String goLogin() { // 根据springMVC-servlet.xml的视图解析器,所得的完整路径为:/WEB-INF/Pages/gologin.jsp return "gologin"; }
2:SpringMVC的常用注解
2.1:@RequestMapping
-
可以加在类名或方法名面前
-
或同时加在两个位置
-
最终的路径是两个位置的路径的组合
-
value是默认的名称,可以省略
@Controller @RequestMapping("/hello") // 访问路径为:*/hello/world public class LoginController { @RequestMapping("/world") public String goLogin() { return "helloworld"; }
2.2:@RequestMapping
的请求方式
Get
:@RequestMapping(value = "gologin.html", method = RequestMethod.Get)
Post
:@RequestMapping(value = "gologin.html", method = RequestMethod.Post)
- 如果不指定
method
,可以接受任何类型的请求 - 如果请求方式不正确,会报出405错误
2.3:处理请求参数
-
自动的表单参数匹配:表单中控件的
name
的值,和controller
层方法的参数名一致,则匹配表单的controller
和form
。<form action="/login.html" method="post"> 用户名:<input type="text" name="username"/> 密码:<input type="password" name="password"/> <input type="submit" value="登录"/>${error} </form>
// 提交 @RequestMapping(value = "/login.html", method = RequestMethod.Post) public String login(String username, String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "redirect:world"; }
-
注解形式的参数匹配:当表单中控件的
name
和controller
方法中参数名不一致时,使用@RequestParam()
注解<form action="/login.html" method="post"> 用户名:<input type="text" name="relname"/> 密码:<input type="password" name="password"/> <input type="submit" value="登录"/>${error} </form>
// 提交 @RequestMapping(value = "/login.html", method = RequestMethod.Post) public String login(@RequestParam(value = "relname") String username, String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "redirect:world"; }
-
defaultValue:属性设置上参数的默认值
@RequestMapping(value = "/login.html", method = RequestMethod.Post) public String login(@RequestParam(value = "", defaultValue = "") String username, String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "redirect:world"; }
-
required:设置参数是否可选
@RequestMapping(value = "/login.html", method = RequestMethod.Post) public String login(@RequestParam(value = "", required = false) String username, String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "redirect:world"; }
2.4:请求转发和跳转
- 请求转发:
return "视图名称"
- 请求跳转:
return "redirect: controller的mapping地址"
2.5:解决Post乱码
在web.xml
中做如下配置
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.6:解决Get乱码的方案
乱码和tomcat
版本有关联
-
修改
server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
-
如果URL还乱码,则
String message = URLEncoder.encode("用户名或密码错误","UTF-8")
2.7:@RequestHeader
:获取请求头中的信息
@RequestMapping(value = "/login.html")
public String login(@RequestParamHeader(value="Accept-Language") String header) {
System.out.println(header);
return "redirect:world";
}
2.8:请求参数和请求头表达式
通过表达式精确映射要求 ·
params
和headers
支持简单的表达式params1
:表示请求必须包含名为params1
的请求参数!params1
:表示请求不能包含名为params1
的请求参数params1 != value1
:表示请求包含名为params1
的请求参数,但其值不能为value1
{"params1=value1","params2"}
:请求必须包含名为params1
和params2
的两个请求参数,且params1
的参数值必须为value
。
@RequestMapping(value = "/login.html", params = {"username","age!=10"})
public String login(String username, String age) {
System.out.println(username + "" + age);
return "redirect:world";
}
2.9:ant
风格的路径
Ant
风格资源地址支持三种匹配符?
:匹配文件名中的一个字符*
:匹配文件名中的任意字符**
:匹配多层路径
@RequestMapping
还支持Ant
风格的URL
2.10:使用pojo
将数据从页面传递到controller
<form action="save" method="get">
<label for="">用户名:<input type="text" name="username"/></label>
<label for="">密码:<input type="text" name="password"/></label>
<button>保存</button>
</form>
@RequestMapping(value = "/save")
public String save(User user) {
System.out.println(user);
return "success";
}
// pojo
public class User {
private String username;
private String password;
}
2.11:将数据从controller
传递到页面
<form action="edit" method="get">
<label for="">用户名:<input type="text" name="username" value=${user.username}/></label>
<label for="">密码:<input type="text" name="password" value=${user.password}/></label>
<button>保存</button>
</form>
// 方法一:ModelAndView
@RequestMApping(value = "/edit")
public ModelAndView edit() {
User user = new User();
user.setUsername("aime");
user.setPassword("123");
ModelAndView mv = new ModelAndView();
mv.setViewName("");
mv.addObject("user",user);
return mv;
}
// 方法二:使用Map
@RequestMApping(value = "/edit")
public String edit(Map<String, Object> map) {
User user = new User();
user.setUsername("aime");
user.setPassword("123");
map.put("user", user);
return user/form;
}
二
1:Rest:
即Representational State Transfer
,表现层状态转换,是目前最流行的一种互联网软件架构。
1.1:具体说,就是HTTP
协议里面。四个表示操作方式的动词
- GET:用来获取资源
- POST:用来新建资源
- PUT:用来更新资源
- DELETE:用来删除资源
1.2:HiddenHttpMethodFilter
:
浏览器form表单只支持GET和POST请求,不支持DELETE和PUT请求
Spring
添加了一个过滤器,可以将这些请求转换为标准的http方法,支持GET,POST,PUT,DELETE
2:创建Restful
应用程序
2.1:配置过滤器
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-mapping>HiddenHttpMethodFilter</filter-mapping>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.2:jsp
页面
<form action="1" method="post" id="deleteForm">
<input type="text" name="_method" value="DELETE"/>
<button>DELETE提交</button>
</form>
2.3:Controller
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String delete() {
//执行删除
System.out.println("delete");
return "redirct:/user/list";
}