今天编写了一个Struts2的登陆小例子,没有连接数据库。但是一直有问题。
在struts.xml中的配置是这样的
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <constant name="struts.locale" value="zh_CN"></constant> <constant name="struts.i18n.encoding" value="utf-8"></constant> <package name="helloworld" extends="struts-default"> <action name="helloworldAction" class="com.action.HelloWorldAction"> <result name="toWelcome">/jsp/welcome.jsp</result> </action> <action name="login" class="com.action.LoginAction"> <result name="LOGIN">/jsp/login.jsp</result> </action> </package> </struts>
我的LoginAction
package com.action; import com.opensymphony.xwork2.Action; public class LoginAction implements Action { @Override public String execute() throws Exception { // TODO Auto-generated method stub System.out.println("this is in login acion"); return "LOGIN"; } }
HelloWorldAction代码
package com.action; import com.opensymphony.xwork2.Action; public class HelloWorldAction implements Action { private String account; private String password; private String submitFlag; @Override public String execute() throws Exception { // TODO Auto-generated method stub System.out.println("the username and password is :"+account+" "+password); return "toWelcome"; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSubmitFlag() { return submitFlag; } public void setSubmitFlag(String submitFlag) { this.submitFlag = submitFlag; } }
发现我使用:localhost:8080/StrutsHello/helloworld/login来访问login.jsp但是总是返回404
解决方法
主要的问题还是在struts.xml配置文件里面
1.因为我在WEB-INF下面建立了一个jsp文件夹。struts2中的/WEB-INF目录中的文件对客户端来说不是可以直接访问的,必须通过服务器端的action来实现。如果想直接通过url访问的话,只要把jsp放在WebContent或者WebRoot下就行了。
2.网上一搜发现<package>元素还有一个namespace属性,我们需要设置namespace属性才能访问这个<package>配置里面的action元素。也可以不设置namespace属性,这样就不需要通过namespace来访问。
所以需要设置设置package的namespace属性
<package name="helloworld" namespace="/" extends="struts-default">
使用/作为它的namespace任何请求都可以访问到helloworld这个package里面的action
3.当我发现前面的配置好了,各个action也执行完毕了,但是jsp页面访问不到。
这又是另外一个问题了:原来我在WEB-INF下建立了一个jsp文件夹来装所有的jsp文件,我的result写的目录是这样的
<action name="helloworldAction" class="com.action.HelloWorldAction"> <result name="toWelcome">/jsp/welcome.jsp</result> </action>
在这里需要写上全路径名称并且WEB-INF前面必须加"/"如下所示才可以
<action name="helloworldAction" class="com.action.HelloWorldAction"> <result name="toWelcome">/WEB-INF/jsp/welcome.jsp</result> </action>