package com.sise.controller;
import com.sise.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.annotation.RequestScope;
import java.lang.reflect.Method;
@Controller()
@RequestMapping("/testController")
public class TestController {
@RequestMapping("/hello")
public String sayHello(){
System.out.println("TestController---sayHello");
return "success";
}
/*@RequestMapping的作用
* value:用于指定请求的URL。
* 它和path属性的作用是一样的。
* method:用于指定请求的方式。
* params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样。
* 例如:params = {"accountName"},表示请求参数必须有accountName
* params = {"moeny!100"},表示请求参数中money不能是100。
*
* saveUsername(User user)-->
* 办法里面的参数可以javabean,里面name变量的值跟属性一模一样,区分大小写
* 姓名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
金额:<input type="text" name="money" /><br/>
*
* 或者Map,list,里面name变量的值跟属性一模一样,区分大小写
* 用户姓名:<input type="text" name="list[0].uname" /><br/>
用户年龄:<input type="text" name="list[0].age" /><br/>
用户姓名:<input type="text" name="map['one'].uname" /><br/>
用户年龄:<input type="text" name="map['one'].age" /><br/>
*
* 也可以是User类中的Acount类对象acount,里面name变量的值跟属性一模一样,区分大小写
* 用户姓名:<input type="text" name="user.uname" /><br/>
用户年龄:<input type="text" name="user.age" /><br/>
*
* headers:用于指定限制请求消息头的条件。
*
*
* */
@RequestMapping(value = "/saveUsername",method = RequestMethod.GET,params = {"user"})
/* @RequestBody
* 作用:
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
* 必须是POST请求才有请求体,GET请求体为null,
* 所谓的请求体就是访问链接url中的请求参数----》key=value&key=value...
get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
为 false,get 请求得到是 null。
*/
/*
@PathVariable
作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{id}")//链接地址和RequestMapping格式一样
public String usePathVariable(@PathVariable("id") Integer uid){
也就是将id=100的值赋值给uid
System.out.println(id);100
return "success";
} */
/*
@RequestHeader
作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
注:
在实际开发中一般不怎么用。
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}
*/
/*
@RequestParam
作用:
把请求中指定名称的参数给控制器中的形参赋值。
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
<a href="springmvc/useRequestParam?name=test">requestParam 注解</a>
public String useRequestParam(@RequestParam("name")String username,
属性: @RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
因为value="age",required=false,所以age有没有值都正常,如果改成true,则出错,因为age为空
}
运行
*/
/*
@ModelAttribute
作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("执行了控制器的方法"+user.getUsername());
return "success";
}
输出内容--------》执行了 showModel 方法"+user.getUsername()
执行了控制器的方法"+user.getUsername()
也就是@ModelAttribute作用在showModel办法上就先执行showModel
在执行testModelAttribute这个办法
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
User中有username,age,data,
一个表单中,如果注册日期data不可以修改,那么你在改变该表数据username,age中
就可以利用这个ModelAttribute放在一个办法前,来获取原来数据库表User的值,然后授予在传输数据的(User user),
user中,那么user中就有自己原来的注册时间了
它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
一般修饰没有返回值的办法都会将相关的值添加在map结构中,再利用
@ModelAttribute
public void showModel(String username,Map<String,User> map) {
//模拟去数据库查询
User user = findUserByName(username);
System.out.println("执行了 showModel 方法"+user);
map.put("abc",user);添加user对象后,再@ModelAttribute("abc")User user,通过key查出对象再赋值
}
@RequestMapping("/updateUser")
public String testModelAttribute(@ModelAttribute("abc")User user) {
System.out.println("控制器中处理请求的方法:修改用户:"+user);
return "success";
}
*/
/*
@SessionAttribute
作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。
<!-- SessionAttribute 注解的使用 -->
<a href="springmvc/testPut">存入 SessionAttribute</a>
<hr/>
<a href="springmvc/testGet">取出 SessionAttribute</a>
<hr/>
<a href="springmvc/testClean">清除 SessionAttribute</a>
@RequestMapping("/testPut")
public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
*/
/*
*
*共同点:
它们都是表现层框架,都是基于 MVC 模型编写的。
它们的底层都离不开原始 ServletAPI。
它们处理请求的机制都是一个核心控制器。
区别:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所
以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
(JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注
解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提
升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
*
*
*
*
*
*
*3.1.4.4 请求参数乱码问题,就是表单中有中文,再post形式就会出现乱码??
* 我们就需要再web.xml设置过滤器
* get形式不出现中文乱码问题
*
* post 请求方式:
在 web.xml 中配置一个过滤器
<!-- 配置 springMVC 编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
*
* <!-- 设置过滤器中的属性值 就是如果出现乱码问题,直接转换成utf-8字符集,就不会乱码了-->
<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>
在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>
*/
/*
3.2.1 自定义类型转换器
简单点想把目标字符集转换成日期
,假如系统能识别 2018-10-05,自动转换成日期Date格式
但是系统无法识别 2018/10/05,那么就不会转换成日期
那么我们就要 自己定义一个类型转换器,如何将这样的字符集转换成date
<!-- 特殊情况之:类型转换问题 -->
<a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a>
public class StringToDateConverter implements Converter<String, Date> {
//第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。
//S:表示接受的类型,T:表示目标类型
用于把 String 类型转成日期类型
@Override
public Date convert(String source) {
DateFormat format = null;
try {
if(StringUtils.isEmpty(source)) {
throw new NullPointerException("请输入要转换的日期");
}
format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(source);
return date;
} catch (Exception e) {
throw new RuntimeException("输入日期有误");
}
}
}
再到spring.xml配置自定义类型转换器
spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>---》 <set> </set>这个标签也可以,就是将下面的自定义类型转换器添加到服务中
<!-- 配置自定义类型转换器 -->
<bean class="com.itheima.web.converter.StringToDateConverter"></bean>
</array>
</property>
</bean>
第三步:在 annotation-driven 标签中引用配置的类型转换服务
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
conversion-service="converterService"></mvc:annotation-driven>
*/
/*
Servlet原生的API
<a href="param/testServlet">Servlet原生的API</a>
* @RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){}
*
*
* */
@RequestScope
public String saveUsername(User user){
System.out.println("TestController---saveU121233sername");
System.out.println(user);
return "success";
}
}
/*
* @Controller
@RequestMapping(value = "/commoms")
public class CommomsNodes {
@RequestMapping(path = "/testRequestmapping", params = {"username", "password", "age"}, method = {RequestMethod.GET, RequestMethod.POST})
public String testRequestmapping(@RequestBody String body) {
System.out.println(body);
return "success";
}
@RequestMapping(path = "/testRequestBody")
//必须有请求体(也就是带有请求参数),而且get请求不可以
public String testRequestBody(@RequestBody String body) {
System.out.println(body);
return "success";
}
@RequestMapping(path = "/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
System.out.println(header);
return "success";
}
@RequestMapping(path = "/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String id) {
System.out.println(id);
return "success";
}
@RequestMapping(path = "/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(value = "sid") String id) {
System.out.println(id);
return "success";
}
@RequestMapping(path = "/testModelAttribute1")
public String testModelAttribute1(@ModelAttribute(value = "userbean") Userbean userbean) {
System.out.println(userbean);
return "success";
}
@RequestMapping(path = "/testModelAttribute2")
public String testModelAttribute2(Userbean userbean) {
System.out.println(userbean);
return "success";
}
@ModelAttribute
public Userbean saveModelAttibute() {
Userbean userbean = new Userbean();
userbean.setAddress("雷州返回Userbean");
userbean.setId(1);
userbean.setUsername("wangcx");
return userbean;
}
//@ModelAttribute
public void saveModelAttibute(Map<String, Userbean> map) {
Userbean userbean = new Userbean();
userbean.setAddress("雷州返回void");
userbean.setId(1);
userbean.setUsername("wangcx");
map.put("userbean", userbean);
}
@RequestMapping("/testServletApiMap")
public void testServletApiMap(HttpServletRequest request, HttpServletResponse response) {
String method = request.getMethod();
System.out.println(method);
}
@RequestMapping("/testAddModel")
public void testAddModel(Model model,HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
Userbean userbean = new Userbean();
userbean.setAddress("雷州testModel");
userbean.setId(1);
userbean.setUsername("wangcx");
model.addAttribute(userbean);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/pages/success.jsp");
System.out.println("testforward");
requestDispatcher.forward(request,response);
}
@RequestMapping("/testGetModel")
//当办法为void,如果没有转发或者重定向到别的页面,它就会自动跳转到testGetModel.jsp,也就是设置事什么就是什么
public void testGetModel(ModelMap modelMap) {
Userbean userbean = (Userbean) modelMap.get("userbean");
System.out.println(userbean);
}
@RequestMapping("/testdeleteModel")
public void testdeleteModel(SessionStatus status) {
status.setComplete();
}
*
*
* */
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!
常见资源合集和破解 fmvvvteih...