一、struts入门

一、struts运行原理

 

ActionServlet: 总控制器,只需配置,不需编写。(在web.xml中配置struts-config.xml的位置信息,以及对哪些请求进行处理等)

表单(form): 总控制器在处理请求时,会查询struts-config.xml,将用户提交的数据填充到对应的表单中去,表单实际上是一个javaBean,用户提交哪些数据,它都有应该有对应的成员属性去存储(通过set和get方法)

Action: 用来处理请求,在struts-config.xml中有表单和Action的对应关系

struts-config.xml: 记录表单和Action的详细信息,以及它们之间的对应关系

 

1.浏览器(含登录表单<form action=”xxx.do”>)发出http登录请求。

2.解析主机名(查询hostsDNS获得主机对应ip)

3.开始连接web服务器

4.通过http协议发送request请求(GET/myWeb/ABC)web服务器上。

5.web服务器查询web.xml之后将请求转发给ActionServlet(web.xml中配置了让ActionServlet处理xxx.do的请求)

6.ActionServlet查询struts-config.xml把用户提交的数据填充到对应表单(ActionForm)中。

7.ActionServlet查询struts-config.xml调用指定的actionaction从对应的ActionForm获取数据。

8.action调用处理函数,并将执行结果返回给ActionServlet(总控制器)ActionServlet查询struts-config.xml,根据不同的结果,跳转到不同的界面。

9.返回静态页面给web服务器,web服务器以http回应的形式返回给浏览器。

 

二、入门案例

1.创建web项目StrutsLogin,并引入struts开发包

2.WEB-INF下编写login.jsp(jsp里用户表单含Name和password),并将首页面设为自动跳转到login.jsp(jsp:forward)

<form action="login.do" method="post">
        u:<input type="text" name="name"><br/>
        p:<input type="password" name="password"><br/>
        <input type="submit" value="提交">
    </form>

 

3.在包com.forms下编写UserForm.java(继承ActionForm)login.jspform里的name需对应ActionForm里属性的setget方法、本质上是一个javaBean

 

package com.forms;

import org.apache.struts.action.ActionForm;

public class UserForm extends ActionForm {
    private String name;
    private String password;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}

 

4.在包com.actions下编写LoginAction.java(继承自Action)、并重写其中的execute方法(这个方法是用来处理业务逻辑,会被自动调用)

package com.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.forms.UserForm;

public class LoginAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // TODO Auto-generated method stub
        UserForm userForm=(UserForm)form;
        
        if(userForm.getName().equals("1")&&userForm.getPassword().equals("1")){
            return mapping.findForward("ok");
        }
        else{
            return mapping.findForward("err");
        }
    }
}

5.在WEB-INF下编写struts-config.xml文件,该文件用于配置actionactionForm的对应关系,以及跳转的配置。

 

<struts-config>
    <!-- 配置表单 -->
    <form-beans>
        <!-- name是表单名字,可以随便写,一般ActionForm名小写 -->
        <form-bean name="userForm" type="com.forms.UserForm"></form-bean>
    </form-beans>
    <!-- 配置action -->
    <action-mappings>
        <!-- path表示将来访问该action的资源名,可以随意取,/login就表示它是代表为login.doaction
-->
        <!-- attribute表示后面scope设置的key值,默认就是表单名小写-->
        <!-- name与表单name相同,即将action与Actionform关联 -->
        <!-- attribute="userForm" scope="request"相当于request.setAttribute("userForm",userForm) -->
        <!--attribute="userForm" scope="session"相当于session.setAttribute("userForm",userForm) -->
        <action path="/login" attribute="userForm" name="userForm" scope="request" type="com.actions.LoginAction">
            <!-- 这里配置跳转关系,action处理之后会返回一个结果,如果返回ok,就跳转到ok.jsp,如果返回err就跳转到err.jsp -->
            <forward name="ok" path="/WEB-INF/ok.jsp"></forward>
            <forward name="err" path="/WEB-INF/err.jsp"></forward>
        </action>
    </action-mappings>
</struts-config>

 

6.在WEB-INF下新建ok.jsp和err.jsp,并编写一些内容以标识LoginAction的处理结果

7.web.xml下配置ActionServlet(servlet的配置),并使能够读取到struts-config.xml

 

<servlet>
        <!-- 配置actionServlet -->
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <!-- 配置struts-config.xml -->
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <!-- 让jsp发出的.do请求经过actionServlet-->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

 

7.浏览http://localhost:8080/StrutsLogin,如果输入用户名和密码都为1,则跳到ok.jsp,否则跳转到err.jsp

 

 

 

三、运行思路

1.用户在login.jsp提交了用户名和密码(namepassword),提交给login.do

2.连接到web服务器之后,web.xml查询到相应的servlet去处理它。我们配置的ActionServlet又是处理*.do的,所以交给ActionServlet处理。

3.通过web.xml的配置找到ActionServlet类的路径。

4.找到ActionServlet,发现ActionServlet的处理方法是根据找到web.xml下的param-nameconfig的文件进行处理,找得是名为struts-config.xml且在WEB-INF目录下。找到后,ActionServlet便会一直使用此找得的文件,直到下次找不到文件,才会重写寻找param-nameconfig的文件。

