1. 程式人生 > >Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單

Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單

pla data prot template ack bin 通過 final span

源代碼鏈接: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";
	}

}

  

Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單