struts1之简单mvc示例_动力节点Java学院整理

先看MVC模式流程图(其实MVC设计模式就是java中的model2。):

就像图上所标识的C层主要是Servlet层控制页面跳转,M层就是具体的业务处理逻辑,而JSP就是所谓的V层。MVC是有别于我们所说的三层,我们平常所说的三层是UI层、BLL层、DAL层,具体的区别如图:

从图上能看出来,JSP和Servlet构成了UI层,而Model层分成了BLL层和DAL层(也就是业务逻辑和数据持久层)。

从理论上认清了MVC设计模式之后,下面开始动手敲一个MVC设计模式示例代码:

JSP索引页面index.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>
 <form action="servlet/addUser.action" method="post">
  姓名:<input type="text" name="username" >
  <input type="submit" value="提交">
 </form> 

</body>
</html>

业务逻辑代码UserManager:

package com.bjpowernode.servlet; 

import java.util.ArrayList;
import java.util.List; 

public class UserManager { 

 public void addUser(String username){
  System.out.println("UserManager.addUsre()--->username:"+username);
 } 

 public void delUser(String username){
  System.out.println("UserManager.delUser()--->username:"+username);
 } 

 public void modifyUser(String username){
  System.out.println("UserManager.modifyUser()--->username"+username);
 } 

 public List queryUser(String username){
  System.out.println("UserManager.queryUser()--->username"+username);
  List userList=new ArrayList();
  userList.add("a");
  userList.add("b");
  userList.add("c");
  return userList;
 }
}

Servlet控制代码:

package com.bjpowernode.servlet; 

import java.io.IOException;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

public class TestServlet extends HttpServlet { 

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException { 

  String requestURI=request.getRequestURI();
  System.out.println("request="+requestURI);
  String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
  System.out.println("path="+path); 

  String username=request.getParameter("username");
  UserManager userManager=new UserManager();
  //userManager.addUser(username);
  String forward="";
  if("/servlet/delUser".equals(path)){
   userManager.delUser(username);
   forward="/del_success.jsp";
  }else if("/servlet/addUser".equals(path)){
   userManager.addUser(username);
   forward="/add_success.jsp";
  }else if("/servlet/modifyUser".equals(path)){
   userManager.modifyUser(username);
   forward="/modify_success.jsp";
  }else if("/servlet/queryUser".equals(path)){
   List userList=userManager.queryUser(username);
   request.setAttribute("userList", userList);
   forward="/query_success.jsp";
  }else{
   throw new RuntimeException("请求失败");
  }
  request.getRequestDispatcher(forward).forward(request, response); 

}

这个servlet代码主要实现的功能判断是那个页面请求服务器做那些操作,之后调用业务逻辑实现相应业务操作。

配置Servlet:

<?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/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <display-name>test_Servlet</display-name>
 <welcome-file-list>
 <welcome-file>index.html</welcome-file>
 <welcome-file>index.htm</welcome-file>
 <welcome-file>index.jsp</welcome-file>
 <welcome-file>default.html</welcome-file>
 <welcome-file>default.htm</welcome-file>
 <welcome-file>default.jsp</welcome-file>
 </welcome-file-list> 

