我正在尝试使用spring MVC构建一个简单的应用程序来创建和更新少量记录。但由于我面临的问题是我的弹簧形式标签有一些错误而且我无法弄清楚,因此无法继续进行。错误说:
java.lang.IllegalStateException:找不到WebApplicationContext:不在DispatcherServlet请求中而没有注册ContextLoaderListener?
几乎没有疑问:
为什么在使用dispatcherServlet时需要ContextLoaderListener。
每个DispatcherServlet都有自己的或实例化的WebApplicationContext。那么为什么错误说它不可用?
我在遗传,概念或程序上缺少什么?
Welcome.jsp中
<html>
<body>
<h2>Welcome to the ADStore Portal</h2>
<a href="WEB-INF/views/addEmp.jsp">Add Employee</a><br>
<!-- <a href="updateEmployee.jsp">Update Employee</a> -->
</body>
</html>
addEmp.jsp
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Add Employee</h1>
<form:form action = "/add" modelAttribute = "employee">
<table>
<tr>
<td>Name :</td>
<td><form:input path="empname"/>
</tr>
<tr>
<td>Id :</td>
<td><form:input path="empid"/>
</tr>
<tr>
<td>Designation :</td>
<td><form:input path="designation"/>
</tr>
<tr>
<td>Department :</td>
<td><form:input path="department"/>
</tr>
<tr>
<td><input type="submit" name="Submit"/></td>
</tr>
</table>
</form:form>
</body>
</html>
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>AD Store</display-name>
<servlet>
<servlet-name>adstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>adstore</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
adstore-servlet.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<mvc:annotation-driven/>
<context:annotation-config/>
<context:component-scan base-package="com.adstore" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
EmployeeController.java
package com.adstore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.adstore.bean.Employee;
import com.adstore.dao.EmployeeDAO;
@Controller
public class EmployeeController {
private EmployeeDAO dao;
@RequestMapping(value="/add")
public ModelAndView saveEmployee(@ModelAttribute("employee") Employee emp) {
System.out.println("In saveEmployee");
dao.saveEmp(emp);
return new ModelAndView("viewEmployee","command",new Employee());
}
}
EmployeeDAO.java
package com.adstore.dao;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCallback;
import com.adstore.bean.Employee;
public class EmployeeDAO {
private JdbcTemplate jdbcTemplate;
public boolean saveEmp(final Employee emp) {
boolean result = false;
String query = "INSERT INTO ADSTORE VALUES(?,?,?,?)";
result = jdbcTemplate.execute(query, new PreparedStatementCallback<Boolean>() {
public Boolean doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
ps.setString(1, emp.getEmpName());
ps.setInt(2, emp.getEmpId());
ps.setString(3, emp.getDesignation());
ps.setString(4, emp.getDepartment());
return ps.execute();
}
});
return result;
}
}
错误图片::
答案 0 :(得分:0)
找不到应用程序上下文,因为当您直接访问JSP页面时,DispatcherServlet不会处理该请求。因此,没有必要的Spring基础结构来处理表单:表单标记。
您应该使用@Controller中使用@RequestMapping或其变体定义的url来访问该页面。将JSP页面放在一个使客户端可以直接访问的位置是不好的做法。相反,您应该将它们隐藏在/ WEB-INF /目录
中根据您的视图解析器,jsp页面应位于/ WEB-INF / views文件夹中。将JSP移动到此文件夹。
答案 1 :(得分:0)
您需要在web.xml中添加以下代码
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>/WEB-INF/views/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-security.xml //if you need
/WEB-INF/adstore-servlet.xml
</param-value>
</context-param>
关于你的怀疑 -
1-如果要将Servlet文件放在自定义名称或自定义位置,而不是默认命名约定[servletname] -servlet.xml和Web-INF /下的路径,则可以使用ContextLoaderListener。 / p>
基本上,您可以使用ContextLoaderListner隔离根应用程序上下文和Web应用程序上下文。
使用上下文参数映射的配置文件将表现为根应用程序上下文配置。与调度程序servlet映射的配置文件将表现得像Web应用程序上下文。
在任何Web应用程序中,我们可能有多个调度程序servlet,因此有多个Web应用程序上下文。
但是在任何Web应用程序中,我们可能只有一个与所有Web应用程序上下文共享的根应用程序上下文。
我们应该在根应用程序上下文中定义我们的公共服务,实体等。控制器,拦截器等都在相关的Web应用程序环境中。
以获取更多信息 - 博客“Purpose of ContextLoaderListener – Spring MVC”给出了非常好的解释。
答案 2 :(得分:0)