zoukankan      html  css  js  c++  java
  • Spring4 In Action-5.2.3-Spring Web应用程序-向页面输出列表、接收参数、接收表单

    源代码链接:http://download.csdn.net/download/poiuy1991719/10117665

    本代码是基于数据库表的操作,所以请先建立数据库表

    1、建立Bean对象

    package spittr;
    
    import java.util.Date;
    
    import org.apache.commons.lang3.builder.EqualsBuilder;
    import org.apache.commons.lang3.builder.HashCodeBuilder;
    /**
     * 博客信息
     */
    public class Spittle {
    
      private final Long id;
      private final String message;
      private final Date time;
      private Double latitude;
      private Double longitude;
    
      public Spittle(String message, Date time) {
        this(null, message, time, null, null);
      }
      
      public Spittle(Long id, String message, Date time, Double longitude, Double latitude) {
        this.id = id;
        this.message = message;
        this.time = time;
        this.longitude = longitude;
        this.latitude = latitude;
      }
    
      public long getId() {
        return id;
      }
    
      public String getMessage() {
        return message;
      }
    
      public Date getTime() {
        return time;
      }
      
      public Double getLongitude() {
        return longitude;
      }
      
      public Double getLatitude() {
        return latitude;
      }
      
      @Override
      public boolean equals(Object that) {
        return EqualsBuilder.reflectionEquals(this, that, "id", "time");
      }
      
      @Override
      public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this, "id", "time");
      }
      
    }

    2、编写Web配置类:

    package spittr.config;
    
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    import spittr.web.WebConfig;
    
    /***
     * 容器会找到AbstractAnnotationConfigDispatcherServletInitializer这个类(包括这个类的扩展)
     * 然后用这个类来配置Servlet上下文
     */
    public class SpitterWebInitializer extends
            AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        protected Class<?>[] getRootConfigClasses() {//非Web组件,带有@Configuration注解的类用来定义应用上下文
            return new Class<?>[] { RootConfig.class };
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {//指定配置类,带有@Configuration注解的类用来定义应用上下文
            return new Class<?>[] { WebConfig.class };
        }
    
        @Override
        protected String[] getServletMappings() {// 将DispatcherServlet映射到"/"
            return new String[] { "/" };
        }
    
    }

    3、Web配置类中,用到WebConfig类:

    package spittr.web;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.ViewResolver;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    /***
     * 配置web
     */
    @Configuration //配置类,需要的注解
    @EnableWebMvc  //启用Spring MVC
    @ComponentScan("spittr.web")  //启用组件扫描,就会扫描到控制器
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    	@Bean
    	public ViewResolver viewResolver() {//配置JSP视图解析器
    		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    		resolver.setPrefix("/WEB-INF/views/");//在请求路径前,加入资源路径
    		resolver.setSuffix(".jsp");//在请求路径后,加入资源名称,比如/WEB-INF/views/home.jsp
    		resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
    		return resolver;
    	}
    
    	@Override
    	public void configureDefaultServletHandling(  //处理静态资源
    			DefaultServletHandlerConfigurer configurer) {
    		configurer.enable();
    	}
    
    	@Override
    	public void addResourceHandlers(ResourceHandlerRegistry registry) {
    		super.addResourceHandlers(registry);
    	}
    
    }
    

      

    4、Web配置类用到Root类,用来加载其它组件:

    package spittr.config;
    
    import java.util.regex.Pattern;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.context.annotation.Import;
    import org.springframework.core.type.filter.RegexPatternTypeFilter;
    
    import spittr.config.RootConfig.WebPackage;
    
    /***
     * 引入数据库配置类 自动扫描spittr包,以及子包
     */
    @Configuration  // 配置类,需要的注解
    @Import(DataConfig.class)
    @ComponentScan(basePackages = { "spittr" }, excludeFilters = { @Filter(type = FilterType.CUSTOM, value = WebPackage.class) })
    public class RootConfig {
    	public static class WebPackage extends RegexPatternTypeFilter {
    		public WebPackage() {
    			super(Pattern.compile("spittr\.web"));
    		}
    	}
    }
    

      

    5、Root类中加载了数据库链接类:

    package spittr.config;
    
    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.core.JdbcOperations;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    
    @Configuration
    public class DataConfig {
    
    	@Bean
    	public DataSource dataSource() {
    		DriverManagerDataSource dataSource = new DriverManagerDataSource();
    		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    		dataSource.setUrl("jdbc:mysql:///spittle");
    		dataSource.setUsername("root");
    		dataSource.setPassword("root");
    		
    		return dataSource;
    	}
    
    	@Bean
    	public JdbcOperations jdbcTemplate(DataSource dataSource) {
    		return new JdbcTemplate(dataSource);
    	}
    
    }
    

      

    6、数据操作接口、数据操作接口实现:

    package spittr.data;
    
    import java.util.List;
    
    import spittr.Spittle;
    
    public interface SpittleRepository {
    
      List<Spittle> findRecentSpittles();
    
      List<Spittle> findSpittles(long max, int count);
      
      Spittle findOne(long id);
    
      void save(Spittle spittle);
    
    }
    

      

    package spittr.data;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcOperations;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    import spittr.Spittle;
    
    @Repository  //将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
    public class JdbcSpittleRepository implements SpittleRepository {
    
    	private JdbcOperations jdbc;
    
    	@Autowired
    	public JdbcSpittleRepository(JdbcOperations jdbc) {
    		this.jdbc = jdbc;
    	}
    
    	public List<Spittle> findRecentSpittles() {
    		List<Spittle> spittleList=jdbc.query("select id, message, created_at, latitude, longitude"
    				+ " from Spittle" + " order by created_at desc limit 20",
    				new SpittleRowMapper());
    
    //		System.out.println("---findRecentSpittles被调用---返回List列表:"+spittleList);
    		return spittleList;
    	}
    
    	public List<Spittle> findSpittles(long max, int count) {
    		List<Spittle> spittleList=jdbc.query("select id, message, created_at, latitude, longitude"
    				+ " from Spittle" + " where id < ?"
    				+ " order by created_at desc limit 20", new SpittleRowMapper(),
    				max);
    
    //		System.out.println("---findSpittles被调用---返回List列表:"+spittleList);
    		return spittleList;
    	}
    
    	public Spittle findOne(long id) {
    		Spittle spittle=jdbc.queryForObject(
    				"select id, message, created_at, latitude, longitude"
    						+ " from Spittle" + " where id = ?",
    				new SpittleRowMapper(), id);
    
    //		System.out.println("---findOne被调用---返回Spittle对象:"+spittle.getMessage());
    		return spittle;
    	}
    
    	public void save(Spittle spittle) {
    //		System.out.println("---save被调用---Spittle对象:"+spittle.getMessage());
    		
    		jdbc.update(
    				"insert into Spittle (message, created_at, latitude, longitude)"
    						+ " values (?, ?, ?, ?)", spittle.getMessage(),
    				spittle.getTime(), spittle.getLatitude(),
    				spittle.getLongitude());
    	}
    
    	private static class SpittleRowMapper implements RowMapper<Spittle> {
    		public Spittle mapRow(ResultSet rs, int rowNum) throws SQLException {
    			return new Spittle(rs.getLong("id"), rs.getString("message"),
    					rs.getDate("created_at"), rs.getDouble("longitude"),
    					rs.getDouble("latitude"));
    		}
    	}
    
    }
    

      

    7、编写添加数据的表单类:

    package spittr.web.spittle;
    
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    /**
     * 页面表单对应模型
     */
    public class SpittleForm {
    
      @NotNull
      @Size(min=1, max=140)
      private String message;
      
      @Min(-180)
      @Max(180)
      private Double longitude;
      
      @Min(-90)
      @Max(90)
      private Double latitude;
      
      public String getMessage() {
        return message;
      }
    
      public void setMessage(String message) {
        this.message = message;
      }
      
      public Double getLongitude() {
        return longitude;
      }
    
      public void setLongitude(Double longitude) {
        this.longitude = longitude;
      }
    
      public Double getLatitude() {
        return latitude;
      }
    
      public void setLatitude(Double latitude) {
        this.latitude = latitude;
      }
    }
    

      

    8、编写控制类,实现页面数据接收、页面跳转等

    package spittr.web.spittle;
    
    import java.util.Date;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import spittr.Spittle;
    import spittr.data.SpittleRepository;
    
    @Controller
    public class SpittleController {
    
    	private static final String MAX_LONG_AS_STRING = "9223372036854775807";
    
    	private SpittleRepository spittleRepository;
    
    	@Autowired
    	public SpittleController(SpittleRepository spittleRepository) {
    		this.spittleRepository = spittleRepository;
    	}
    
    	/**
    	 * 页面输出列表
    	 * @param max
    	 * @param count
    	 * @param model
    	 * @return
    	 * http://localhost:8080/SpringInAction5_2_3/spittles
    	 */
    	@RequestMapping(value = "/spittles", method = RequestMethod.GET)
    	public String spittles(
    			@RequestParam(value = "max", defaultValue = MAX_LONG_AS_STRING) long max,
    			@RequestParam(value = "count", defaultValue = "20") int count,
    			Model model) {
    		model.addAttribute("sp_list1", spittleRepository.findSpittles(max, count));//页面通过sp_list1取得列表
    		System.out.println("-------------------------输出列表");
    		return "spittles";
    	}
    
    	/**
    	 * 接收页面一个参数,
    	 * 输出一条数据
    	 * @param spittleId
    	 * @param model
    	 * @return
    	 * http://localhost:8080/SpringInAction5_2_3/spittles/3
    	 */
    	@RequestMapping(value = "/spittle/{spittleId}", method = RequestMethod.GET)
    	public String spittle(@PathVariable("spittleId") long spittleId, Model model) {
    		model.addAttribute(spittleRepository.findOne(spittleId));
    		System.out.println("-------------------------输出单个");
    		return "spittle_show";
    	}
    
    	/**
    	 * 进入添加页面
    	 * @return
    	 */
    	@RequestMapping(value = "/spittle/spittleadd",method = RequestMethod.GET)
    	public String spittleAdd(){
    		return "spittle_add";
    	}
    	
    	/**
    	 * 添加一条数据
    	 * @param form
    	 * @param model
    	 * @return
    	 * @throws Exception
    	 * http://localhost:8080/SpringInAction5_2_3/spittle/spittleadd
    	 */
    	@RequestMapping(value = "/spittle/spittleadd", method = RequestMethod.POST)
    	public String saveSpittle(SpittleForm form, Model model) throws Exception {
    		spittleRepository.save(new Spittle(null, form.getMessage(), new Date(), form.getLongitude(), form.getLatitude()));
    		System.out.println("-------------------------添加列表");
    		return "spittle_add";
    	}
    
    }
    

      

  • 相关阅读:
    消息队列(一)
    Servlet3.1学习(三)
    再弄一片文章凑个4篇文章的数,主要是用于XML和 Binary序列化和反序列化的类
    Entity Framework底层操作封装(3)
    Entity Framework底层操作封装(2)
    Entity Framework底层操作封装(1)
    实现合并区间
    socket简单案例实现
    PostgreSQL11.2数据恢复记录(From Physical Files)
    Spring Data JPA 与 MyBatis 对比分析
  • 原文地址:https://www.cnblogs.com/zjsy/p/7831740.html
Copyright © 2011-2022 走看看