 <servlet>
 <servlet-name>TestServlet</servlet-name>
 <servlet-class>com.cjq.servlet.TestServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>TestServlet</servlet-name>
 <url-pattern>*.action</url-pattern>
 </servlet-mapping> 

</web-app>

输出结果:

通过上面的示例已经对MVC设计模式有了初步的认识,其实这个示例是对Struts框架学习的基础,只有弄清楚了这个实例才能弄清楚Struts框架的实现原理和Struts框架使用。

那么我们怎么才能通过这个示例引入Struts框架呢?这个问题从IF-Eles开始。

首先我们看到了TestServlet中出现了许多if-else语句,这样是非常不稳定的,这样的程序是非常不灵活的,以后如果有变化,那么维护是非常差的;而且我们在if-else中出现了大量的字符串,这样在coding的时候会出现写错,这样无形中给调试带来了麻烦。所以去掉if-else成了我们重构的第一步,也是我们进行Struts框架学习的第一步。因为在TestServlet中出现了If-Else语句块,所以让程序变得不再灵活,让应付需求变化时变得笨拙。所以就承接上篇文章来重构一下TestServlet代码,主要是用继承多态来进一步对TestServlet进行重构。

下面进入重构阶段:

package com.bjpowernode.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {

 String requestURI=request.getRequestURI();
 System.out.println("request="+requestURI);
 String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
 System.out.println("path="+path);

 String username=request.getParameter("username");
 UserManager userManager=new UserManager();
 //userManager.addUser(username);
 String forward="";
 if("/servlet/delUser".equals(path)){
 userManager.delUser(username);
 forward="/del_success.jsp";
 }else if("/servlet/addUser".equals(path)){
 userManager.addUser(username);
 forward="/add_success.jsp";
 }else if("/servlet/modifyUser".equals(path)){
 userManager.modifyUser(username);
 forward="/modify_success.jsp";
 }else if("/servlet/queryUser".equals(path)){
 List userList=userManager.queryUser(username);
 request.setAttribute("userList", userList);
 forward="/query_success.jsp";
 }else{
 throw new RuntimeException("请求失败");
 }
 request.getRequestDispatcher(forward).forward(request, response);
  }
}

首先我们看到了在每个语句块中都出现了给forward赋值,其实也就是给页面跳转的路径赋值,针对每个请求路径判断来赋值跳转路径。另外每个IF-Else语句块中都有业务处理,我们要把这些业务处理分别放到类里面,让职责更加单

一,这样更加符合面向对象的思路。

就从这里我们开始重构,我们可以将这个跳转路径和业务逻辑封装起来。

既然封装,那么我们就抽象出来一个借口,主要完成一个方法,这个方法主要的功能就是要完成业务逻辑封装和路径跳转的返回。随后建立四个类,主要实现相应的增删改查的业务处理和处理之后的跳转路径返回。

代码如下:

接口Action:

package com.bjpowernode.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {

 public String execute(HttpServletRequest request,HttpServletResponse response)
 throws Exception;
}

增删改查实现类:

添加用户实现类:

package com.bjpowernode.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddUserAction implements Action {

 public String execute(HttpServletRequest request,
 HttpServletResponse response) throws Exception {
 String username=request.getParameter("username");
 UserManager userManager=new UserManager();
 userManager.addUser(username);
 return "/add_success.jsp";
 }

}

删除用户实现类:

package com.bjpowernode.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DelUserAction implements Action {

 public String execute(HttpServletRequest request,
 HttpServletResponse response) throws Exception {
 String username=request.getParameter("username");
 UserManager userManager=new UserManager();
 userManager.delUser(username);
 return "/del_success.jsp";
 }

}

更新用户实现类:

package com.bjpowernode.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ModifyUserAction implements Action {

 @Override
 public String execute(HttpServletRequest request,
 HttpServletResponse response) throws Exception {
 String username=request.getParameter("username");
 UserManager userManager=new UserManager();
 userManager.modifyUser(username);
 return "/modify_success.jsp";
 }

}

查询用户实现类:

package com.bjpowernode.servlet;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class QueryUserAction implements Action {

 @Override
 public String execute(HttpServletRequest request,
 HttpServletResponse response) throws Exception {
 String username=request.getParameter("username");
 UserManager userManager=new UserManager();
 List userList=userManager.queryUser(username);
 request.setAttribute("userList", userList);
 return "/query_success.jsp";
 }

}

TestServlet类重构如下:

package com.bjpowernode.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {

 String requestURI=request.getRequestURI();
 System.out.println("request="+requestURI);
 String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
 System.out.println("path="+path);

 Action action=null;
 if("/servlet/delUser".equals(path)){
 action=new DelUserAction();
 }else if("/servlet/addUser".equals(path)){
 action=new AddUserAction();
 }else if("/servlet/modifyUser".equals(path)){
 action=new ModifyUserAction();
 }else if("/servlet/queryUser".equals(path)){
 action=new QueryUserAction();
 }else{
 throw new RuntimeException("请求失败");
 }
 String forward=null;
 try{
 forward=action.execute(request, response);
 }catch(Exception e){
 e.printStackTrace();
 }
 request.getRequestDispatcher(forward).forward(request, response);
  }
}

