目录
login.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form>中前两个typeField和password框会自动生成tr td标签。
theme主题类似于样式style,如果不加会报错
Servlet.service() for servlet [jsp] in context with path [/7_24] threw exception [/login.jsp (line: 16, column: 29) Unterminated <s:submit tag] with root cause
在show.jsp中显示信息的两种方法,第二种需要在jsp前部添加关于s的配置。
world:${pname};
hello:<s:property value="pname"/>
dafault.properties修改
在default.properties中修改默认的后缀名,的位置在web app Library中strut2-core-2.3.14.ja下org.apache.struts2。
struts.i18n.encoding=UTF-8
国际化编码,针对post提交,默认编码
struts.action.extension=action,,
85行 可以修改扩展名,拷出key,在structs.xml中添加constant,name为key,value为自定义。
响应顺序:先从default框架本身读取,后读struts.xml,最后为web.xml。
<constant name="struts.devMode" value="true" />开发模式
让页面报出500,注释掉以下代码:
<!-- <global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings> -->
在value中true改为fasle后,可以显示正常500页面。
package包的使用
package用于分类文件,区别相同名的类,可以有多个package,每个模块建立一个包,每一个Servlet用一个package标签。
<package name="default" namespace="/person" extends="struts-default">
<default-action-ref name="personAction" />
<!-- <global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings> -->
<action name="personAction" class="com.demo.Action.PersonAction">
<result>show.jsp</result>
<result name="input" type="redirect">login.jsp</result>
</action>
</package>
namespace为命名空间
正常情况下的servlet中需要使用不同的url必须得在链接前面加上文件夹的目录才可以找到Servlet url,虚拟路径来匹配页面的路径。
将jsp文件加入到person后,需要在struts.xml中的action标签中添加正确路径。每一个调用jsp的方法中都得要调用一次person目录很麻烦。
此处show.jsp和login.jsp必须在进入person包目录中才能显示。Tomcat登录时需再加一层person路径。编写以下代码即可:
<package name="default" namespace="/person" extends="struts-default">
登录路径:
extends=“struts-default”
extends="struts-default"
很关键的代码,这个包中很重要。
拦截器的主要代码,多个形成拦截栈。
一般把这里声明为抽象的话就不再使用action了。
include file
<include file="example.xml"/>
用法和作用:多个研发地点负责模块不同,模块不同使xml多次修改十分麻烦,这个include是可在struts.xml添加多个xml文件,用于书写不同package的内容。struts.xml只留下常量链接和下面的include。附加文件放在src目录下并且只有相同链接地址和package包中的内容。我这里将struts.xml中package内容放入example.xml,并将include file链接写入struts.xml,同时文件中保留常量。
default-acion-ref
example.xml中 默认的action引用
<default-action-ref name="personAction" />
作用:当工程运行时只想发访问person目录下即localhost:8080/7_24/person/时,将name中的index调整为当前的Action链接地址。不添加路径的时候想要访问哪个就填哪个。
global-results
<global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
两个global为一组,只要出现异常,就会映射给error,error会对应给error.jsp。
error中的文件不能直接显示,由保密性安全性,只能通过自动跳转来实现。
struts2中返回的结果有哪些?
struts-default.xml中的result type标签中有列举。支持多视图中的type设置不同的类型。
在我们使用Struts2框架时,涉及到jsp的页面跳转,不要转发,尽量用重定向。
struts2接收页面传值的方法
有三种:
1,值模型:直接在action中写属性,即将模型Bean中的内容写在控制跳转的Action.java类中。不推荐。
2,域模型:单独建立一个Bean,在Action中声明Bean类。相比第一种代码较为整洁。
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
在新建Person类之后,需要将jsp中所有获取到的参数加上person.,因为在Action中实例化了Person类,但是jsp获取数据是从personAction中拿,jsp得不到值,为空指针,需要加上person.pname。
<s:form action="personAction!login" method="post">
<s:textfield name="pname" label="用户名"></s:textfield>
<s:password name="pwd" label="密码"></s:password>
<tr>
<td colspan="2"><s:submit theme="simple" value="提交">
</s:submit> <s:reset theme="simple" value="重置"></s:reset>
<td>
<tr>
</s:form>
3,模型驱动:让Action类实现ModelDriven接口,添加泛型person,在person中实例化person类,重写getModel方法,返回person对象。推荐第三种方法。
public class PersonAction extends ActionSupport implements ModelDriven<Person>
Person person=new Person();
@Override
public Person getModel() {
// TODO Auto-generated method stub
return person;
}
实现登录和注册页面跳转区分页面修改Action方法:
public String login() throws Exception {
System.out.println("login");
String path=null;
if("tom".equals(person.getPname())&&"123".equals(person.getPwd())) {
path=SUCCESS;
}else {
path=INPUT;
}
return path;
}
修改常量中属性value为true。
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
修改jsp中的地址链接后加入登录和注册的区分。传值分别为login和reg,传哪个值调用那个方法。不能保留execute方法。
<s:form action="personAction!login" method="post">
<s:form action="personAction!reg" method="post">
效果:
地址为reg时,进入了reg的action。
public String reg() throws Exception {
System.out.println("reg");
String path=null;
if("tom".equals(person.getPname())&&"123".equals(person.getPwd())) {
path=SUCCESS;
queryAll();
}else {
path=INPUT;
}
return path;
}
public String queryAll() throws Exception {
System.out.println("queryAll");
String path=null;
if("tom".equals(person.getPname())&&"123".equals(person.getPwd())) {
path=SUCCESS;
}else {
path=INPUT;
}
return path;
}
一种传值方式为!,另一个方式为_,
但这种方法不推荐。还是直接!传值。