SpringMVC 控制器错误
SpringMVC Controller Error
从星期五开始我就一直在修补这个错误,直到现在我仍然没有修复它。我将这个 SpringMVC 项目建立在我去年完成的一项有效的任务之上。并添加了一些新东西。所以我有这个登录页面,我还没有添加安全性。我只是想看看我的 FrontEnd 和 BakcEnd 是否会在我进行事务时满足,例如检查用户是否存在于数据库中,如果存在则将其转发到主页。以下是一些代码片段:
对于TestController.java
@Controller
public class TestController {
@Autowired
private UserService userService;
@RequestMapping(value = "index")
public ModelAndView index(HttpServletRequest request, ModelMap model) {
System.out.println("Index !");
return new ModelAndView("index", "user", new User());
}
@RequestMapping(value = "login", method = RequestMethod.POST)
public ModelAndView login(HttpServletRequest request,
HttpServletResponse res) {
System.out.println("inside login");
String userName = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(userName);
System.out.println(password);
User user = new User();
user.setUsername(userName);
user.setPassword(password);
if (userService.userLogin(user)) {
return new ModelAndView("mainpage");
} else {
return new ModelAndView("index");
}
}
index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page import="javax.servlet.http.HttpSession" %>
<html>
<head>
<title>KSPEAK CMS V1.0</title>
<!-- Bootstrap core CSS -->
<link href="<c:url value='/resources/bootstrap/css/bootstrap.min.css'/>"
rel="stylesheet">
<!-- Custom styles for this template -->
<link href="<c:url value='/resources/bootstrap/css/signin.css'/>"
rel="stylesheet">
<body>
<div class="container">
<form:form class="form-signin" method="POST" action="login" commandName="user" >
<h2 class="form-signin-heading">Please sign in</h2>
<label for="inputUserName" class="sr-only">UserName</label> <form:input
type="text" name="username" class="form-control" path="username"
placeholder="UserName" required="required" autofocus="autofocus"/> <label
for="inputPassword" class="sr-only">Password</label> <form:input
type="password" name="password" class="form-control" path="password"
placeholder="Password" required="required"/>
<input class="btn btn-lg btn-primary btn-block" type="submit" value="login">
</form:form>
</div>
</body>
</head>
</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-a pp_2_5.xsd">
<servlet>
<servlet-name>myBatisServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springConfig.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
我的 SpringConfig.xml(我已经编辑了这部分的一些内容,因为它与 post 的布局混淆,它只是 xmlns 和架构位置)
<mvc:annotation-driven />
<context:component-scan base-package="com.cms.*" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001/" />
<property name="username" value="SA" />
<property name="password" value="" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.cms.model" />
<property name="mapperLocations" value="classpath*:com/cms/mappers/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cms.mappers" />
</bean>
</beans>
当 运行 应用程序。它成功加载 index.jsp 并通过我在控制器上的第一个系统输出。如下图:
假设我输入了一个现有用户,它应该重定向到主页。但这是它的作用的图片
它不符合我在控制器上设置的登录方法。
我到目前为止所做的事情是将 / 添加到用于登录的 @RequestMapping 的值,但仍然出现相同的错误。尝试手动输入登录到 url 栏同样的错误,试图在控制器中创建另一个方法同样的错误。据我所见,它只能识别索引。所以是的,我想我需要一些帮助。按照惯例,我可以上传您需要查看的项目中的任何文件。谢谢。
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
这意味着 spring DispatcherServlet 将被调用匹配模式 *.html 的请求,但是您正在以登录身份向应用程序发送请求,DispatcherServlet 不会处理该请求。
您的问题有两种可能的解决方案
1. Replace *.html with / in <url-pattern>
2. Change you request to match the pattern *.html
只是一个想法:
从中删除 .html
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
索引起作用的原因是您在欢迎文件列表中 index.html
当您使用基础 url(您的网页/)访问应用程序时,它会查看欢迎文件列表,并尝试获取 yourwebpage/index .html,你有一个 "index" 和 url 模式 *.html 的请求映射,它给出了 index.html 和登录requestmapping 将变为 login.html
所以如果你离开 *.html url 模式,你的 urls 将是 @RequestMapping 的 value 属性
+ .html
如果删除 .html 它们将只是 @RequestMapping
的 value 属性
我建议尝试下面的方法。
您正在 index.jsp
中使用 commandName="user"
,它有两个属性 username
和 password
。
根据您的 JSP,在您的服务器端进行以下更改。
1 你应该有一个 java class User.java 与你的 index.jsp
中的路径具有相同的属性
class User{
private username; // name must match path in your form inside index.jsp
private password;
//getter && setter
}
2 然后将此对象作为参数传递到您的登录方法中,
@RequestMapping(value = "login", method = RequestMethod.POST)
public ModelAndView login( @ModelAttribute User user) {
// do your stuff
}
从星期五开始我就一直在修补这个错误,直到现在我仍然没有修复它。我将这个 SpringMVC 项目建立在我去年完成的一项有效的任务之上。并添加了一些新东西。所以我有这个登录页面,我还没有添加安全性。我只是想看看我的 FrontEnd 和 BakcEnd 是否会在我进行事务时满足,例如检查用户是否存在于数据库中,如果存在则将其转发到主页。以下是一些代码片段:
对于TestController.java
@Controller
public class TestController {
@Autowired
private UserService userService;
@RequestMapping(value = "index")
public ModelAndView index(HttpServletRequest request, ModelMap model) {
System.out.println("Index !");
return new ModelAndView("index", "user", new User());
}
@RequestMapping(value = "login", method = RequestMethod.POST)
public ModelAndView login(HttpServletRequest request,
HttpServletResponse res) {
System.out.println("inside login");
String userName = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(userName);
System.out.println(password);
User user = new User();
user.setUsername(userName);
user.setPassword(password);
if (userService.userLogin(user)) {
return new ModelAndView("mainpage");
} else {
return new ModelAndView("index");
}
}
index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page import="javax.servlet.http.HttpSession" %>
<html>
<head>
<title>KSPEAK CMS V1.0</title>
<!-- Bootstrap core CSS -->
<link href="<c:url value='/resources/bootstrap/css/bootstrap.min.css'/>"
rel="stylesheet">
<!-- Custom styles for this template -->
<link href="<c:url value='/resources/bootstrap/css/signin.css'/>"
rel="stylesheet">
<body>
<div class="container">
<form:form class="form-signin" method="POST" action="login" commandName="user" >
<h2 class="form-signin-heading">Please sign in</h2>
<label for="inputUserName" class="sr-only">UserName</label> <form:input
type="text" name="username" class="form-control" path="username"
placeholder="UserName" required="required" autofocus="autofocus"/> <label
for="inputPassword" class="sr-only">Password</label> <form:input
type="password" name="password" class="form-control" path="password"
placeholder="Password" required="required"/>
<input class="btn btn-lg btn-primary btn-block" type="submit" value="login">
</form:form>
</div>
</body>
</head>
</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-a pp_2_5.xsd">
<servlet>
<servlet-name>myBatisServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springConfig.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
我的 SpringConfig.xml(我已经编辑了这部分的一些内容,因为它与 post 的布局混淆,它只是 xmlns 和架构位置)
<mvc:annotation-driven />
<context:component-scan base-package="com.cms.*" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001/" />
<property name="username" value="SA" />
<property name="password" value="" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.cms.model" />
<property name="mapperLocations" value="classpath*:com/cms/mappers/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cms.mappers" />
</bean>
</beans>
当 运行 应用程序。它成功加载 index.jsp 并通过我在控制器上的第一个系统输出。如下图:
假设我输入了一个现有用户,它应该重定向到主页。但这是它的作用的图片
它不符合我在控制器上设置的登录方法。
我到目前为止所做的事情是将 / 添加到用于登录的 @RequestMapping 的值,但仍然出现相同的错误。尝试手动输入登录到 url 栏同样的错误,试图在控制器中创建另一个方法同样的错误。据我所见,它只能识别索引。所以是的,我想我需要一些帮助。按照惯例,我可以上传您需要查看的项目中的任何文件。谢谢。
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
这意味着 spring DispatcherServlet 将被调用匹配模式 *.html 的请求,但是您正在以登录身份向应用程序发送请求,DispatcherServlet 不会处理该请求。
您的问题有两种可能的解决方案
1. Replace *.html with / in <url-pattern>
2. Change you request to match the pattern *.html
只是一个想法:
从中删除 .html
<servlet-mapping>
<servlet-name>myBatisServlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
索引起作用的原因是您在欢迎文件列表中 index.html 当您使用基础 url(您的网页/)访问应用程序时,它会查看欢迎文件列表,并尝试获取 yourwebpage/index .html,你有一个 "index" 和 url 模式 *.html 的请求映射,它给出了 index.html 和登录requestmapping 将变为 login.html
所以如果你离开 *.html url 模式,你的 urls 将是 @RequestMapping 的 value 属性 + .html
如果删除 .html 它们将只是 @RequestMapping
的 value 属性我建议尝试下面的方法。
您正在 index.jsp
中使用 commandName="user"
,它有两个属性 username
和 password
。
根据您的 JSP,在您的服务器端进行以下更改。
1 你应该有一个 java class User.java 与你的 index.jsp
中的路径具有相同的属性class User{
private username; // name must match path in your form inside index.jsp
private password;
//getter && setter
}
2 然后将此对象作为参数传递到您的登录方法中,
@RequestMapping(value = "login", method = RequestMethod.POST)
public ModelAndView login( @ModelAttribute User user) {
// do your stuff
}