运行结果: 

这样TestServlet类虽然没有彻底去掉If-Else,但是这样的代码变得更加简练,利用多肽实现业务逻辑处理和路径跳转返回。职责更加清晰,让维护变得更加轻松。

package com.bjpowernode.servlet; 

import java.io.IOException;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

public class TestServlet extends HttpServlet { 

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException { 

    String requestURI=request.getRequestURI();
    System.out.println("request="+requestURI);
    String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
    System.out.println("path="+path); 

    Action action=null;
    if("/servlet/delUser".equals(path)){
      action=new DelUserAction();
    }else if("/servlet/addUser".equals(path)){
      action=new AddUserAction();
    }else if("/servlet/modifyUser".equals(path)){
      action=new ModifyUserAction();
    }else if("/servlet/queryUser".equals(path)){
      action=new QueryUserAction();
    }else{
      throw new RuntimeException("请求失败");
    }
    String forward=null;
    try{
      forward=action.execute(request, response);
    }catch(Exception e){
      e.printStackTrace();
    }
    request.getRequestDispatcher(forward).forward(request, response);
   }
}

解决字符串问题,当然就要用到配置文件了,用到配置文件就要有用来读取配置文件的相关的类和方法,这里就用dom4j中的类来读取配置文件,这里的配置文件的书写是有点逻辑上的难度的。

我们来看TestServlet中的代码,我们要在这个testservlet中实现读取配置文件和path比较,还有利用多肽实例化相应的实现类,最后通过实例化的实现类的方法来返回跳转路径,最终跳转到相应的页面。

所以我们的配置文件就要不仅配上testservlet中出现的字符串,还要配置相应的Action接口的实现类(我们可以利用反射来实例化该类的对象,进而使用这个类的所有属性和方法),另外还有跳转路径字符串。这样我们的配置文件就变成了如下代码所示:

<?xml version="1.0" encoding="UTF-8"?>
<action-config>
  <action path="/servlet/delUser" type="com.cjq.servlet.DelUserAction">
    <forward name="success">/del_success.jsp</forward>
    <forward name="error">/del_error.jsp</forward>
  </action> 

  <action path="/servlet/addUser" type="com.cjq.servlet.AddUserAction">
    <forward name="success">/add_success.jsp</forward>
    <forward name="error">/add_error.jsp</forward>
  </action> 

  <action path="/servlet/modifyUser" type="com.cjq.servlet.ModifyUserAction">
    <forward name="success">/modify_success.jsp</forward>
    <forward name="error">/modify_error.jsp</forward>
  </action> 

  <action path="/servlet/queryUser" type="com.cjq.servlet.QueryUserAction">
    <forward name="success">/query_success.jsp</forward>
    <forward name="error">/query_error.jsp</forward>
  </action> 

</action-config>

我们有了配置文件之后就要想法通过相关类读取,并且实现相应的功能。所以这里用dom4j来读取完成。其实如果能把这个逻辑捋顺之后就能发现,其实懂我们利用dom4j读取完配置文件的时候,我们是取得的是一个配套的匹配路径字符串、相应业务逻辑类还有处理业务逻辑之后跳转页面路径字符串。这样我们就能直截了当的去掉了if-else。(这里可能逻辑上会出现一些困难,但是看到下面的重构之后的testservlet中的代码和读取配置文件之后的代码就会一目了然)。

现在等待解决的问题就是我们要把从配置文件取得的一整套内容放到那里,当然这是毋庸置疑的要放到类中。所以我们就建立一个ActionMapping类来放我们的那一整套内容。

ActionMapping中的代码如下:

package com.bjpowernode.servlet; 

import java.util.Map; 

public class ActionMapping { 

  private String path; 

  private Object type; 

  private Map forwardMap; 

  public String getPath() {
    return path;
  } 

  public void setPath(String path) {
    this.path = path;
  } 

  public Object getType() {
    return type;
  } 

