Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單
阿新 • • 發佈:2017-11-14
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 finalLong 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應用程序-向頁面輸出列表、接收參數、接收表單