JSP中${pageContext.request.contextPath}是什么意思?
在JSP中,${pageContext.request.contextPath}
是一种获取当前应用的上下文路径的方式。
详细解释一下,pageContext
是JSP的内置对象,可以获取和设置页面的许多属性,包括作用域、请求参数、服务器的路径等。其中的request
就是用来获取http请求的对象。
在request
对象中,contextPath
就是获取当前应用的上下文路径,也就是你的WEB应用在服务器上面的部署位置。例如你的应用部署在Tomcat的webapps目录下,名叫MyApp,那么contextPath
就是/MyApp
。
这个在编写相对路径资源的url时非常有用,比如指向CSS、JS、图片等文件的路径,或者在重定向(redirect)的url。使用contextPath
能够保证无论应用在什么地方部署,路径都可以准确无误。
举个例子,如果你的web应用名为 "MyApp" 并且你正在访问的URL是 http://localhost:8080/MyApp/index.jsp
,那么 ${pageContext.request.contextPath}
的值就会是 "/MyApp"。
创建数据库
CREATE TABLE smmbuildk;
-- 注意逗号必须是英文的
CREATE TABLE books (
Id int(10) PRIMARY KEY,
bookName VARCHAR(100),
bookCounts INT(11),
detail VARCHAR(200)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO books(Id,bookName,bookCounts,detail) VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySql',20,'从删库到跑路'),
(3,'Linux',15,'从进门到进牢');
Maven所需依赖
1.依赖:junit,数据库驱动,数据库连接池,servlet,jsp,mybatis,spring,mybatis-spring
<dependencies>
<!-- spring相关的包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- mql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- jstl表达式的依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- 表达式需要依赖的标签-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--Mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--Spring操作数据库的话,还需要啊一个spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!--spring整合Mybatis的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
2.静态资源导出
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
编写配置文件
1.Spring的核心配置文件:application-Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
2.Mybatis的核心配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--XML 配置文件中包含了对 MyBatis 系统的核心设置-->
<configuration>
<!--Mybatis原本要配置数据源的,但是和Spring整合后,这件事情交给spring去做了 -->
</configuration>
编写业务
1.编写实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
int Id;
String bookName;
int bookCounts;
String detail;
}
2.编写Mapper接口
public interface BookMapper {
//增加一本书
int addBook(Book book);
//删除一本书
int deleteBookByID(int Id);
//更新一本书
int updateBook(Book book);
//根据名字查一本书
Book queryBookByname(@Param("bookName") String name);
//查询所有书籍
List<Book> queryAllBooks();
}
3.编写Mapper.xml文件
<!--namespace=一个绑定的Dao/Mapper接口-->
<mapper namespace="com.kuanghui.mapper.BookMapper">
<insert id="addBook" parameterType="book">
insert into ssm.book(Id, bookName, bookCounts, detail)
VALUES (#{Id},#{bookName},#{bookCounts},#{detail});
</insert>
<delete id="deleteBookByID" parameterType="int">
delete from ssm.book where Id=#{Id}
</delete>
<update id="updateBook" parameterType="book">
update ssm.book
set bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}
where Id=#{Id};
</update>
<select id="queryBookByname" parameterType="string" resultType="book">
select * from ssm.book where bookName=#{bookName};
</select>
<select id="queryAllBooks" resultType="book">
select * from ssm.book;
</select>
</mapper>
4.编写service接口
public interface BookService {
//增加一本书
int addBook(Book book);
//删除一本书
int deleteBookByID(int Id);
//更新一本书
int updateBook(Book book);
//根据名字查一本书
Book queryBookByname(@Param("bookName") String name);
//查询所有书籍
List<Book> queryAllBooks();
}
5.编写service实现类
@Service
public class BookServiceImpl implements BookService{
//因为Service层调Dao层:组合Dao层
@Autowired
BookMapper bookMapper;
public void setBookMapper(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
@Override
public int addBook(Book book) {
return bookMapper.addBook(book);
}
@Override
public int deleteBookByID(int Id) {
return bookMapper.deleteBookByID(Id);
}
@Override
public int updateBook(Book book) {
return bookMapper.updateBook(book);
}
@Override
public Book queryBookByname(String name) {
return bookMapper.queryBookByname(name);
}
@Override
public List<Book> queryAllBooks() {
return bookMapper.queryAllBooks();
}
}
6.数据库配置文件 db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ssm
username=root
password=123456
7.整合Spring-mybatis.xml(整合spring-dao)
mybatis.config文件
<!--XML 配置文件中包含了对 MyBatis 系统的核心设置-->
<configuration>
<!--Mybatis原本要配置数据源的,但是和Spring整合后,这件事情交给spring去做了 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.kuanghui.pojo"/>
</typeAliases>
<mappers>
<package name="com.kuanghui.mapper"/>
</mappers>
</configuration>
spring-mybatis.xml,在此文件中扫描mapper
<!--1.关联数据库配置文件
local-override="true"用于Access denied for user 'Lenovo'@'localhost' (using password: YES)报错-->
<context:property-placeholder location="classpath:database.properties" local-override="true"/>
<!--2.连接池
bbcp:半自动化操作,不能自动连接
c3p0:自动化操作(自动化的加载配置文件,并且可以自动自动设置到对象中)
druid:
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="user" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<!--3.sqlSessionFactory-->
<!--sqlSessionFactory这个bean替换MybatisUtil里的sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--绑定MyBatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--4.之前是通过实现BookMapperImpl去实现,注入SqlsessionTemplate或者继承SqlSessionDaoSupport
现在配置dao扫描包,动态实现了Dao接口可以注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--也可以使用sqlSessionTemplateBeanName,同理,具体看MapperScannerConfigurer方法和属性、
sqlSessionFactoryBeanName内传入的值为String,所以使用value-->
<!--注入sqlSessionFactory-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--要扫描的包-->
<property name="basePackage" value="com.kuanghui.mapper"/>
</bean>
</beans>
7.整合Spring-service 因为service中有事务
<!--1.扫描service下的包-->
<context:component-scan base-package="com.kuanghui.service"/>
<!--2.将所有的业务类注入到Spring中,可以通过配置,或者注解实现-->
<bean id="bookServiceImpl" class="com.kuanghui.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!--3.声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源 -->
<property name="dataSource" ref="dataSource"/>
</bean>
8.编写web.xml文件
<!--1.DispatcherServlet是SpringMVC的核心;请求分发器,前端控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要绑定Spring的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--不能使用Spring-mvc.xml的原因是不能调到spring-service.xml层的bean-->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--启动级别为1,因为当系统一启动的时候,就会有些请求会被处理 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
在SpringMVC中
/:只匹配所有的请求,不会去匹配jsp页面
/*:匹配所有的请求,包括jsp页面
-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--2.乱码过滤-->
<!--配置SpringMVC的乱码过滤器 -->
<filter>
<filter-name>encodingfilter</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>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
9.整合SpringMVC,即spring-controller
<!--1.扫描包:自动扫描包,让指定包下的注解生效-->
<context:component-scan base-package="com.kuanghui.controller"/>
<!--2.静态资源过滤:让SpringMVC不处理静态资源 .css .js等 -->
<mvc:default-servlet-handler/>
<!-- 3.注解驱动 HandlerMapping和HandlerAdapter的注入-->
<mvc:annotation-driven/>
<!--4.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
10.整合Spring-dao,Spring-service,Spring-controller
<import resource="spring-mybatis.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
10.编写Controller层
@Controller
@RequestMapping("/book1")
public class BookController {
//controller调service
@Autowired
@Qualifier("bookServiceImpl")
private BookService bookService;
//查询所有的书籍
@RequestMapping("/allBook")
public String list(Model model){
model.addAttribute("list",bookService.queryAllBooks());
return "allbook";
}
//跳转到增加书籍页面
@RequestMapping("/toaddBook")
public String toadd(Model model){
return "toaddBook";
}
//增加书籍
@RequestMapping("/addBook")
public String add(Book book){
Random random=new Random();
book.setId(random.nextInt(10000));
System.out.println("==>"+book);
bookService.addBook(book);
return "redirect:/book1/allBook";
}
//跳转到修改书籍页面
@RequestMapping("/tomodifyBook")
public String tomodify(String bookName,Model model){
Book book = bookService.queryBookByname(bookName);
System.out.println(book);
model.addAttribute("book",book);
return "tomodifyBook";
}
//修改书籍
@RequestMapping("/modifyBook")
public String modify(Book book){
Book b1=bookService.queryBookByname(book.getBookName());
book.setId(b1.getId());
System.out.println("===>modify:"+book);
int i = bookService.updateBook(book);
return "redirect:/book1/allBook";
}
//删除书籍
@RequestMapping("/deleteBook")
public String delete(String bookName){
Book book=bookService.queryBookByname(bookName);
System.out.println("===>modify:"+book);
int i = bookService.deleteBookByID(book.getId());
return "redirect:/book1/allBook";
}
//查询书籍
//查询所有的书籍
@RequestMapping("/queryBook")
public String queryBook(String queryBookname,Model model){
System.out.println(queryBookname);
Book book;
List<Book> list=new ArrayList<>();
if(queryBookname!=null&&queryBookname!=""){
book = bookService.queryBookByname(queryBookname);
list.add(book);
System.out.println("==>query:"+book);
}else {
list = bookService.queryAllBooks();
}
model.addAttribute("list",list);
return "allbook";
}
}
排错思路
问题:bean不存在
1.查看这个bean是否注入成功
2.Junit单元测试,查看我们代码是否可以查询出业务
3.如果步骤2成功,那么问题一定不在底层,是spring出了问题!
4.SpringMVC整合的时候没调用到Service层的bean,查看web.xml中servlet绑定的文件