  public void setType(Object type) {
    this.type = type;
  } 

  public Map getForwardMap() {
    return forwardMap;
  } 

  public void setForwardMap(Map forwardMap) {
    this.forwardMap = forwardMap;
  } 

}

现在ActionMapping类已经有了,剩下的工作就是要利用dom4j来读取配置文件类,具体代码如下:

package com.bjpowernode.servlet; 

import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; 

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; 

public class XmlConfigReader { 

  private static XmlConfigReader instance=new XmlConfigReader(); 

  ActionMapping actionMapping=new ActionMapping(); 

  private Document doc; 

  private Map actionMap=new HashMap(); 

  private XmlConfigReader(){
    try {
      SAXReader reader=new SAXReader(); 

      InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("action_config.xml"); 

      doc=reader.read(in); 

    } catch (DocumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } 

  } 

  public ActionMapping getActionMapping(String path){
    synchronized(this){ 

      Object type=null;
      /*if(action.containsKey(path)){
        type=action.get(path);
      }*/ 

      Element eltAction = (Element)doc.selectObject("//action[@path=\"" + path + "\"]");
      try{
        type=Class.forName(eltAction.attributeValue("type")).newInstance();
      }catch(Exception e){
        e.printStackTrace();
      } 

       Element eltForwards = eltAction.element("forward"); 

        for (Iterator iter = eltForwards.elementIterator(); iter.hasNext();) {
          Element eltForward = (Element) iter.next();
          actionMap.put( eltForward.attributeValue("name"),eltForward.getTextTrim());
        }  

      actionMapping.setPath(path);
      actionMapping.setType(type);
      actionMapping.setForwardMap(actionMap); 

      return actionMapping;
    }
  } 

  public static synchronized XmlConfigReader getInstance(){ 

    return instance;
  } 

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    ActionMapping actionMapping=XmlConfigReader.getInstance().getActionMapping("/servlet/delUser");
    System.out.println(actionMapping.getPath());
    System.out.println(actionMapping.getType());
    System.out.println(actionMapping.getForwardMap().toString());
  } 

}

我们通过返回ActionMapping来动态创建出action相应的实现类,进而完成业务逻辑和页面跳转,重构之后的TestServlet代码如下:

package com.bjpowernode.servlet; 

import java.io.IOException;
import java.util.List; 

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

public class TestServlet extends HttpServlet { 

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException { 

    String requestURI=request.getRequestURI();
    System.out.println("request="+requestURI);
    String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));
    System.out.println("path="+path); 

    String forward="";
    ActionMapping actionMapping=XmlConfigReader.getInstance().getActionMapping(path);
    Action action=(Action)actionMapping.getType();
    try {
      forward=action.execute(request, response);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    request.getRequestDispatcher(forward).forward(request, response);
  } 

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request,response);
  } 

}

我们可以清晰的看到if-else已经没有了,字符串也已经没有了。通过这篇文章对if-else还有字符串问题的解决,又一次重构了testservlet代码,程序相对灵活许多。通过这一次的重构,我们已经看到了struts框架的雏形,

(0)

