SpringMVC入门例子
来源:互联网 发布:sim900a调试软件 编辑:程序博客网 时间:2024/05/22 09:47
SpringMVC框架介绍
Spring框架提供了构造Web应用程序的全能MVC模块。Spring MVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行制定。是一个标准的MVC框架。
那你猜一猜哪一部分应该是哪一部分?
SpringMVC框架图
SpringMVC接口解释
DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
HandlerMapping接口:
能够完成客户请求到Controller映射。
Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
SpringMVC运行原理
1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3. DispatcherServlet将请求提交到Controller
4. Controller调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6. 视图负责将结果显示到客户端
线程安全由于Spring MVC默认是Singleton的,所以会产生一个潜在的安全隐患。根本核心是instance变量保持状态的问题。这个问题有两种解决办法:a) 在控制器中不使用实例变量b) 将控制器的作用域从单例改为原型这两种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
SpringMVC运行实例
Account类:
- package com.pb.entity;
- public class Account {
- private String cardNo;
- private String password;
- private float balance;
- public String getCardNo() {
- return cardNo;
- }
- public void setCardNo(String cardNo) {
- this.cardNo = cardNo;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public float getBalance() {
- return balance;
- }
- public void setBalance(float balance) {
- this.balance = balance;
- }
- }
LoginController类:继承AbstractController类或者实现Controller接口都可以
- package com.pb.web.controller;
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.AbstractController;
- import com.pb.entity.Account;
- public class LoginController extends AbstractController {
- private String successView;
- private String failView;//这两个参数是返回值传给applicationContext.xml,进行页面分配
- public String getSuccessView() {
- return successView;
- }
- public void setSuccessView(String successView) {
- this.successView = successView;
- }
- public String getFailView() {
- return failView;
- }
- public void setFailView(String failView) {
- this.failView = failView;
- }
- @Override
- protected ModelAndView handleRequestInternal(HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- // TODO Auto-generated method stub
- String cardNo=request.getParameter("cardNo");
- String password=request.getParameter("password");
- Account account =getAccount(cardNo,password);
- Map<String ,Object> model=new HashMap<String,Object>();
- if(account !=null){
- model.put("account", account);
- return new ModelAndView(getSuccessView(),model);
- }else{
- model.put("error", "卡号和密码不正确");
- return new ModelAndView(getFailView(),model);
- }
- }//本应该这个方法写在模型层,这地方直接给放在了逻辑层这个地方偷懒了。
- public Account getAccount(String cardNo,String password){
- if(cardNo.equals("123")&&password.equals("123")){
- Account account =new Account();
- account.setCardNo(cardNo);
- account.setBalance(88.8f);
- return account;
- }else{
- return null;
- }
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
- <bean id="loginController" class="com.pb.web.controller.LoginController">
- <property name="successView" value="showAccount"></property>
- <property name="failView" value="login"></property>
- </bean>
- <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/login.do">loginController</prop>
- </props>
- </property>
- </bean>
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/"></property>
- <property name="suffix" value=".jsp"></property>
- </bean>
- </beans>
注:以下
<bean id="loginController" class="org.hzy.actions.LoginController"> <property name="successView" value="showAccount"></property> <!-- <property name="successView" value="/showAccount.jsp"></property> --> <property name="failView" value="login"></property> </bean> <!--配置视图--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- <property name="viewClass"> --><!-- <value>org.springframework.web.servlet.view.InternalResourceView</value> --><!-- </property> --><!-- 默认的viewClass就是这个类 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> <!-- 当这里配置了prefix和suffix时,对应的是在根目录下,以Jsp结尾的 --> </bean>
Jsp页面:
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!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=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- <a href="login.jsp">进入</a>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!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=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- ${error }
- <form action="login.do" method="post">
- 账号登陆<br>
- <hr>
- 卡号:<input type="text" name="cardNo"><br>
- 密码:<input type="text" name="password"><br>
- <input type="submit" value="登陆">
- </form>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=GB18030"
- pageEncoding="GB18030"%>
- <!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=GB18030">
- <title>Insert title here</title>
- </head>
- <body>
- 账户信息<br>
- 卡号:${account.cardNo }<br>
- 密码:${account.password }<br>
- 钱数:${account.balance }<br>
- </body>
- </html>
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:javaee="http://java.sun.com/xml/ns/javaee"
- xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>Dispatcher</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext.xml</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>Dispatcher</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- </web-app>
上面中servlet中不给参数的话自动查找的xml名称格式是 <servlet-name>-servlet.xml, 例如:dispatcherServlet-servlet.xml,给定<init-param>指定applicationContext.xml
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- classpath:applicationContext.xml
- </param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
工程原码:原码
SpringMVC总结
以上就是我理解的Spring MVC可能不够深刻。其实对于任何的框架来说,一个框架是一个可复用设计,框架的最大的好处就是复用。每个框架都有存在的理由,那Spring MVC的理由是什么呢?
只有各个框架之间彼此了解他们之间的优缺点,使用场合,使用原理,才能让我们的更快的成长。
要想看各个框架之间的PK敬请关注:
常用WEB框架Struts1、Struts2和Spring MVC大PK(一)
常用WEB框架Struts1、Struts2和Spring MVC大PK(二)
想要了解更多Spring请从(Spring程序员的春天)开始
- SpringMVC基础入门 springmvc例子
- SpringMVC入门例子
- springmvc入门小例子
- SpringMVC入门例子
- 1. SpringMVC 入门例子
- springmvc入门例子(AbstractCommandController)
- eclipse+springmvc入门小例子
- SpringMVC第一个入门例子
- 秀外慧中的springMVC(一)---springMVC的xml配置入门例子
- SpringMVC的两个简单入门的例子(-)
- SpringMVC入门小例子——表单提交
- SpringMVC例子
- springMVC例子
- SpringMVC-----2、SpringMVC入门
- springMVC-springMVC入门实例
- SpringMVC入门(搭建SpringMVC)
- springMvc入门--初识springMvc
- 【SpringMVC】SpringMVC入门
- 杂七杂八
- AT命令和multiplexer protocol && Linux和android平台的GSM/GPRS模块测试
- POJ 3349 第一道哈希
- sql生成(查询数据的存储过程)代码的存储过程
- 有上下界限制的网络流
- SpringMVC入门例子
- 数独(Sudoku)求解程序
- sql生成(c#调用存储过程返回数据表)代码的存储过程
- Objective-c定义静态变量
- sql查询表的结构的存储过程
- java语言是解释型语言---一道题的详解
- 斯坦佛编程教程-Unix编程工具(四)
- C#Excel导入SQLServer
- sql系统中的存储过程,从中可以找到查询各种信息的语句