1.@Component 将一个类作为实体类放入Spring容器中,
之后在spring 配置文件里面写一句这个
<context:component-scan base-package="com.hanqi.dao" />
2.@Repository 将一个类作为业务逻辑处理层放入Spring
3.@Controller 注释定义该类作为一个 Spring MVC 控制器 ,@RequestMapping 注释用于映射 URL 到整个类或一个特定的处理方法。
testController
/*DispatcherServlet 发送请求到控制器中执行特定的功能*/
@Controller /* @Controller 注释定义该类作为一个 Spring MVC 控制器*/
public class TestController {
@RequestMapping("/helloworld2")
/*第一次使用的 @RequestMapping 表明在该控制器中处理的所有方法都是相对于 /helloworld2 路径的*/
public String hello() {
return "success";
}
}
springMvc.xml配置文件
<context:component-scan base-package="com.hanqi.controller.TestController"></context:component-scan> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="suffix" value=".jsp"></property> <!-- 后缀名 --> <property name="prefix" value="WEB-INF/page"></property> <!-- 前缀名 --> </bean>
4.@Autowired 注释对在哪里和如何完成自动连接提供了更多的细微的控制。
@Autowired 注释可以在 setter 方法中被用于自动连接 bean,就像 @Autowired 注释,容器,一个属性或者任意命名的可能带有多个参数的方法。
属性中的 @Autowired
你可以在属性中使用 @Autowired 注释来除去 setter 方法。当时使用 为自动连接属性传递的时候,Spring 会将这些传递过来的值或者引用自动分配给那些属性。
TextEditor.java
public class TextEditor {
@Autowired
private SpellChecker spellChecker;
public TextEditor() {
System.out.println("Inside TextEditor constructor." );
}
public SpellChecker getSpellChecker( ){
return spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}
Beans.xml
<context:annotation-config/> <!-- Definition for textEditor bean --> <bean id="textEditor" class="com.tutorialspoint.TextEditor"> </bean> <!-- Definition for spellChecker bean --> <bean id="spellChecker" class="com.tutorialspoint.SpellChecker"> </bean>
5.@RequestParam 如果前台传来的参数,后台接收不一致的话,在你自己写的名字前面加一个注解
@RequestMapping("/helloworld2")
public ModelAndView helloWorld(
ModelAndView mav, //自动填充的参数,而不是手动输入的,返回一个视图层对象
@RequestParam("aabbcc")String username) {
//如果前台传来的参数,后台接收不一致的话,在你自己写的名字前面加一个注解@RequestParam
// ModelAndView mav = new ModelAndView(); 暂且不用了
System.out.println(username);
AppUser user = new AppUser();
user.setRealname("超级管理员2");
mav.addObject("currentUser", user); // 相当于request.setAttribute();
mav.setViewName("success"); // request.getServletDispatcher........ 请求转发
return mav;
}
6.@PathVariable 动态跳转的解析器
//有好几个页面,只要在地址栏里面输入不同的地址,就可以实现不同页面的跳转
@RequestMapping("test/{cpath}") //test定义的是请求,{}里面是传进去的一个参数,给path
public String testDynaicParam(@PathVariable("cpath")String path) {//动态跳转的解析器
System.out.println(path);
return path;
}
7.@SessionAttributes sessionAttribute注解只能写在类上
代表的是将当前controller类中某一个Model类中的属性添加到session对象中
1.默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。
2.@SessionAttributes 参数类型
1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中
3、value:其实和names是一样的。
@SessionAttributes(value={"names"},types={Integer.class})
controller 页面
@SessionAttributes(value={"names"},types={Integer.class})
2 @Controller
3 public class Test {
4
5 @RequestMapping("/test")
6 public String test(Map<String,Object> map){
7 map.put("names", Arrays.asList("caoyc","zhh","cjx"));
8 map.put("age", 18);
9 return "hello";
10 }
11 }
JSP页面
、request中names:${requestScope.names}<br/>
2 2、request中age:${requestScope.age}<br/>
3 <hr/>
4 3、session中names:${sessionScope.names }<br/>
5 4、session中age:${sessionScope.age }<br/>
打印出来

ModelAndView作用:
1)ModelAndView 用于后台与前端页面交互;
2)可以用于重定向与转发到指定页面,
3)可以保存数据然后渲染到页面
@Controller
@SessionAttributes("user1")
@RequestMapping(value="/testController") //默认的前面有一个value
public class TestController {
@RequestMapping("/test7")
public ModelAndView test7(ModelAndView mav) {
mav.addObject("user1", "aaaa"); //相当于request.setAttribute();
mav.setViewName("page/success"); // request.getServletDispatcher........ 请求转发
return mav;
}
}
8.@ResponseBody 将方法的返回值直接作为结果返回回去,通常用来做ajax参数的传递
@Controller
@RequestMapping(value="/testController")
public class TestController {
@ResponseBody
@RequestMapping("/test8") //@ResponseBody 将方法的返回值直接作为结果返回回去,通常用来做ajax参数的传递
public String test8(String username, String password) {
StringBuffer buffer = new StringBuffer("{"success":");
if("admin".equals(username) && "123".equals(password)) {
buffer.append("true}");
} else {
buffer.append("false}");
}
return buffer.toString();
}
}
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(function() {
$("#btn").click(function() {
var f = $("#formData").serializeArray();
$.ajax({
type:"post",
url:"testController/test8.form",
data:f,
dataType:"json",
success:function(data) {
console.log(data);
},
error:function(msg) {
alert(msg.responseText);
}
});
});
});
</script>
<body>
<a id="btn" href="#">测试链接8</a><br>
</body>
9.@ModelAttribute 注解只支持一个属性
@Controller
@RequestMapping("/modelAttr")
public class TestModelAttribute {
/*
* 1, 单独修饰方法 含有@ModelAttribute注解的方法会优先于其他方法执行
*/
@ModelAttribute("uname")
public String getUsername(String username) {
System.out.println(1);
/**
* 相当于request.setAttribute("uname", username);
*/
return username;
}
@RequestMapping("/test1")
public String test1(String username) {
System.out.println(2);
return "page/success";
}
/*
* 2, 与@RequestMapping同时修饰一个方法
* 当@ModelAttribute和@RequestMapping同时修饰一个方法的时候
* 返回值不再作为视图层的地址, 这个方法执行完毕之后,
* 相当于运行了一行 request.setAttribute("param1","page/success");
* 同时, RequestMapping中的url作为视图层
*/
@ModelAttribute("param1")
@RequestMapping("/test2")
public String test2() {
return "page/success";
}
/*
* 3, 修饰方法中的参数,只能修改为空的成员变量
*/
@ModelAttribute("param2")
public Dept getDept(Dept dept) {
System.out.println("------------" + dept.getDname());
dept.setDname("修改后的值");
dept.setLoc("地址");
System.out.println("+++" + dept);
return dept;
}
@RequestMapping("/test3")
public String test3(@ModelAttribute("param2") Dept dept) {
System.out.println("==============" + dept);
return "page/success";
}
//参数是必须要有的,如果前台没有传来数据的话,就采用默认值
@RequestMapping("/test4")
public String test3(
@RequestParam(
value="str2",
defaultValue="jahsgdfjhsagdjsa",
required=false)
String str) {
System.out.println(str);
return "page/success";
}
}
10.request.getContextPath()
<%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径。
request.getContextPath()应该是得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串。如果项目为abc, <%=request.getContextPath()% > 将得到abc,服务器端的路径则会自动加上
1.request.getScheme()可以返回当前页面使用的协议;默认返回http,SSL时返回https;
2. request.getServerName()可以返回当前页面所在的服务器的名字;
3.equest.getServerPort()可以返回当前页面所在的服务器使用的端口,就是项目在服务器上发布的 端口,或者在本地tomcat容器运行时发布的端口
4.request.getContextPath()可以返回当前页面所在的应用的名字;
11.@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML
数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
其他知识点
testcontrller.java
@Controller
@SessionAttributes("user1")
@RequestMapping(value="/testController") //默认的前面有一个value
public class TestController {
// 现在表示这个方法只接收POST方式发送的请求
@RequestMapping(value="/test1", method=RequestMethod.POST) /*传多个参数时,用逗号隔开,requestmethod是枚举类型
不去定义的话,post方式,get方式默认的都是可以的,超链接都是get方式*/
public String test1() {
return "page/success";
}
@RequestMapping("/test2")
public String test2(AppUser user) { // 自动封装一个实体类
// System.out.println(username+": "+password);
System.out.println(user);
return "page/success";
}
@RequestMapping("/test3")
public String test3(String username, int password) { //如果password在前台传来的是数字,但他是字符串型的,依然可以接收
// System.out.println(username+": "+password);
System.out.println(password);
return "page/success";
}
@RequestMapping("/test4")
public String test4(@DateTimeFormat(pattern="yyyy-MM-dd") //日期的处理
Date birthday) {
System.out.println(birthday);
return "page/success";
}
@RequestMapping("/test5")
public String test5(AppUser user) { //前台传进来的日期格式化,在类里面进行注解来处理
System.out.println(user);
return "page/success";
}
@RequestMapping("/test6")
public String test6(AppUser user) { //想要实现的就是同时接收到两个类里面的内容
System.out.println(user);
return "page/success";
}
}
index.jsp
<body> <a href="modelAttr/test1.form">测试链接1</a><br> <a href="modelAttr/test2.form">测试链接2</a><br> <a href="modelAttr/test3.form?dname=SAIL">测试链接3</a><br> <a href="modelAttr/test4.form">测试链接4</a><br> <hr> <a href="testController/test1.form">测试链接</a><br> <a href="testController/test2.form?username=admin&password=222">测试链接2</a><br> <a href="testController/test3.form?password=222">测试链接3</a><br> <a href="testController/test4.form?birthday=2017-12-12">测试链接4</a><br> <form action="testController/test5.form" method="post"> username: <input name="username" /><br> password: <input name="password" /><br> hiredate: <input type="date" name="hiredate" /><br> 提交: <input type="submit" value="Submit" /><br> </form> <br> <form action="testController/test6.form" method="post"> <--!想要实现的就是同时接收到两个类里面的内容--> username: <input name="username" /><br> password: <input name="password" /><br> hiredate: <input type="date" name="hiredate" /><br> dname: <input name="dept.dname" /><br> <!--APPuser类里面的dept变量,直接可以点出来那个Dept类里面的变量--> 提交: <input type="submit" value="Submit" /><br> </form> <br> <a href="testController/test7.form">测试链接7</a><br> <a id="btn" href="#">测试链接8</a><br> <form id="formData"> username: <input name="username" /><br> password: <input name="password" /><br> </form> </body>
Appuser.java
private String username;
private String password;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date hiredate; //如果用表单方式提交的话,又是传进去的实体类,就需要进行一下日期的格式转换了
private Dept dept; //还有一个部门类
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
public AppUser(String username, String password) {
super();
this.username = username;
this.password = password;
}
Dept.java
private String dname;
private String loc;
public Dept() {
super();
}
public Dept(String dname) {
super();
this.dname = dname;
}
success.jsp 访问成功页面
<body>
${uname }
<hr>
<h1>访问成功的页面 !</h1>
${requestScope.user1 }<br> <!--作用域 @SessionAttributes -->
${sessionScope.user1 }<br>
</body>