5.查询struts-config.xml知道,login.do的交给com.actions.LoginAction处理,而且对应表单是userForm,再根据struts-config.xml的配置找到userForm的路径是com.forms.UserForm

6.填充数据,找到userForm调用userForm里的setNamesetPassword,将用户提交的数据填入。

7.找到LoginAction,执行里面的处理方法--execute,此时的userForm已经作为参数传入了,此时在execute里执行相应处理,处理完返回对应的ActionForward(给ActionServlet)。

8.ActionServlet再查询到LoginAction的配置,根据不同的ActionForward决定跳转到哪个页面。

 

四、乱码处理。

我们在loginAction中处理乱码是没有效果的,因为在调用loginAction之前,用户数据已经被填充到userForm中了。

所以在struts中处理乱码必须使用过滤器。我们在web服务器和ActionServlet之间加入过滤器。

我们在com.myz.filters下创建一个servlet并实现javax.servlet.Filter接口。

实现dofilter方法:

 

arg0.setCharacterEncoding("utf-8");//设置接收编码
        arg1.setCharacterEncoding("utf-8");//设置回应编码
        arg2.doFilter(arg0, arg1);//必须写这句话,否则过滤后将不会往下走

 

配置filter:

<filter>
         <filter-name>MyFilter1</filter-name>
         <filter-class>com.myz.filters.MyFilter1</filter-class>
     </filter>

    <filter-mapping>
        <filter-name>MyFilter1</filter-name>
        <!-- 表示针对所有的都过滤 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

五、struts的好处和坏处

程序更加规范化

程序开发的效率提高了

程序的可读性增加

程序的可维护性增加了

 

Form表单有点鸡肋

Action是单态(对网站并发性的处理有影响)

(单态:在整个程序的运行过程中,始终是一个对象)

 

六、注意

1.Struts-config.xml的位置可以随意,但是需要在web.xml下重新配置。

2.一个项目中可以有多个struts配置文件,在web.xml配置时用逗号隔开即可。

3.增加数据库验证:

com.myz.domain下创建User类,该类是javaBean,主要是方便UserDao的传参等。

其实不创建该类,使用UserForm也是可以的

 

com.myz.service下创建DBDAOUserDAO,DBDAO用于连接数据库,UserDAO用于操作数据库(loginCheck)

 

loginAction中根据传入UserForm的数据调用loginCheck方法,进行验证。

 

 

 

转载于:https://www.cnblogs.com/myz666/p/8419445.html

、准备工作及实例 3 1.解压struts-2.1.6-all.zip 3 2.六个基本包 3 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何使用alt+/提示 4 6.实例 4 7.开启struts2自带的开发模式常量 6 8.vo传参模式 7 9.ModerDriven传参模式(不建议采用) 7 10.为什么要使用struts2代替struts1.x 7 二、struts.xml配置及例程 7 1.配置文件的优先级 7 2.配置形式 8 3.package配置相关 8 4.分工合作include:指定多个配置文件 10 5.tomcat认证访问 10 6.初识拦截器 11 7.Action中的method属性 12 8.使用ForwardAction实现页面屏蔽。 13 8.使用default-Action配置统访问 14 小结Action 14 9.使用通配符 14 10.使用0配置:ZERO Annotation 15 11.Result配置详解 15 探讨type类型: 16 Type类型值 16 作用说明 16 对应类 16 chain 16 用来处理Action链 16 com.opensymphony.xwork2.ActionChainResult 16 dispatcher 16 用来转向页面,通常处理JSP 16 org.apache.struts2.dispatcher.ServletDispatcherResult 16 redirect 16 重定向到个URL 16 org.apache.struts2.dispatcher.ServletRedirectResult 16 redirectAction 16 重定向到个Action 16 org.apache.struts2.dispatcher.ServletActionRedirectResult 16 plainText 16 显示源文件内容,如文件源码 16 org.apache.struts2.dispatcher.PlainTextResult 16 freemarker 16 处理FreeMarker模板 16 org.apache.struts2.views.freemarker.FreemarkerResult 16 httpheader 16 控制特殊http行为的结果类型 16 org.apache.struts2.dispatcher.HttpHeaderResult 16 stream 16 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。 16 org.apache.struts2.dispatcher.StreamResult 16 velocity 16 处理Velocity模板 16 org.apache.struts2.dispatcher.VelocityResult 16 xslt 16 处理XML/XLST模板 16 org.apache.struts2.views.xslt.XSLTResult 16 全局result: 17 动态Result:了解 18 12.异常处理 18 三、在Action获取Scope对象 19 方式、与Servlet解耦合的非IOC方式 20 方式二、与Servlet解耦合的IOC方式 21 方式三、与Servlet耦合的非IOC方式 21 方式四、与Servlet耦合的IOC方式 22 四、OGNL与ValueStack(VS) 22 1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10.获取Stack Context中的信息 26 11.总结$ # %的区别 27 12.总结OGNL[重点] 27 五、拦截器 28 1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait拦截器 33 5.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值