1. Cree un nuevo proyecto web y agregue un paquete JAR en el directorio LIB
Paquetes principales de jar: paquete relacionado con Struts2, paquete relacionado con MyBatis3.3, MySQL-Connector-Java-5.1.22-Bin.jar, GSON-2.1.JAR
2. Configure Web.xml, agregue un filtro strutsprepareanDexCuteFilter y maneje todas las solicitudes *.Action;
<? xml versión = "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 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" <Spant-Name> MS </spant-Name> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepeReanDexeCuteFilter </filter-class> </filter> <filter-mapping> <filter-name> struts2 </filtre-name> <Url-Pattern>*. Action </url-Pattern> </filter-mapping> <Welcome-File-List> <Welcome-File> index.jsp </le bienvenido> </bienvenido-fiil-list> </beb-app>
Verifique el código fuente de Dofilter de este filtro y haga lo siguiente:
1. Determine si la URL excluida por los puntales está establecida (Struts.Action.ExCludEpattern, coincidente por la expresión regular). Si existe y la ruta actual cumple con las reglas, la solicitud se reenviará al siguiente objeto en la cadena de filtro y no se entregará a Struts2 para su procesamiento.
if (excluedpatterns! = null && prepare.isurlexCluded (request, excluedpatterns)) {chain.dofilter (solicitud, respuesta);}2. Encuentre ActionMapping: busque a través del método FindActionMapping de Operaciones de preparación. Si no se encuentra, la solicitud se reenviará al siguiente objeto en la cadena de filtro y no se entregará a Struts2 para su procesamiento; Si se encuentra ActionMapping, se llama al método ExecutEaction de las operaciones de ejecución para comenzar a ejecutar Action; La siguiente figura es el caso de encontrar ActionMapping basado en la URL;
3. Configure el archivo Struts.xml. Esta demostración demuestra principalmente la transmisión de datos de formato JSON a la parte delantera, establece el tipo de resultado en formato JSON y, por supuesto, también se puede establecer en otros;
<? xml versión = "1.0" encoding = "utf-8"?> <! DocType Struts public "-// Apache Software Foundation // Dtd Struts Configuration 2.3 // en" "http://struts.apache.org/dtds/struts-2.3.dtdd"> <truts> <ruts name = "struts.devmode" valora " name = "predeterminado" extends = "struts-default, json-default"> <ronsultos global-results> <resultado type = "json"> <param name = "root"> json </mam> <param name = "contentType"> text/html </marr> </sult> </global-results> <cion name = "adduser" método = "adduser" <port <ed product. name = "QueryAlluser" Method = "QueryAlluser"> <resultado>. </resultado> </action> </packack> <!-Agregar paquetes aquí-> </truts>
4. Configurar mybatis.xml y usermapper.xml,
Configurar en caché en caché a verdadero y habilitar el caché de nivel 2;
Configuración de la información relacionada con la fuente de datos: el tipo es un formulario de grupo de conexión agrupada, PoolMaximumActiveconnections tiene el número de conexiones activas (es decir, en uso) en cualquier momento, el valor predeterminado es: 10.
Configurar mapeadores de asignación de clase de entidad // <mapper resource = "ms/model/usermapper.xml"/>
<? xml versión = "1.0" encoding = "utf-8"?> < name = "Cacheenabled" value = "true" /> </etentings> <entornos default = "desarrollo"> <entorno id = "desarrollo"> <transaccionManager type = "jdbc" /> <dataSource type = "agrupado"> <propiedad name = "controlador" value = "com.mysql.jdbc.driver" /> <name de propiedad = "url" "url" "" "" "Url" "" "" "" Url "" "" "" Url "" "" "" "" "Url" "" "" "" "" "" "Url" "" "" value = "jdbc: mysql: // localhost: 3306 /demo" /> <propiedad name = "username" value = "root" /> <propiedad name = "contraseña" valor = "admin" /> <propiedad name = "piscolmaxImumActiveConnections" value = "10" /> <name de propiedad = "accesorable" valor = "verdadero" />> <name de propiedad = "agrupar" valera = "valor" PoolpingQuery "/> </dataSource> </entorno> </boss> <mappers> <mapper resource =" ms/model/usermapper.xml "/> </mappers> </figuration>
Configurar usermapper.xml, configure el caché como ehcache y parámetros relacionados, recuerde que la clase de entidad necesita implementar la interfaz serializable
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtdd >mapper nombrespace =" Usermapper "<!-<!-<!-<!-<!-<!-<s-<s-<s-<s-<s-<!-<!-<!-<!-CACE /> ---> <!-Usando ehcache cache-> <cache type = "org.mybatis.caches.ehcache.loggingehcache"> <propiedad name = "timetoidleseConds" valor = "3600" /> <!-1 hora del intervalo entre la fecha de creación hasta el momento de la expiración-> <name de propiedad = "Tiempo de tiempo" value = "3600"/> <!-1 hora después de que se crea el caché, el tiempo entre la fecha de la última acceso al caché a la hora de vencimiento-> <name de propiedad = "maxentrieslocalheap" value = "1000"/> <propiedad name = "maxentriesLocaldisk" value = "10000000"/> <name de la propiedad = "name de la propiedad =" memorySteeViction "value" valor "lrriesLoCaldisk"////"10000000"/> <name de la propiedad = "name de la propiedad =" Valor "/"/"/"/"/"/"/"/"/<</" name> <"/"/"/"/"/"/"/"/"/<<<<<NeMe Nombre de la propiedad". < U </elect> </s mapper>
5. Código clave
Capa Dao:
Primero, cree una clase para obtener SQLSessionFactory y diseñarla en un patrón de singleton;
paquete ms.dao.base; import java.io.ioException; import org.apache.ibatis.io.resources; import org.apache.ibatis.session.sqlsessionFactory; import org.apache.ibatis.session.sqlsessionFactoryBuilder; import org.apache.log4j.logger; clase pública mysession stataty SQLSessionFactory SessionFactory; Private mySessionFactory () {} public static sincronizado sqlSessionFactory getSqlSessionFactory () {if (sessionFactory == null) {try {sessionFactory = new sqlSessionFactoryBuilder (). Build (recursos.getResourceaseRer ("myBatis-Config.xml")); return sessionFactory; } catch (ioException e) {logger.getLogger (mySessionFactory.class) .Error ("GetSQLSessionFactory Error"); E.PrintStackTrace (); regresar nulo; }} else {return sessionFactory; }}}El siguiente es UserDao, que obtiene SQLSession a través de la Abertura. Tenga en cuenta que el control de la transacción se puede realizar a través de la confirmación y la reversión de SQLSession. Por supuesto, si solo hay una operación SQL, no habrá control de transacción (este ejemplo es solo una demostración);
paquete ms.dao; import java.util.arrayList; import java.util.list; import org.apache.ibatis.session.sqlsession; import ms.dao.base.mysessionFactory; import ss.model.user; usuarios de clase pública {public void add (usuar usuario) lanza una excepción {sqlsession session = session = MySessionFactory.getSqlSessionFactory (). OpenSession (); intente {string statte = "usermapper.saveUser"; session.insert (declaración, usuario); session.commit (verdadero); } catch (excepción e) {session.rollback (true); E.PrintStackTrace (); arrojar una nueva excepción ("Error en el método Agregar"); } finalmente {session.close (); }} Lista pública <ser User> QueryAllUser () lanza la excepción {SQLSession Session = mySessionFactory.getSqlSessionFactory (). OpenSession (); List <Serem> Users = New ArrayList <Serer> (); intente {string statte = "usermapper.queryAlluser"; usuarios = session.selectList (declaración, 1); session.commit (verdadero); } catch (excepción e) {session.rollback (true); E.PrintStackTrace (); arrojar una nueva excepción ("Error en el método de QueryAlluser"); } finalmente {session.close (); } Devuelve usuarios; }} Capa de servicio:
Modelo: No
Capa de acción:
Convertir a los datos de formato JSON y devuélvalos a la parte delantera;
paquete ms.action; import java.io.printwriter; import java.util.list; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import ms.model.user; import ms.service.userService; import org.apache.struts2.servletactionContext; import com.google.gson.gson; public classationAction {logger logger = logger.getLogger (userAction.class); privado UserService UserService = New UserService (); public void addUser () {printWriter out = null; Pruebe {httpservletRequest request = servletactionContext.getRequest (); HttpservletResponse respuesta = servletactionContext.getResponse (); respuesta.setContentType ("text/html; charset = utf-8"); Cuenta de cadena = request.getParameter ("cuenta"); Name de cadena = request.getParameter ("nombre"); Dirección de cadena = request.getParameter ("dirección"); Usuario user = nuevo usuario (); user.setAccount (cuenta); user.setaddress (dirección); user.setName (nombre); UserService.Add (usuario); out = respuesta.getWriter (); out.write (new Gson (). Tojson ("éxito")); } catch (Exception e) {E.PrintStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (new Gson (). TJson ("Fail")); } finalmente {out.flush (); out.close (); }} public void QueryAlluser () {printWriter out = null; intente {httpservletResponse respuesta = servletactionContext.getResponse (); respuesta.setContentType ("text/html; charset = utf-8"); Gson gson = new Gson (); List <Serem> UserList = Userservice.queryAllUser (); Cadena gsonstr = gson.tojson (userList); out = respuesta.getWriter (); out.write (gsonstr); } catch (Exception e) {E.PrintStackTrace (); logger.error (e.getMessage ()); if (out! = null) out.write (new Gson (). TJson ("Fail")); } finalmente {out.flush (); out.close (); }}}Código frontal:
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" " "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> title aquí </title> <style> .mt20 {margen-top: 20px;} </ystye> </head> <body> <div style = "text-align: centro;"> <div> <label> cuenta: </etiqueta> <input id = "cuenta" tipo "type =" text "/> </div> <div> <belebelebel> name: </etiqueta> <put id =" name "type" type = "text"/> </div> <div> <label> la dirección: </selictar> <pinte ID = " type = "text"/> </div> <iv> <button id = "adduser"> agregar </botón> </div> <h3> lista de usuarios: </h3> <ul id = "userList"> </ul> <script type = "text/javascript" src = "js/jquery-1.11.1.1.min.js"> </script> <script> $ (function () () Url: 'Queryalluser.Action', Type: 'Post', DataType: 'Json', Success: Function (Data) {try {for (var i = 0; i <data.length; i ++) {$ ("#uslist"). Append ("<li> <span style = 'color: rojo'> id = "+data [i] .id+" </span>, cuenta = "+data [i] .account+", name = "+data [i] .name+", dirección = "+data [i] .address+" </li> "); }} catch (e) {}; }, error: función (e) {alerta ("error sys"); }}); $("#addUser").on("click", function() { var account = $("#account").val(); var name = $("#name").val(); var address = $("#address").val(); $.ajax({ url : 'addUser.action', type : 'post', dataType : 'json', data : { account : account, name : name, address : address }, éxito: funciones (datos) {try {$ ("#uslist"). Append ("<li> Account ="+Accounting+","+nombre+", dirección ="+dirección+"</li>") }); }); </script> </body> </html>6. Efecto de prueba:
Struts2 funciona normalmente;
Pruebe si el caché secundario está bien y consulta a todos los usuarios;
Primera consulta: Cache perdido, accede a la base de datos:
El segundo y siguiente múltiples consultas, golpes de caché, sin acceso a la base de datos:
@Author un codificador de viento
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.