相关推荐

  • Java中struts2和spring MVC的区别_动力节点Java学院整理

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了. 2.SpringMVC的方法之间基本上独立的,独享request respons

  • Struts1简介和入门_动力节点Java学院整理

    本文为大家分享了Struts1简介和入门的学习资料,供大家参考,具体内容如下 1. 框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法.也就是说框架是一个半成品的应用程序. 我们所面对的应用程序一般都是分为两部分,一部分是业务相关的组件部分,另一部分是和业务无关的组件部分.而我们知道和业务相关的组件部分的重用性是非常低的,这也是显而易见的事情:而和业务无关的组件部分,如验证.异常.程序流程控制等等服务组件的复用性是非常高的.所以当人们在不同的应

  • Struts1教程之ActionMapping_动力节点Java学院整理

    首先断点走出了processpath方法, 这个方法是用来截取字符串的,今天我们来看怎样获得ActionMapping的方法---processMapping. 在此之前简单说一下ActionMapping,它的源代码中可以看出,其中最重要的属性和我们的mvc小实例中的ActionMapping类似,都是有path.type还有forwardMap,主要是对应的struts-config配置文件而来,这个就是保存这个配置文件的信息到内存中. 具体的mvc小实例的ActionMapping代码如下

  • struts1之ActionServlet详解_动力节点Java学院整理

    在web.xml中我们除了配置ActionServlet还配置了一些初始化参数信息,首先我们看第一个config参数,这里配置的是/WEB-INF/struts-config.xml,因为要下面传递一个这样一个配置信息,这个xml文件名是struts1标准的名字,所以这里这个初始化信息完全可以删除,如果不用这个标准名称这里就必须要在这里配置.现在我们配置的是标准名字,所以我们可以删除,这是为什么呢?这里要看ActionServlet源代码才可以. 从图片上我们能看到ActionServlet中已

  • struts1登录示例代码_动力节点Java学院整理

    Struts1框架实例-登录实例: 1.实例开始工作-导入jar包,在官网上下载struts1框架包,解压之后导入工程的: 2.之后配置web.xml(这里的具体配置方法可以参见struts1框架包中的实例文件夹webapps中的实例代码中web.xml文件的配置方法): 具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?> &

  • Struts1之url截取_动力节点Java学院整理

    Struts1之url截取 先我们来对ActionServlet深层次进行分析.我们用断点的调试的方式来看底层源码.因为这个实例是post方式提交,所以将断点设置到doPost方法上. 我们debug运行程序,进入doPost里面的方法: 这个方法非常重要是ActionServlet运行的核心方法. 我们进入这个方法: 再继续进入: 我们赫然发现了这样一个方法就是processPath方法,这个方法就是截取字符串的方法.这个方法的源代码如下: /** * <p>Identify and ret

  • Struts1和struts2的区别_动力节点Java学院整理

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个act

  • struts1之简单mvc示例_动力节点Java学院整理

    先看MVC模式流程图(其实MVC设计模式就是java中的model2.): 就像图上所标识的C层主要是Servlet层控制页面跳转,M层就是具体的业务处理逻辑,而JSP就是所谓的V层.MVC是有别于我们所说的三层,我们平常所说的三层是UI层.BLL层.DAL层,具体的区别如图: 从图上能看出来,JSP和Servlet构成了UI层,而Model层分成了BLL层和DAL层(也就是业务逻辑和数据持久层). 从理论上认清了MVC设计模式之后,下面开始动手敲一个MVC设计模式示例代码: JSP索引页面in

  • Java中的HashSet详解和使用示例_动力节点Java学院整理

    第1部分 HashSet介绍 HashSet 简介 HashSet 是一个没有重复元素的集合. 它是由HashMap实现的,不保证元素的顺序,而且HashSet允许使用 null 元素. HashSet是非同步的.如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步.这通常是通过对自然封装该 set 的对象执行同步操作来完成的.如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来"包装" set.

  • Java Date类常用示例_动力节点Java学院整理

    Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. 1.使用Date类代表当前系统时间 Date d = new Date(); System.out.println(d); 使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下: Sun Ma

  • Java 中的HashMap详解和使用示例_动力节点Java学院整理

    第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

  • Java Calendar类常用示例_动力节点Java学院整理

    Calendar类 从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现.在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用. Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可. 1.使用Calendar类代表当前时间 Calendar c = Calendar.getInstanc

  • ArrayList详解和使用示例_动力节点Java学院整理

    第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口. ArrayList 继承了AbstractList,实现了List.它是一个数组队列,提供了相关的添加.删除.修改.遍历等功能. ArrayList 实现了RandmoAccess接口,即提

  • Spring MVC入门_动力节点Java学院整理

    Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的.另外还有一种基于组件的.事件驱动的Web框架在此就不介绍了,如Tapestry.JSF等. Spring Web MVC也是服务到工作者模式的实现,但进行可优化.前端控制器是DispatcherServl

  • Java中LinkedList详解和使用示例_动力节点Java学院整理

    第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List 接口,能对它进行队列操作. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用. LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆. LinkedList 实现java.io.Serial

随机推荐