离离原上草,一岁一枯荣
文章目录
前言
这东西比我想象的要多得多,fk
一、SpringMVC
它是基于MVC开发模式的框架,用来优化控制器,它是Spring家族的一员,
它也具备IOC和AOP
所有的web应用都是基于MVC开发
M:模型层,包含实体类,业务逻辑层,数据访问层
V:视图层,html,javaScript,vue等,用来呈现数据
C:控制器,它是用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是其组件
二、SpringMVC框架的优点
- 轻量级,基于MVC的框架
- 易于上手,容易理解,功能强大
- 它具备IOC和AOP
- 完全基于注解开发
三、基于注解的SpringMVC框架开发的步骤
- 新建项目,选择webapp模板
- 修改目录,添加test,java,resources并修改目录属性
- 修改pom文件,添加SpringMVC的依赖,添加servlet的依赖
- 添加springmvc.xml配置文件,指定包扫描,添加视图解析器
- 删除web.xml文件,新建web.xml
- 在web.xml中注册SpringMVC框架(所有的web请求都是基于servlet的)
- 在webapp目录下新建admin目录,在admin目录下新建main.jsp页面,删除index.jsp页面,并新建,发送请求给服务器
- 开发控制器(Servlet),它是一个普通的类
- 添加tomcat进行测试功能
四、web请求
web请求执行流程
index.jsp《= = =》 DispatcherServlet(核心处理器)《 = = =》SpringMVC的处理器是一个普通的方法
one.jsp 《 === 》 DispatcherServlet(核心处理器)《 = = =》SpringMVC的处理器是一个普通的方法
响应的分发和返回都是DispatcherServlet来做
DispatcherServlet要在web.xml文件中注册才可用。
五、@RequestMapping
此注解就是来映射服务器访问的路径。
- 此注解可加在方法上,是为此方法注册一个可以访问的名称(路径)
@RequestMapping("/demo")
public String demo(){
System.out.println("服务器被访问到了....");
return "main";//可以直接跳到/admin/main.jsp页面上
}
<a href="${pageContext.request.contextPath}/demo.action">访问服务器</a>
以上a标签中.action并不是后缀的意思,只是一个标识,标识这样的请求才会被拦截
- 此注解可以加在类上,相当于是包名(虚拟路径),主要是区分不同类中相同的action的名称
@RequestMapping("/user")
public class DemoAction1 {...}
<a href="${pageContext.request.contextPath}/user/demo.action">
- 此注解可区分get请求和post请求
@Controller
public class ReqAction {
@RequestMapping(value = "/req",method = RequestMethod.GET)
public String req(){
System.out.println("我是处理get请求的....");
return "main";
}
@RequestMapping(value = "/req",method = RequestMethod.POST)
public String req1(){
System.out.println("我是处理post请求的....");
return "main";
}
}
六、五种数据提交方式的优化(SpringMVC框架)
- 单个提交数据
页面:
<form action="${pageContext.request.contextPath}/one.action">
姓名:<input name="myName"> <br>
年龄:<input name="myAge"> <br>
</form>
action:
@RequestMapping("one")
public String one(String myName,int myAge){
System.out.println("myName="+myName+",myAge="+(myAge+100));
return "main";
}
2、对象封装提交数据
在提交请求中,保证请求参数的名称与实体类中成员变量的名称一致,则可以自动创建对象,则可以自动提交数据,自动类型转换,自动封装数据到对象中
实体类:
public class Users {
private String uName;
private int uAge;
...}
页面:
<h1>2.对象封装数据提交</h1>
<form action="${pageContext.request.contextPath}/two.action" method="post">
姓名:<input name="uName"> <br>
年龄:<input name="uAge"> <br>
<input type="submit" value="提交">
</form>
action:
@RequestMapping("/two")
public String two(Users users){
System.out.println(users);
return "main";
}
- 动态占位符提交
仅限于超链接或地址栏提交数据。它是一杠一值,一杠一大括号,使用注解@PathVariable来解析
/**
* <a href="${pageContext.request.contextPath}/three/张三/22.action?">动态提交</a>
*@RequestMapping("/three/{name}/{age}")中的name和age相当于行参,是什么都可以
*/
//@RequestMapping("/three/{name}/{age}")此种情况@PathVariable后面不用跟东西
@RequestMapping("/three/{uname}/{uage}")//此为第二种情况@PathVariable("uname")
public String three(
@PathVariable("uname")
String name,
@PathVariable("uage")
int age){
System.out.println("myName="+name+",myAge="+(age+100));
return "main";
}
- 映射名称不一致
提交请求参数与action方法的形参的名称不一致,使用注解@RequestParam来解析
/**
* 姓名:<input name="uName"> <br>
* 年龄:<input name="uAge"> <br>
* @param uname
* @param uage
* @return
*/
@RequestMapping("/four")
public String four(
@RequestParam("uName")//专门用来解决名称不一致
String uname,
@RequestParam("uAge")
int uage){
System.out.println("myName="+uname+",myAge="+(uage+100));
return "main";
}
- 手工提取
/**
* 姓名:<input name="uName"> <br>
* 年龄:<input name="uAge"> <br>
* @return
*/
@RequestMapping("/five")
public String five(HttpServletRequest request){
String name = request.getParameter("uName");
int age = Integer.parseInt(request.getParameter("uAge"));
System.out.println("myName="+name+",myAge="+(age+100));
return "main";
}
总结
restful风格
${pageContext.request.contextPath}:
${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%> 。
也就是取出部署的应用程序名或者是当前的项目名称。