- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 Spring MVC 4/hibernate 4 和 Web flow 2.4 以及 Java 配置来构建应用程序。我使用 JUnits 构建和测试了服务和 daos,但在向应用程序添加 WebFlow 组件时却一无所获。
我将 Controller 与 CoreContextConfiguration 一起移动到核心包中,但没有找到任何地方。 LoginController 在 WEB-INF/flows 中有一个相应的 login.jsp 和一个 login-flow.xml我更喜欢 Spring Webflow 处理 Controller ,并且我可以根据需要显示更多配置代码。我知道我错过了一些东西,并且可以用新的眼光来看待这个问题。
@EnableWebMvc//added
@Configuration
@Import({
ServiceConfiguration.class,
FlowConfiguration.class,
WebMVCConfiguration.class,
DAOConfiguration.class
})
@ComponentScan("org.tigersndragons.salonbooks.model")
public class CoreContextConfiguration {
INFO: Server startup in 12640 ms
Jun 02, 2014 3:14:43 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/salonbooks/login] in DispatcherServlet with name 'salonbooks'
我在尝试从
访问应用程序时收到上述错误localhost:8080/salonbooks/login
如果我显式地将 LoginController 导入到 CoreConfiguration,我会得到
javax.servlet.ServletException: No adapter for handler [org.tigersndragons.salonbooks.core.LoginController@20bd9af4]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler
下面是 Controller 片段
--更新为从配置中删除 Controller
@Controller
public class LoginController extends AbstractController{
@Autowired
LoginActionFlows loginActionFlows;
@RequestMapping(value="/login", method=RequestMethod.GET)
public String showLogin(Model model){
model.addAttribute("employee", new Employee());
return "login";//new ModelAndView("index","employee", model);
}
@RequestMapping(value="/", method=RequestMethod.GET)
public String index(Model model){
return showLogin( model);//new ModelAndView("index","employee", model);
}
web.xml 看起来像
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>SalonBooks</display-name>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>org.tigersndragons.salonbooks.core.CoreContextConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>salonbooks</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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>salonbooks</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
--
流程配置
@Configuration
public class FlowConfiguration extends AbstractFlowConfiguration{
@Autowired
WebMVCConfiguration webMVCConfiguration;
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(flowRegistry())
.build();
}
@Bean
public FlowController flowController (){
FlowController flowController = new FlowController();
flowController.setFlowExecutor(flowExecutor());
flowController.setFlowHandlerAdapter(webMVCConfiguration.flowHandlerAdapter());
return flowController;
}
//updated flowRegistry to specify the specific flow files
@Bean
public FlowDefinitionRegistry flowRegistry() {
return getFlowDefinitionRegistryBuilder(flowBuilderServices())
//.setBasePath("/WEB-INF/flows")
//.addFlowLocationPattern("/**/*-flow.xml")
.addFlowLocation("/WEB-INF/flows/login-flow.xml","login")
.addFlowLocation("/WEB-INF/flows/home/home-flow.xml","home")
.addFlowLocation("/WEB-INF/flows/person/person-flow.xml","person")
.addFlowLocation("/WEB-INF/flows/appointment/appointment-flow.xml","appointment")
.addFlowLocation("/WEB-INF/flows/order/order-flow.xml","order")
.build();
}
@Bean
public FlowBuilderServices flowBuilderServices() {
return getFlowBuilderServicesBuilder()
.setViewFactoryCreator(mvcViewFactoryCreator())
.setValidator(validator())
.setDevelopmentMode(true)
.build();
}
@Bean
public MvcViewFactoryCreator mvcViewFactoryCreator() {
MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
factoryCreator.setDefaultViewSuffix(".jsp");
factoryCreator.setViewResolvers(Arrays.<ViewResolver>asList(webMVCConfiguration.viewResolver()));
factoryCreator.setUseSpringBeanBinding(true);
return factoryCreator;
}
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
WebMVC配置
@Configuration
public class WebMVCConfiguration extends WebMvcConfigurerAdapter {
@Autowired
private FlowConfiguration webFlowConfig;
/* updated this by commenting out
@Bean
public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping(){
ControllerClassNameHandlerMapping mapping = new ControllerClassNameHandlerMapping();
mapping.setPathPrefix("/flows");
return mapping;
}
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/", "classpath:/META-INF/web-resources/");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// updated this method to do nothing
// registry.addViewController("/");
// registry.addViewController("/login");
// registry.addViewController("/home");
// registry.addViewController("/person");
}
@Bean
public FlowHandlerMapping flowHandlerMapping() {
FlowHandlerMapping handlerMapping = new FlowHandlerMapping();
handlerMapping.setOrder(-1);
handlerMapping.setFlowRegistry(webFlowConfig.flowRegistry());
return handlerMapping;
}
@Bean
public FlowHandlerAdapter flowHandlerAdapter() {
FlowHandlerAdapter handlerAdapter = new FlowHandlerAdapter();
handlerAdapter.setFlowExecutor(webFlowConfig.flowExecutor());
handlerAdapter.setSaveOutputToFlashScopeOnRedirect(true);
return handlerAdapter;
}
@Bean
public SalonFlowHandler SalonFlowHandler() {
return new SalonFlowHandler();
}
/*added urlMappings*/
@Bean
public SimpleUrlHandlerMapping urlMappings(){
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
Properties urlProperties = new Properties();
urlProperties.put("/*", webFlowConfig.flowController());
urlProperties.put("/login", webFlowConfig.flowController());
urlProperties.put("/home", webFlowConfig.flowController());
urlProperties.put("/person", webFlowConfig.flowController());
urlProperties.put("/appointment", webFlowConfig.flowController());
urlProperties.put("/order", webFlowConfig.flowController());
simpleUrlHandlerMapping.setMappings(urlProperties);
simpleUrlHandlerMapping.setAlwaysUseFullPath(true);
return simpleUrlHandlerMapping;
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/flows/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
登录.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<head>
<meta charset="utf-8">
<title>Welcome to SalonBooks</title>
</head>
<body>
<div>Welcome to SalonBooks!!</div>
<form:form id="login" model="loginActionFlows"
action="${flowExecutionUrl}" >
<input type="hidden" name ="_flowExecutionKey"
value="${flowExecutionKey}" />
User: <br/><form:input type="text" path="username" /><br/>
Passcode: <br/><form:input type="password" path="password"/><br/>
<input name="_eventId_doLogin" type="submit" value="Login"/> |
<input type="button" name="_eventId_cancel" value="Cancel" />
</form:form>
</body>
</html>
login-flow.xml 已更新以指定 View 和模型
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"
start-state="login">
<var name="loginActionFlows" class="org.tigersndragons.salonbooks.model.flows.LoginActionFlows"/>
<view-state id="login" view="login" model="loginActionFlows">
<transition on="doLogin" to="verifylogin" />
<transition on="cancel" to="done" />
</view-state>
<action-state id="verifylogin">
<evaluate result ="employee" expression="loginActionFlows.checkEmployee(requestParameters.username, requestParameters.password)"/>
<transition to ="home" />
</action-state>
<subflow-state id="home" subflow="home-flow">
<transition to="finish" />
</subflow-state>
<end-state id="finish"/>
</flow>
现在,这只是生成login.jsp 的干/文本再现,而不是呈现为html。所以它似乎开始了流程,但渲染丢失了。
最佳答案
我怀疑 WebMVCConfiguration 中的 ControllerClassNameHandlerMapping 方法。
ControllerClassNameHandlerMapping获取类名,删除“Controller”后缀(如果存在)并返回剩余文本,小写并带有前导“/”。
对于 LoginController,URL 路径映射将解析为“/login*”。
pathPrefix 指定要添加到从 Controller 名称生成的路径前面的前缀。
因此,当您在 ControllerClassNameHandlerMapping 中将 pathPrefix 指定为“/WEB-INF/flows/”时,对于 LoginController - URL 路径映射将解析为“/WEB-INF/flows/login*”。您还有 FlowController,其 URL 路径映射将解析为“/WEB-INF/flows/flow*”。
这些都不匹配您正在调用的网址:localhost:8080/salonbooks/login
将路径前缀更改为“/flows”。并尝试 localhost:8080/salonbooks/flows/login/login 调用 LoginController 中的 showLogin 方法。
关于java - DispatcherServlet noHandlerFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24002842/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!