题目:
SSH基本CRUD练习:
图书管理
图书列表 -> 某本图书详情
图书删除
图书新建
图书属性:书名 作者 出版社 出版年份 简介 类别
完成方法:采用注解+纯java的配置 数据库:H2
一.导入包:
h2数据库包+hibernate包+spring包+springmvc+日志包+整合包+bootstrap(前端框架)包
二.配置web.xml:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 用哪种容器类 -->
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<!-- 入口配置 -->
<param-name>contextConfigLocation</param-name>
<!-- 纯java配置,加载替代spring.xml的类 会自动获取-->
<param-value>config.AppConfig</param-value>
<!-- <param-value>lianxi.text.AppConfig</param-value> -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码配置-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三.搭建包:
四.配置的java类AppConfig详解:
1.该类相当于spring.xml的配置:
2.注释详解:
@Configuration //==Beans
@ComponentScan("lianxi") //扫描注解 @Component
@PropertySource("classpath:db.properties")//引入外部文件,数据库驱动等的配置
@EnableTransactionManagement //开启spring事务管理
@EnableWebMvc //加载静态资源
//继承WebMvcConfigurerAdapter才能调用静态资源
public class AppConfig extends WebMvcConfigurerAdapter{
//配置连接SessionFactory
@Bean
public LocalSessionFactoryBean sessionfactory(DataSource dataSource){
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
//自动扫描注册user,数据库自动建表
factory.setPackagesToScan("lianxi.domian");
return factory;
}
//配置数据源
@Bean // 依赖Environment
public DataSource dataSource(Environment env) {
DriverManagerDataSource ds = new DriverManagerDataSource();
// env.getProperty("someKey") 获得属性值
ds.setDriverClassName(env.getProperty("jdbc.driverClassName"));
ds.setUrl(env.getProperty("jdbc.url"));
ds.setUsername(env.getProperty("jdbc.username"));
ds.setPassword(env.getProperty("jdbc.password"));
return ds;
}
//事务管理器 事务加在service层,@Transactional注解
@Bean
public PlatformTransactionManager ma(SessionFactory sessionfactory){
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionfactory);
return transactionManager;
}
//视图解析器
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver view = new InternalResourceViewResolver();
view.setViewClass(JstlView.class);
view.setPrefix("/WEB-INF/jsp/");
view.setSuffix(".jsp");
return view;
}
//加载静态资源的配置 css和js
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// /assets/css/app.css -> /WebContent/public/css/app.css
// /assets/js/app.js -> /WebContent/public/js/app.js
// /WebContent/public/
registry.addResourceHandler("/assets/**").addResourceLocations("/public/");
}
}
五.控制类的详解:
@Controller
public class BookServlet {
@Autowired //自动注入
private BookService bookservice;
//日期转换
@InitBinder
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
@RequestMapping(method = RequestMethod.POST,value="/addbook")
public String addBook(Book book){
bookservice.addBook(book);
return "success";
}
@RequestMapping(value="/findbooks")
public String findBooks(Model model){
List<Book> queryBook = bookservice.queryBook();
for(Book book:queryBook){
System.out.println(book);
}
model.addAttribute("allbooks", queryBook);
return "showbook";
}
@RequestMapping(value="/findbookbyname")
public String findBookByName(Model model,@RequestParam("name") String bookname){
System.out.println("bookname"+bookname);
Book queryBook = bookservice.queryByName(bookname);
System.out.println(queryBook);
model.addAttribute("queryBook", queryBook);
return "bookdetails";
}
}
六.bootstrap 前端框架的简单应用:
1.下载:http://www.bootcss.com/
2.拷贝到项目中:
3.引用它的form和css.
配置类AppConfig的配置:
(1)@EnableWebMvc //加载静态资源
(2)//继承WebMvcConfigurerAdapter
public class AppConfig extends WebMvcConfigurerAdapter{}
(3)
//加载静态资源的配置 css和js
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// /assets/css/app.css -> /WebContent/public/css/app.css
// /assets/js/app.js -> /WebContent/public/js/app.js
// /WebContent/public/
registry.addResourceHandler("/assets/**").addResourceLocations("/public/");
}
(4)jsp页面中配置:
引用项目下导入的bootstrap文件的css
<link rel="stylesheet"
href="${contextPath}/assets/bootstrap/css/bootstrap.css">
form前端的代码:https://v3.bootcss.com/css/#forms
<form action="${pageContext.request.contextPath}/addbook" method="post">
<div class="form-group">
<label for="author">作者:</label> <input
type="text" class="author" id="author"
placeholder="author" name="author">
</div>
<div class="form-group">
<label for="bookname">书名:</label> <input
type="text" class="form-control" id="bookname"
placeholder="bookname" name="bookname">
</div>
<div class="form-group">
<label for="chubanshe">出版社:</label> <input
type="text" class="form-control" id="chubanshe"
placeholder="chubanshe" name="chubanshe">
</div>
<div class="form-group">
<label for="chubandate">出版时间:</label> <input
type="text" class="form-control" id="chubandate"
placeholder="chubandate" name="chubandate">
</div>
<div class="form-group">
<label for="info">简介:</label> <input
type="text" class="form-control" id="info"
placeholder="info" name="info">
</div>
<div class="form-group">
<label for="booktype"> 类别:</label> <input
type="text" class="form-control" id="booktype"
placeholder="booktype" name="booktype">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
七.总结:
1.web.xml 很容易配错:当换成另一个注解类时,要修改web.xml的入口配置
<init-param>
<!-- 入口配置 -->
<param-name>contextConfigLocation</param-name>
<!-- 纯java配置,加载替代spring.xml的类 会自动获取-->
<param-value>config.AppConfig</param-value>
<!-- <param-value>lianxi.text.AppConfig</param-value> -->
</init-param>
2.实体类自动扫描创建表:factory.setPackagesToScan(“lianxi.domian”);容易忘记写
@Bean
public LocalSessionFactoryBean sessionfactory(DataSource dataSource){
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
//自动扫描注册user,数据库自动建表
factory.setPackagesToScan("lianxi.domian");
return factory;
}
3.数据库的方言和自动创建表配置文件(src目录下):
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.hbm2ddl.auto=create
4.进入h2数据库:cmd 包所在目录 -java -jar h2-1.4.190.jar (选择server)
5.清晰思路,mvc各层之间的调用